ESP32 学习笔记(十)Timer

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.

API Reference

Header File

猜你喜欢

转载自blog.csdn.net/qq_27114397/article/details/81636607