[ESP32]esp_timer使用
ESP32的高精度定时器API接口允许用户在一个硬件定时器上创建多个软件定时器,免去了复杂的硬件操作和APB频率因工作模式不同而变化带来的定时不准问题。
软件定时器可以精确到微秒(us)级别,可以周期触发或触发一次。
使用步骤为:
- 设置timer的回调函数与名称(esp_timer_create_args_t)
- esp_timer_create()创建定时器
- 启动定时器(esp_timer_start_periodic/esp_timer_start_once)
1. 设置timer的回调函数与名称
通过esp_timer_create_args_t结构体设置:
typedef struct {
esp_timer_cb_t callback; //!< Function to call when timer expires
void* arg; //!< Argument to pass to the callback
esp_timer_dispatch_t dispatch_method; //!< Call the callback from task or from ISR
const char* name; //!< Timer name, used in esp_timer_dump function
} esp_timer_create_args_t;
void on_1s_timer(void *args) {
ESP_LOGI("timer", "timer:%lld", esp_timer_get_time());
}
esp_timer_create_args_t timer_1s_args = {
.callback = &on_1s_timer,
.name = "timer_1s",
};
2. 创建timer
原型函数:
esp_err_t esp_timer_create(const esp_timer_create_args_t* create_args,
esp_timer_handle_t* out_handle)
ESP_ERROR_CHECK(esp_timer_create(&timer_1s_args, &timer_1s));
3. 启动定时器
函数原型:
esp_err_t esp_timer_start_periodic(esp_timer_handle_t timer, uint64_t period);
esp_err_t IRAM_ATTR esp_timer_start_once(esp_timer_handle_t timer, uint64_t timeout_us)
使用方法:
ESP_ERROR_CHECK(esp_timer_start_periodic(timer_1s, 1000000)); // timer: 1s
timer的其它函数
esp_err_t IRAM_ATTR esp_timer_stop(esp_timer_handle_t timer);
esp_err_t esp_timer_delete(esp_timer_handle_t timer);
int64_t IRAM_ATTR esp_timer_get_time(void); // 从esp timer初始化之后经过的微秒(us)