芯片:esp32s3
开发环境:espidfv4.4
一、官网相关资料
1)简介
ESP32-S3 芯片提供两组硬件定时器,每组包含两个通用硬件定时器。共四个定时器
所有通用定时器均基于 16 位预分频器和 54 位可自动重新加载向上/向下计数器。
2)配置和操作流程
-
定时器初始化 - 启动定时器前应设置的参数,以及每个设置提供的具体功能。
-
定时器控制 - 如何读取定时器的值,如何暂停/启动定时器以及如何改变定时器的操作方式。
-
警报 - 如何设置和使用警报。
-
处理中断事务- 如何使用中断提供的回调函数。
3)定时器初始化
1、s3的定时器组:timer_group_t,;其中的个体定时器类型为timer_idx_t
2、timer_init()->timer_config_t 初始划定时器工作方式
3、时钟源
4、预分频:默认的时钟源是 APB_CLK (一般是 80 MHz)
5、模式:向上、下;从 timer_count_dir_t 中选取一个值,后使用 counter_dir
来选择模式
6、计时器使能:调用 timer_init() 后计数器将立即开始递增/递减,timer_start_t 中选取一个值,后使用 counter_en
改变此行为
7、报警使能:alarm_en??
8、自动重装: 设置计数器是否应该在定时器警报上使用 auto_reload
自动重载首个计数值,还是继续递增或递减。-
9、获取定时器当前值:timer_get_config()。
4)定时器控制
1、使能后即开始计时,使counter_en为
true为使能,通过timer_init(),或者直接调用函数 timer_start()开始计时
2、timer_set_counter_value() 来指定定时器的首个计数值。
3、检查定时器的当前值,调用函数 timer_get_counter_value() 或 timer_get_counter_time_sec()。
除此之外,还可通过使用专有函数更改个别设置来重新配置定时器:
设置 | 专有函数 | 描述 |
---|---|---|
分频器 | timer_set_divider() | 更改计数频率。为避免发生不可预测情况,更改分频器时应暂停定时器。如果定时器正在运行,则使用 timer_set_divider() 将其暂停并更改设置,然后重启定时器。 |
模式 | timer_set_counter_mode() | 设置计数器应递增还是递减 |
自动重载 | timer_set_auto_reload() | 设置是否应在定时器警报上重载首个计数值 |
5)警报,arr吧
先调用函数 timer_set_alarm_value(),然后使用 timer_set_alarm() 使能警报。当调用函数 timer_init() 时,也可以在定时器初始化阶段使能警报
警报已使能且定时器达到警报值后,根据配置,可能会出现以下两种行为:
如果先前已配置,此时将触发中断。有关如何配置中断,请参见 处理中断事务。
如
auto_reload
已使能,定时器的计数器将重新加载,从先前配置好的值开始再次计数。应使用函数 timer_set_counter_value() 预先设置该值。(神魔用呢如果已设置警报值且定时器已超过该值,则将立即触发警报。
一旦触发后,警报将自动关闭,需要重新使能以再次触发。
要检查某特定的警报值,调用函数 timer_get_alarm_value()。
6)中断
调用 timer_isr_callback_add() 函数可以给某个定时器注册一个中断回调函数,不要执行阻塞式事务
状态位无需关系,驱动考虑好了
7)官方示例
54 位通用硬件定时器示例:peripherals/timer_group。
三、上手敲代码
1)示例位置:54 位通用硬件定时器示例:peripherals/timer_group。
2)readme
*配置了两个定时器 *每个定时器都设置了一些采样报警间隔 *当达到间隔值时,每个计时器将产生警报 *其中一个计时器被配置为在警报上自动重新加载其计数器值 *另一个定时器被配置为保持递增,每次报警时由应用程序重新加载 *报警触发后续中断,通过打印在终端上的消息进行跟踪:
3)初始化定时器
/* Select and initialize basic parameters of the timer */
timer_config_t config = {
.divider = TIMER_DIVIDER,//16分频 80M/16=5M
.counter_dir = TIMER_COUNT_UP,.//向上计数模式
.counter_en = TIMER_PAUSE,//暂停定时器
.alarm_en = TIMER_ALARM_EN,//开启警报
.auto_reload = auto_reload,//自动重装载
}; // default clock source is APB
timer_init(group, timer, &config);//初始化结构体
timer_set_counter_value(group, timer, 0);设置开始的初值
//设置报警值TIMER_SCALE:经过分频的时钟频率
timer_set_alarm_value(group, timer, timer_interval_sec * c);
timer_enable_intr(group, timer);//使能报警
//添加中断回调函数
timer_isr_callback_add(group, timer, timer_group_isr_callback, timer_info, 0);
//开启定时器
timer_start(group, timer);
//获取定时器值
timer_get_counter_value(evt.info.timer_group, evt.info.timer_idx, &task_counter_value);