定时器

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

 

posted @ 2022-12-31 18:17  松果工作室  阅读(194)  评论(0)    收藏  举报