当前位置 博文首页 > timer使用_freemote的博客:【玩转ESP32】13、软件定时器esp

    timer使用_freemote的博客:【玩转ESP32】13、软件定时器esp

    作者:[db:作者] 时间:2021-07-05 09:53

    系列文章:

    【玩转ESP32】1、开发环境搭建
    【玩转ESP32】2、开发参考资料
    【玩转ESP32】3、点亮LED,Blink,blink,blink
    【玩转ESP32】4、ESP32驱动DHT11
    【玩转ESP32】5、i2c-tools访问i2c设备
    【玩转ESP32】6、驱动i2c设备—0.96 OLED
    【玩转ESP32】7、ESP32连接wifi
    【玩转ESP32】8、ESP32 Guru MeditationError报错分析
    【玩转ESP32】9、ESP32 作为TCP客户端连接服务器(非阻塞接收)
    【玩转ESP32】10、创建用户分区表,数据读写存储
    【玩转ESP32】11、编译报错:esp_bt.h:No such file or directory
    【玩转ESP32】12、esp32串口使用

    1、前言

    esp32的组件(components)里面的esp_timer提供了软件定时器相关api,支持周期回调、单词回调等操作。其中软件定时器的初始化在void start_cpu0_default(void)函数中调用esp_timer_init()

    2、API

    2.1、定时器配置结构体

    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、定时器句柄

    esp_timer_handle_t 
    

    2.3、创建一个定时器

    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、启动一个周期定时器

    esp_err_t esp_timer_start_periodic(esp_timer_handle_t timer, uint64_t period);
    

    timer :定时器句柄;
    period:定时时常,单位是微秒;
    esp_err_t:返回值,ESP_OK表示创建成功,其他表示失败。

    2.5、启动一个单次定时器

    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、停止一个定时器

    esp_err_t esp_timer_stop(esp_timer_handle_t timer);
    

    既可以用于单词定时器、也可以用于周期定时器。
    timer :定时器句柄;
    esp_err_t:返回值,ESP_OK表示操作成功,其他表示失败。

    2.7、删除定时器

    esp_err_t esp_timer_delete(esp_timer_handle_t timer);
    

    timer :定时器句柄;
    esp_err_t:返回值,ESP_OK表示操作成功,其他表示失败。

    3、代码操作

    3.1、定义定时器句柄

    esp_timer_handle_t oneshot_timer ,periodic_timer;
    

    3.2、创建并启动定时器

    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、定时器回调

    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回调一次。

    cs