ESP32-C3 入门教程 基础篇(六、TIMG 硬件定时器 与 软件定时器)
前言
定时器的测试,我们直接使用串口打印看测试结果就可以了。
测试使用的开发板:
自己画一块 ESP32-C3 的开发板(第一次使用立创 EDA)(PCB 到手)
https://xie.infoq.cn/article/30387388381a0d915b2494f91
测试使用的开发环境:
ESP32-C3 VScode 开发环境搭建(基于乐鑫官方 ESP-IDF——Windows 和 Ubuntu 双环境)
https://xie.infoq.cn/article/5b639e112cabba00cc1b8941a
基础篇系列相关博文:
ESP32-C3 入门教程 基础篇(一、ADC 采样)
https://xie.infoq.cn/article/78eff739dd2ed4971f445272a
ESP32-C3 入门教程 基础篇(二、GPIO 中断、按键驱动测试)
https://xie.infoq.cn/article/7d090d74fb0a9449986954810
ESP32-C3 入门教程 基础篇(三、UART 模块 — 与 Enocean 无线模块串口通信)
https://xie.infoq.cn/article/55d8a9cbd211b4d99b53935ee
ESP32-C3 入门教程 基础篇(四、I2C 总线 — 与 SHT21 温湿度传感器通讯)
https://xie.infoq.cn/article/75a22c7d3499c2d5428f726e8
ESP32-C3 入门教程 基础篇(五、RMT 应用 — 控制 SK6812 全彩 RGB 灯)
1、 定时器基础介绍
对于 ESP32-C3 通用定时器的介绍,乐鑫的官网的说明链接如下:
同时,在乐鑫官方 ESP32-C3 芯片手册《esp32-c3_technical_reference_manual_cn》文档第 10 章节中对于 TIMG 也有详细的介绍:
多余的话就不多说,这里主要是根据官方文档 配着代码说明一遍基本使用步骤:
ESP32-C3 有 2 个定时器组,每个组有 2 个定时器,共有 4 个定时器。
定时器使用
timer_config_t
结构体进行配置,然后初始化。比如示例中的初始化:
初始化以后,可以直接
timer_start
开启定时器,当然也可以进行一些配置,再开启定时器。使用timer_set_counter_value
设置定时器的首个计数值:还有一些其他的专有函数也可以进行设置:
在示例中只用到了
timer_set_counter_value
,如下图:警报和中断,定时器开启以后,自然会有超时处理,或者中断处理相关的内容。把这些对于需要的功能配置号以后,就可以使用
timer_start
开启定时器:使用timer_set_alarm_value
设置警报:使用
timer_isr_callback_add
给定时器注册中断回调函数:在示例中使用的方式如下:
至于细节和其他的问题,可以参考手册,下面我们通过官方的例程测试一下定时器的效果。
2、定时器示例测试
定时器测试我们还是先根据官方的例程展开。
2.1 IDF 示例测试
在官方的示例有关定时器的示例为 timer group
,如下图:
这个定时器的例程功能简单,人人都可以编译下载观察,这里我根据自己的修改稍微简单的说明一下。
在app_main
一开始,创建了一个消息队列,然后初始化了 2 个定时器,其中一个设置为 3 秒报警的重装载定时器(使用的组 0 中的定时器 0),另外一个设置为 5 秒报警的补充装载定时器(组 1 中的定时器 0)。
定时器运行后,在while
循环中,一开始就一直等待消息队列,显然只有等定时器发生了报警中断,在中断服务函数中发送了消息,while 循环才接触阻塞执行下去。
接下来还会根据接收到的消息内容(示例中其实就是看是否是重装载定时器)来打印说明。
后面的打印都一样,获取计数器的值之类的。
如果直接用示例程序看打印结果,还是有点糊涂的,这里测试的时候我们一个定时器一个定时器来看,以便于更好的理解:
单独这个定时器运行的结果如下(很好理解):
那么来看一看另一个重装载定时器单独的测试结果:
从这两个单独的结果可以很好的理解定时器的运行,再加上上面的介绍,想把定时器用起来应该也不是什么难事。
2.2 软件定时器
既然使用了 FreeRTOS 操作系统,那么当然也可以使用软件定时器,在 IDF 的示例工程中,软件定时器默认配置如下:
对应的在 STM32CubeMX 中的设置如下:
2.2.1 ESP-IDF 工程中查看 FreeRTOS 任务情况
还记得在我讲解 FreeRTOS 记录的博文中,有说到过如何查看 FreeRTOS 的任务运行状态:
FreeRTOS记录(四、FreeRTOS任务堆栈溢出问题和临界区)
那么既然 ESP-IDF 工程使用的是 FreeRTOS ,那么他当然也可以查看:
使能了任务信息查看,我们就可以打印出任务运行状态,这里,我们正好使用硬件定时器周期打印一下各任务的运行状态,简单修改一下代码,修改方式就和上面 FreeRTOS 记录博文中的一样:
测试效果如下图(下图中应该是说错了,后来测试发现 esp_timer 并不是软件定时器任务……):
2.2.2 软件定时器简单测试
关于 FreeRTOS 软件定时器的问题可以参考博文:
我们这里在 ESP32-C3 上,也简单测试一下:
1、添加一下软件定时器头文件:
/2、程序中创建一个定时器,然后开启:
测试结果如下:
当初看到打印任务中有 esp_timer 这个任务,以为是,后来才发现这个并不是软件定时器,至于这个是什么任务,后面学习到了再来说明。
版权声明: 本文为 InfoQ 作者【矜辰所致】的原创文章。
原文链接:【http://xie.infoq.cn/article/73df8f33be9917bfb833f40c4】。文章转载请联系作者。
评论