芯片: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_entrue为使能,通过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);

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐