1、前言
esp32的组件(components)里面的esp_timer提供了软件定时器相关api,支持周期回调、单词回调等操作。其中软件定时器的初始化在void start_cpu0_default(void)
函数中调用esp_timer_init()
。
2、API
2.1、定时器配置结构体
代码语言:javascript复制typedef struct {
esp_timer_cb_t callback; //回调函数
void* arg; //参数
esp_timer_dispatch_t dispatch_method; //设置在哪里调用回调函数,目前只支持在任务中
const char* name; //定时器名称,用于调试
} esp_timer_create_args_t;
2.2、定时器句柄
代码语言:javascript复制esp_timer_handle_t
2.3、创建一个定时器
代码语言:javascript复制esp_err_t esp_timer_create(const esp_timer_create_args_t* create_args,
esp_timer_handle_t* out_handle);
create_args
:参数,也就是2.1中的变量类型;
out_handle
:定时器句柄;
esp_err_t
:返回值,ESP_OK表示创建成功,其他表示失败。
2.4、启动一个周期定时器
代码语言:javascript复制esp_err_t esp_timer_start_periodic(esp_timer_handle_t timer, uint64_t period);
timer
:定时器句柄;
period
:定时时长,单位是微秒;
esp_err_t
:返回值,ESP_OK表示创建成功,其他表示失败。
2.5、启动一个单次定时器
代码语言:javascript复制esp_err_t esp_timer_start_once(esp_timer_handle_t timer, uint64_t timeout_us);
timer
:定时器句柄;
period
:定时时长,单位是微秒;
esp_err_t
:返回值,ESP_OK表示创建成功,其他表示失败。
2.6、停止一个定时器
代码语言:javascript复制esp_err_t esp_timer_stop(esp_timer_handle_t timer);
既可以用于单词定时器、也可以用于周期定时器。
timer
:定时器句柄;
esp_err_t
:返回值,ESP_OK表示操作成功,其他表示失败。
2.7、删除定时器
代码语言:javascript复制esp_err_t esp_timer_delete(esp_timer_handle_t timer);
timer
:定时器句柄;
esp_err_t
:返回值,ESP_OK表示操作成功,其他表示失败。
3、代码操作
3.1、定义定时器句柄
代码语言:javascript复制esp_timer_handle_t oneshot_timer ,periodic_timer;
3.2、创建并启动定时器
代码语言:javascript复制void app_main(void)
{
const esp_timer_create_args_t periodic_timer_args = {
.callback = &periodic_timer_callback,
/* name is optional, but may help identify the timer when debugging */
.name = "periodic"
};//周期定时器配置
ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args, &periodic_timer));
const esp_timer_create_args_t oneshot_timer_args = {
.callback = &oneshot_timer_callback,
.name = "one-shot"
};//单次定时器配置
ESP_ERROR_CHECK(esp_timer_create(&oneshot_timer_args, &oneshot_timer));
/* Start the timers */
ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, 1000000));//1s回调一次
ESP_ERROR_CHECK(esp_timer_start_once(oneshot_timer, 5000000));//5s后回调
ESP_LOGI(TAG, "Started timers, time since boot: %lld us", esp_timer_get_time());
}
3.3、定时器回调
代码语言:javascript复制static void periodic_timer_callback(void* arg)
{
int64_t time_since_boot = esp_timer_get_time();
ESP_LOGI(TAG, "Periodic timer called, time since boot: %lld us", time_since_boot);
}
static void oneshot_timer_callback(void* arg)
{
int64_t time_since_boot = esp_timer_get_time();
ESP_LOGI(TAG, "One-shot timer called, time since boot: %lld us", time_since_boot);
}
4、现象
可以看出单次定时器,从启动开始,5s后只回调了一次,周期定时器1s回调一次。
————————END————————