[ESP32]esp_timer使用

[ESP32]esp_timer使用

ESP32的高精度定时器API接口允许用户在一个硬件定时器上创建多个软件定时器,免去了复杂的硬件操作和APB频率因工作模式不同而变化带来的定时不准问题。
软件定时器可以精确到微秒(us)级别,可以周期触发或触发一次。

使用步骤为:

  1. 设置timer的回调函数与名称(esp_timer_create_args_t)
  2. esp_timer_create()创建定时器
  3. 启动定时器(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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章