一、定时器概述
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(){ //根据LED状态闪灯
if (led_flag > 0)
{
led_red(LED_ON);
led_flag = 0;
} else
{
led_red(LED_OFF);
led_flag = 1;
}
}
代码如下(示例):
esp_timer_init(); // 使用定时器API函数,先调用接口初始化 //定时器结构体初始化
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); //1秒回调
if (err == ESP_OK) {
printf("timer1 cteate and start ok!\r\n");
}
总结
上面教程只是简单的实现了定时器1s的单次与循环定时功能,并没有引用操作系统的概念需要自身不断的应用与学习