[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)