【玩转ESP32】11、esp32软件定时器

2021-07-01 15:28:04 浏览数 (1)

1、前言

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

2、API

2.1、定时器配置结构体
代码语言:javascript复制
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、定时器句柄
代码语言:javascript复制
esp_timer_handle_t
2.3、创建一个定时器
代码语言:javascript复制
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、启动一个周期定时器
代码语言:javascript复制
esp_err_t esp_timer_start_periodic(esp_timer_handle_t timer, uint64_t period);

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

2.5、启动一个单次定时器
代码语言:javascript复制
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、停止一个定时器
代码语言:javascript复制
esp_err_t esp_timer_stop(esp_timer_handle_t timer);

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

2.7、删除定时器
代码语言:javascript复制
esp_err_t esp_timer_delete(esp_timer_handle_t timer);

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

3、代码操作

3.1、定义定时器句柄
代码语言:javascript复制
esp_timer_handle_t oneshot_timer ,periodic_timer;
3.2、创建并启动定时器
代码语言:javascript复制
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、定时器回调
代码语言:javascript复制
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回调一次。

————————END————————

0 人点赞