#include <stdio.h> #include <string.h> #include <unistd.h> #include "esp_timer.h" #include "esp_log.h" #include "esp_sleep.h" #include "sdkconfig.h" static void periodic_timer_callback(void* arg); static void oneshot_timer_callback(void* arg); static const char* TAG = "YCP"; /** * 创建两个定时器: * 1. 一个周期定时器,每 0.5 秒运行一次,并打印一条消息 * 2. 单发定时器,5秒后触发,这个定时器的任务是:删除0.5s一次的定时器任务,创建以1s为周期重新启动周期性定时器任务。 */ void app_main(void) { /** *1.esp_timer_create_args_t和esp_timer_handle_t两个函数初始化 *2.因为esp_timer_create(&oneshot_timer_args, &oneshot_timer)需要这两个函数 *3.esp_timer_start_xxxx启动定时器,以单次或者多次启动 */ const esp_timer_create_args_t periodic_timer_args = { .callback = &periodic_timer_callback, //定时器回调函数 .name = "periodic" //定时器名称 }; esp_timer_handle_t periodic_timer; //创建一个定时器变量 ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args, &periodic_timer)); //创建一个定时器 const esp_timer_create_args_t oneshot_timer_args = { .callback = &oneshot_timer_callback, //定时器回调函数 .arg = (void*) periodic_timer, //传递给回调函数的参数 .name = "one-shot" //定时器名称 }; esp_timer_handle_t oneshot_timer; //创建一个定时器变量 ESP_ERROR_CHECK(esp_timer_create(&oneshot_timer_args, &oneshot_timer)); //创建一个定时器 ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, 500000)); //开启定时器 ESP_ERROR_CHECK(esp_timer_start_once(oneshot_timer, 5000000)); //启动一次性定时器 ESP_LOGI(TAG, "开启定时器,现在时间是 : %lld us", esp_timer_get_time()); /** * 每2秒向控制台打印一次定时器的调试信息*/ for (int i = 0; i < 5; ++i) { ESP_ERROR_CHECK(esp_timer_dump(stdout)); usleep(2000000); } ESP_LOGI(TAG, "进入0.5秒睡眠模式,现在时间是 : %lld us",esp_timer_get_time()); //在浅睡眠中计时继续,计时器被调度浅睡后正确。 ESP_ERROR_CHECK(esp_sleep_enable_timer_wakeup(500000)); //500000后唤醒 esp_light_sleep_start(); //开始轻度睡眠 ESP_LOGI(TAG, "轻度睡眠唤醒,现在时间是 : %lld us",esp_timer_get_time()); //打印时间 usleep(2000000); //让计时器再运行一会儿 //清理并完成示例 ESP_ERROR_CHECK(esp_timer_stop(periodic_timer)); ESP_ERROR_CHECK(esp_timer_delete(periodic_timer)); ESP_ERROR_CHECK(esp_timer_delete(oneshot_timer)); ESP_LOGI(TAG, "停止睡眠并删除定时器"); } static void periodic_timer_callback(void* arg) { ESP_LOGI(TAG, "阶段定时器执行任务,现在时间是 : %lld us", esp_timer_get_time()); } static void oneshot_timer_callback(void* arg) { ESP_LOGI(TAG, "单次定时器执行任务,现在时间是 : %lld us", esp_timer_get_time()); esp_timer_handle_t periodic_timer_handle = (esp_timer_handle_t) arg; /** * 停止0.5秒一次的阶段定时器,开启1s一次的阶段定时器 */ ESP_ERROR_CHECK(esp_timer_stop(periodic_timer_handle)); ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer_handle, 1000000)); ESP_LOGI(TAG, "重启1秒的阶段定时器,现在时间是 : %lld us",esp_timer_get_time()); }
标签:定时器,ESP,esp,timer,periodic,CHECK From: https://www.cnblogs.com/ycp666/p/17017082.html