0%

esp32定时器学习

项目需要用到esp32的定时器计算心率,现将学习内容整理如下:

正文

  1. 官方提供的API接口说明

官方对定时器的说明:https://esp-idf.readthedocs.io/en/latest/api-reference/system/esp_timer.html

  1. 前期步骤

    1. 创建一个定时的函数esp_timer_create()

      • 第一个参数是定时器结构体,第二个是定时器返回的句柄!

      • 返回值是也是一个结构体类型的esp_err_t

      • 开始执行定时器有2个方法,一个是执行单次的esp_timer_start_once()和周期性执行的esp_timer_start_periodic(), 虽然传入的参数的类型都为一样,但是传入参数含义有所不一样!

        esp_timer_start_once()的传参含义分别是:句柄 ,第二个是:这个时间后将触发的事件回调;esp_timer_start_periodic()的传参含义分别是:句柄 ,第二个是:每次触发的事件回调的时间间隔;

  1. 对于要暂停和删除定时器,官方提供了下面2个方法:
  • 暂停定时器:esp_timer_stop():停止一个定时器操作,不管是执行单次的还是重复性执行的!形参是定时器的句柄!

  • 删除定时器:esp_timer_delete():删除一个定时器,记得必须要先暂停定时器哦!形参是定时器的句柄!

废话不说,上代码!

  1. 定义2个定时器的句柄和2和定时器结构体:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/定义2个定时器句柄
esp_timer_handle_t test_p_handle = 0;
esp_timer_handle_t test_o_handle = 0;

//定义一个单次运行的定时器结构体
esp_timer_create_args_t test_once_arg = { .callback = &test_timer_once_cb, //设置回调函数
.arg = NULL, //不携带参数
.name = "TestOnceTimer" //定时器名字
};
//定义一个周期重复运行的定时器结构体
esp_timer_create_args_t test_periodic_arg = { .callback =
&test_timer_periodic_cb, //设置回调函数
.arg = NULL, //不携带参数
.name = "TestPeriodicTimer" //定时器名字

};
  1. 定义2个定时器的回调函数,其中周期性回调的函数执行LED闪烁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void test_timer_periodic_cb(void *arg) {

int64_t tick = esp_timer_get_time();

printf("方法回调名字: %s , 距离定时器开启时间间隔 = %lld \r\n", __func__, tick);

if (tick > 100000000) {
//停止定时器工作,并获取是否停止成功
esp_err_t err = esp_timer_stop(test_p_handle);
printf("要停止的定时器名字:%s , 是否停止成功:%s", test_periodic_arg.name,
err == ESP_OK ? "ok!\r\n" : "failed!\r\n");
err = esp_timer_delete(test_p_handle);
printf("要删除的定时器名字:%s , 是否停止成功:%s", test_periodic_arg.name,
err == ESP_OK ? "ok!\r\n" : "failed!\r\n");
}
//低电平
gpio_set_level(16, 0);
//延迟
vTaskDelay(1000 / portTICK_PERIOD_MS);
//高电平
gpio_set_level(16, 1);
//延迟
vTaskDelay(1000 / portTICK_PERIOD_MS);
}

void test_timer_once_cb(void *arg) {
int64_t tick = esp_timer_get_time();
printf("方法回调名字: %s , 距离定时器开启时间间隔 = %lld \r\n", __func__, tick);
esp_err_t err = esp_timer_delete(test_o_handle);
printf("要删除的定时器名字:%s , 是否停止成功:%s", test_periodic_arg.name,
err == ESP_OK ? "ok!\r\n" : "failed!\r\n");
}