Timer
介绍
ESP32芯片包含两个硬件定时器组。 每组有两个通用硬件定时器。 它们都是基于16位预分频器和64位自动重载功能的向上/向下计数器的64位通用定时器。
功能概述
以下各节介绍了配置操作计时器的典型步骤:
- 定时器初始化 - 应设置哪些参数以使定时器工作以及根据设置提供的具体功能。
- 定时器控制 - 如何读取定时器的值,暂停/启动定时器,以及如何操作。
- 警报 - 设置和使用警报。
- 中断 - 如何启用和使用中断。
定时器初始化
使用timer_group_t
识别ESP32的两个计时器组。 使用timer_idx_t
标识组中的各个计时器。 这两组每个都有两个定时器,总共提供四个定时器供我们处理。
在启动计时器之前,应该通过调用timer_init()
来初始化它。 应该为此函数提供结构timer_config_t
,以定义计时器应如何操作。 特别是可以设置以下计时器的参数:
- 分频器:计时器的计数器“滴答作响”的速度有多快。 这取决于分频器的设置,它将用作输入的80 MHz APB_CLK时钟的除数。
- 模式:如果计数器正在递增或递减,则使用
counter_dir
通过从timer_count_dir_t
中选择一个值来定义。 - 计数器启用:如果计数器已启用,则在调用
timer_init()
后它将立即开始递增/递减。 通过从timer_start_t
中选择一个vales,使用counter_en
设置此操作。 - 报警启用:由
alarm_en
的设置决定。 - 自动重新加载:计数器是否应在计时器的警报上自动重新加载特定的初始值,或者继续递增或递减。
- 中断类型:定时器报警是否触发中断。 设置
timer_intr_mode_t
中定义的值。
要获取计时器设置的当前值,请使用函数timer_get_config()
。
定时器控制
一旦配置并启用了计时器,它就已经“滴答作响”了。 要检查它的当前值,请调用timer_get_counter_value()
或timer_get_counter_time_sec()
。 要将计时器设置为特定的起始值,请调用timer_set_counter_value()
。
可以通过调用timer_pause()
随时暂停计时器。 要再次启动它,请调用timer_start()
。
要更改定时器的运行方式,可以再次调用Timer_init()
,如Timer Initialization部分所述。 另一种选择是使用专用功能来更改个别设置:
- 分频器值 -
timer_set_divider()
。 注意:更改分频器时应暂停定时器以避免不可预测的结果。 如果定时器已在运行,timer_set_divider()
将首先暂停定时器,更改分频器,最后再次启动定时器。 - 模式(计数器是递增还是递减) -
timer_set_counter_mode()
- 报警时自动重载计数器 -
timer_set_auto_reload()
警报
要设置警报,请调用函数timer_set_alarm_value()
,然后使用timer_set_alarm()
启用它。 当调用timer_init()
时,也可以在定时器初始化阶段启用警报。
启用警报并且计时器达到警报值后,根据配置,可能会发生以下两种操作:
- 如果先前已配置,将触发中断。 请参见中断如何配置中断一节。
- 启用
auto_reload
后,将重新加载计时器的计数器以从特定的初始值开始计数。 应使用timer_set_counter_value()
预先设置要启动的值。
- 如果设置了警报值并且计时器已经超过该值,则将立即触发警报。
- 触发后,警报将自动禁用,需要重新启动以再次触发。
要检查已设置的警报值,请调用timer_get_alarm_value()
。
中断
为特定定时器组和定时器注册中断处理程序是通过调用timer_isr_register()
来完成的。
要为定时器组启用中断,请调用timer_group_intr_enable()
。 要为特定计时器执行此操作,请调用timer_enable_intr()
。 使用相应的函数timer_group_intr_disable()
和timer_disable_intr()
来禁用中断。
在ISR中处理中断时,需要明确清除中断。 为此,请设置定义的TIMERGN.int_clr_timers.tM
结构在 soc/esp32/include/soc/timer_group_struct.h里,其中N是定时器组号[0,1],M是定时器号[0,1]。 例如,要清除定时器组0中定时器1的中断,请调用以下命令:
TIMERG0.int_clr_timers.t1 = 1
请参阅下面的应用示例如何使用中断。
应用示例
64位硬件计时器示例:peripherals/timer_group.