#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());
}