首页 > 其他分享 >定时器

定时器

时间:2022-12-31 18:22:32浏览次数:36  
标签:定时器 ESP esp timer periodic CHECK

#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

相关文章

  • 09-定时器拓展应用
    #include"reg52.h"sbitS4=P3^3;sbitS5=P3^2;unsignedcharfen=0;unsignedcharmiao=0;unsignedchart_005ms=0;voiddelay(unsignedchart){......
  • 08-定时器及其应用
    #include"reg52.h"sbitL1=P0^0;sbitL8=P0^7;voidSelectHC573(){ P2=(P2&0x1f)|0x80;}//==========================voidInitTimer0(){ TMOD=......
  • Go 快速入门指南 - 互斥锁和定时器
    互斥锁对于任一共享资源,同一时间保证只有一个操作者,这种方法称为 ​​互斥机制​​。关键字 ​​Mutex​​​ 表示互斥锁类型,它的 ​​Lock​​​ 方法用于获取锁,​​U......
  • Go 快速入门指南 - 互斥锁和定时器
    互斥锁对于任一共享资源,同一时间保证只有一个操作者,这种方法称为 互斥机制。关键字 Mutex 表示互斥锁类型,它的 Lock 方法用于获取锁,Unlock 方法用于释放锁。在 Lo......
  • 定时器——TIMER
    一、软件定时原理使用纯软件(CPU死等)的方式实现定时(延时)功能 软件定时不准确的原因:1.函数调用有压栈出栈需要消耗时间2.ARM流水线架构(一条指令分给多个步骤共同进行......
  • 二、Qt定时器与文本编辑器制作《QT 入门到实战》
    学习目标了解qt的pixmap了解qt的label如何显示图片了解定时器的开启了解定时器的关闭了解文件如何进行读取了解QFileDialog的使用了解了一个文本编辑器的......
  • STM32基本定时器控制LED闪烁代码
    led.c#include"led.h"voidLED_Config(void){ GPIO_InitTypeDefGPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStruct.......
  • 芯科BG22学习笔记:如何添加定时器
    实验目的:BG22芯片添加定时器功能实验环境:SimplicityStudioV5实验器材:WirelessStarterKitMainboard(BRD4001ARevA01)+ EFR32xG222.4GHz6dBmQFN32RadioBo......
  • stm32定时器引脚分布,定时器2~7、9~14基本配置,PWM波电机调速简单代码
    使用STM32MIN开发板操作,对电机进行PWM简单调速,使用通用定时器TIM3上,下图为MIN板定时器引脚分布图mian.c#include"delay.h"#include"usart.h"#include"motor.h"intmai......
  • 10. 定时器
    定时器的常见方法setInterval():循环调用。将一段代码,每隔一段时间执行一次。(循环执行)setTimeout():延时调用。将一段代码,等待一段时间之后再执行。(只执行一次)备注:......