ESP32S3学习——通用定时器

芯片: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);

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值