一、定时器概述
ESP32 内置 4 个 64-bit 通用定时器。每个定时器包含一个 16-bit 预分频器(2的16次方分配给定时器时钟的)和一个 64-bit 可自动重新加载向上/向下计数器(计数范围2的64次方)。
ESP32 的定时器分为 2 组,每组 2 个。 定时器特性:
- 16-bit 时钟预分频器,分频系数为 2-65536
- 64-bit 时基计数器(可以计数的范围)
- 可配置的向上/向下时基计数器:增加或减少
- 暂停和恢复时基计数器
- 报警时自动重新加载
- 当报警值溢出/低于保护值时报警
- 软件控制的即时重新加载
- 电平触发中断和边沿触发中断
- 流程:分频—时基计数—报警溢出事件—中断回调函数
- 2种运行模式: 定时器以自动重载来运行: 字面上意思是会不断地根据一个时间数值来间隔地发生中断触发回调事件!
- 定时器以单次模式来运行: 定时器仅仅运行一次!
流程:分频—时基计数—报警溢出事件—中断回调函数
定时器独立于cpu单独运行不要放在while里面不然定时速度会慢于while的速度led灯闪的慢,没有定时1s的速度
二、官方组件API
2.1esp_timer_init
2.2 esp_timer_create
2.3 esp_timer_start_once
2.4 esp_err_t esp_timer_start_periodic
三、逻辑代码
定义句柄变量用于指针传递
esp_timer_handle_t test_time = 0;
中断触发回调函数
void Test_time(){
if (led_flag > 0)
{
led_red(LED_ON);
led_flag = 0;
} else
{
led_red(LED_OFF);
led_flag = 1;
}
}
代码如下(示例):
esp_timer_init();
esp_timer_create_args_t test_timer =
{
.callback = &Test_time,
.arg = NULL,
.name = "timer1"
};
esp_err_t err = esp_timer_create
(&test_timer, &test_time);
err = esp_timer_start_periodic
(test_time, 1000 * 1000);
if (err == ESP_OK) {
printf("timer1 cteate and start ok!\r\n");
}
总结
上面教程只是简单的实现了定时器1s的单次与循环定时功能,并没有引用操作系统的概念需要自身不断的应用与学习
- 由Lee1989写于2021年09月11日
- 欢迎关注微信公众号:【嵌入式Studio】
了解更多干货知识
|