补充第一章:ESP32定时器的使用

版权声明:本文原创,未经许可,不可转载。 https://blog.csdn.net/qq_24550925/article/details/86137885

学习目的及目标

  1. 掌握LED灯电路设计:控制方式
  2. 掌握ESP32定时器的库函数
  3. 编写LED闪烁灯程序

硬件设计及原理

本实验板连接了一个 RGB彩灯,RGB彩灯实际上由三盏分别为红色、绿色、蓝色的 LED 灯组成,通过控制 RGB颜色强度的组合,可以混合出各种色彩,此章只学习如何开关,调色放在PWM章学习。

这些 LED 灯的阴极都是通过0欧姆电阻连接到ESP32的 GPIO引脚,只要我们控制 GPIO引脚的电平输出状态,即可控制 LED 灯的亮灭。图中去掉0欧姆电阻,可以切断和单片机的连接,释放这个GPIO。3个LED灯占用ESP32的引脚如下:

LED标号

LED颜色

接至ESP32的引脚

LP2A

红色

IO2

扫描二维码关注公众号,回复: 5459018 查看本文章

LP2B

绿色

IO18

LP2C

蓝色

IO19

若您使用的实验板 LED 灯的连接方式或引脚不一样,只需根据我们的工程修改引脚即可,程序的控制原理相同。

软件设计

代码逻辑

ESP32的软定时器接口介绍

创建定时器函数:esp_timer_create();

函数原型

esp_err_t esp_timer_create

(

const esp_timer_create_args_t* create_args,

esp_timer_handle_t* out_handle

)

函数功能

创建定时器函数

参数

[in]create_args:定时器结构体

typedef struct {

    esp_timer_cb_t callback;        //定时器时间到回调

    void* arg;                      //要传入回调的参数

esp_timer_dispatch_t dispatch_method;   //从任务或ISR调用回调

 const char* name;               //定时器名称,esp_timer_dump函数使用

} esp_timer_create_args_t;

[in]out_handle:定时器句柄

返回值

ESP_OK:成功

ESP_ERR_INVALID_ARG : 参数错误

ESP_ERR_INVALID_STATE:定时器已经运行

启动单次定时器函数:esp_timer_start_once();基本同下

启动周期定时器函数:esp_timer_start_periodic();

函数原型

esp_err_t esp_timer_start_periodic

(

esp_timer_handle_t timer,

uint64_t period

)

函数功能

启动周期定时器

参数

[in]timer:定时器句柄

[in]period:定时周期,单位微秒,1000表示1ms

返回值

ESP_OK:成功

ESP_ERR_INVALID_ARG : 参数错误

ESP_ERR_INVALID_STATE:定时器已经运行


停止定时器函数:esp_timer_stop();

函数原型

esp_err_t esp_timer_stop

(

esp_timer_handle_t timer

);

函数功能

停止定时器

参数

[in]timer:定时器句柄

返回值

ESP_OK:成功

ESP_ERR_INVALID_STATE:定时器已经停止

删除定时器函数:esp_timer_delete();

函数原型

esp_err_t esp_timer_delete

(

esp_timer_handle_t timer

);

函数功能

删除定时器

参数

[in]gpio_num:引脚编号,0~34(存在部分)

[in]pull:IO模式,可以设置:

0:输出低

1:输出高

返回值

ESP_OK:成功

ESP_ERR_INVALID_ARG : 参数错误

获取定时器时间函数:esp_timer_get_time();

函数原型

int64_t esp_timer_get_time()

函数功能

设置IO输出值

参数

none

返回值

自调用esp计时器init以来的微秒数(通常在应用程序启动的早期发生)

更多更详细接口请参考官方指南

代码编写

定时器配置

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

void app_main() {

  //选择IO

    gpio_pad_select_gpio(LED_R_IO);

    //设置IO为输出

    gpio_set_direction(LED_R_IO, GPIO_MODE_OUTPUT);

//定时器结构体初始化

esp_timer_create_args_t fw_timer =

{

.callback = &fw_timer_cb, //回调函数

.arg = NULL, //参数

.name = "fw_timer" //定时器名称

};

//定时器创建、启动

esp_err_t err = esp_timer_create(&fw_timer, &fw_timer_handle);

err = esp_timer_start_periodic(fw_timer_handle, 1000 * 1000);//1秒回调

if(err == ESP_OK)

{

printf("fw timer cteate and start ok!\r\n");

}

}

 

定时器回调函数

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

void fw_timer_cb(void *arg)

{

//获取时间戳

int64_t tick = esp_timer_get_time();

printf("timer cnt = %lld \r\n", tick);

if (tick > 50000000) //50秒结束

{

//定时器暂停、删除

esp_timer_stop(fw_timer_handle);

esp_timer_delete(fw_timer_handle);

printf("timer stop and delete!!! \r\n");

//重启

esp_restart();

}

gpio_set_level(LED_R_IO, 0);

vTaskDelay(100 / portTICK_PERIOD_MS);

gpio_set_level(LED_R_IO, 1);

vTaskDelay(100 / portTICK_PERIOD_MS);

}

硬件连接

开发板默认已经连接好LED,下载程序即可,使用其他开发板需要修改程序或者修改硬件连接皆可。

效果展示

红灯1000ms闪一次

定时器总结

主要学习ESP32软定时器的使用,方法很简单。创建》开始》回调,可获取时间,也可以停止》暂停。

源码地址:https://github.com/HX-IoT/ESP32-Developer-Guide

点我->更多ESP32开发指南系列目录

猜你喜欢

转载自blog.csdn.net/qq_24550925/article/details/86137885