Hempl/计时器
AT32UC3A 具有三个 16 位倒计时计时器,可以以三种不同的频率运行,彼此独立。当它们设置为以高频率运行时,计时精度更高,但最长的可能延迟更短。
只有一小部分时钟频率可用,这些频率从 16.5MHz 的 PBA 总线频率下降。
除数 | 时钟频率 | 最长延迟 |
---|---|---|
PBA/2 | 8.25 MHz | 7.94 毫秒 |
PBA/8 | 2.0625 MHz | 31.77 毫秒 |
PBA/32 | 515.625 kHz | 0.127 秒 |
PBA/128 | 128.906 kHz | 0.508 秒 |
除了这四种选择之外,芯片还提供从外部 32768Hz 实时精度晶体运行任何计时器的功能。从 1.3.2 版本开始的 Mizar32 板有该组件 (X2) 的空间,可以在其中安装。
Hempl 提供了一个 timer
库来访问实时计数器。
可以使用计时器 ID 0
和 1
直接访问前两个硬件计时器。Hempl 使用 16.5MHz 的 PBA 频率,默认情况下,时钟速率设置为最低可用频率 128906Hz,计时精度约为百万分之一秒,最大延迟略高于半秒。
可以使用第一个计时器实现等待十分之一秒的方法如下:
(tmr-delay 0 100000)
这些可用于实现高精度短延迟。
对于前两个计时器中的任何一个,您可以设置比默认的 129kHz 更高的时钟速率。但是,如上表所示,仅支持四个值,其中 PBA 频率 = 16.5MHz。其他值将设置算术上最接近的可用频率。
以下示例将计时器 1 设置为最高可能的计时精度,最大延迟为 7.94 毫秒:
(prinl (tmr-setclock 1 10000000) )
上面的代码将 8250000
作为输出打印。
无法直接访问第三个硬件计时器,而是使用它来生成四个“虚拟计时器”,它们的计时器 ID 为 tmr-virt-0
到 tmr-virt-3
。这些具有较低的滴答频率和精度——每秒十次——但可用于创建最长 35 分钟的整数 eLua 或 142 年的浮点 eLua 延迟。
(tmr-delay tmr-virt-0 5000000) # Wait for five seconds
这些用于实现较低精度的较长延迟,但无法更改虚拟计时器的时钟速率。
从 20120123 固件版本开始,存在第三种计时器机制,即系统计时器 tmr.SYS_TIMER
,其精度为百万分之一秒,可用于提供高达 35 分钟的整数 Lua 和高达 142 年的浮点 Lua 高精度延迟和计时,但您无法更改系统计时器的时钟频率,并且它不能用于生成中断(见下文)。
所有三种计时器都可用于使您的程序等待指定的时间,如上面的示例所示。延迟的精度和可用的最大延迟取决于使用的计时器类型。通常,系统计时器最适合所有类型的延迟,因为它具有高精度并且可以执行长时间延迟。
有时,了解自某个先前时刻起经过了多少时间可能很有用,例如,测量代码的速度,或者当您需要在经过一定时间后做出某些决策,但还需要在等待时执行其他操作时。
此示例通过在控制台中打印“Go!”来测量人们的反应时间,然后查看他们需要多长时间才能按下键以进行响应。我们将为此使用系统计时器。
当然,如果您在它说 Go!之前按下 Enter,它会说您的反应非常快。
在 PicoLisp 中
# A reaction timer in picolisp (de reaction-timer () (prinl "Welcome to the reaction timer. When I say Go!, enter a character.") (prinl "Press q [Enter] to quit.") (setq timer *tmr-sys-timer* answer "" ) (until (=T answer) (println "Ready?") # Wait for a random time from 2 to 5 seconds (tmr-delay timer (+ 2000000 (rand 1 3000000))) (println "Go!") (setq start-time (tmr-read timer) answer (read) # wait for them to enter any character end-time (tmr-read timer) )
请注意:您也可以从我们在 github 上的示例存储库中下载上面的代码 reaction.l
。
请注意:目前 PicoLisp 不支持中断处理。请参见 问题 #12。
- Atmel AT32UC3A 数据手册 第 31 章:计时器/计数器 (TC),eLua 参考手册中的 tmr 模块
- eLua 参考手册中的虚拟计时器.