第十二章 Timer实验
本章我们将学习ESP32-S3的定时器,教会大家如何使用ESP32-S3的定时器实现定时功能。在本章中,我们将实现如下功能:开启ESP32-S3的定时器,并在定时器的回调函数中,翻转LED灯的状态。
本章分为如下几个小节:
12.1 Timer简介
12.2 machine.Timer类
12.3 硬件设计
12.4 软件设计
12.5 下载验证
12.1 Timer简介
ESP32-S3有通用定时器、系统定时器和看门狗定时器,本章主要讲解的是通用定时器。
ESP32-S3有两个硬件定时器组,定时器组0和定时器组1,每组有两个硬件通用定时器,所以总共是有4个硬件通用定时器。它们都是基于16位预分频器和54位可自动重载的向上/向下计数器实现定时功能。
ESP32-S3的计数频率为80MHz,假如对16位预分频器设置预分频系数为80,那么可得到1MHz的计数信号,每个计数信号的周期为1us,即每个计数单位为1us。基于要设定的时间,就可以对计数器进行设置。打个比方,要定时10ms,而每个计数周期为1us,这里得计算10ms需要多少个这样的1us周期:10ms / 1us = 10000,计数器就需要设置为10000,实现10ms定时,这个举例过程如下图所示。
图12.1.1 定时器定时配置过程
当设置好定时器的预分频器以及计数器以及开启定时器,这时候定时开始,当计数值达到9999时,即到达设定时间,就会跳进中断回调函数中执行,执行完毕再回到主程序中运行。
12.2 machine.Timer类
machine.Timer 类是 machine 模块下的一个硬件类,用于 Timer 设备的配置和控制,提供对 Timer 设备的操作方法。Timer(硬件定时器)是一种用于处理周期性和定时性事件的设备,主要通过内部计数器模块对脉冲信号进行计数,实现周期性设备控制的功能。同时,Timer 硬件定时器可以自定义超时时间和超时回调函数,并且提供两种定时器模式:ONE_SHOT 和 PERIOD。打印 Timer 对象会打印出配置的信息。
1,machine.Timer类的构造函数
Timer的构造对象方法如下:
class machine.Timer(id, /, ...)
该构造函数的参数描述,如下表所示。
表12.1.1 machine.Timer构造函数参数描述
返回值:返回指定引脚的Timer对象。
2,machine.Timer类的方法
①:对象初始化
其函数原型如下:
Timer.init(*, mode=Timer.PERIODIC, freq=-1, period=-1, callback=None)
该函数的参数描述,如下表所示。
表12.1.2 UART.init函数参数描述
②:关闭Timer设备
其函数原型如下:
Timer.deinit()
12.3 硬件设计
1. 例程功能
本章实验功能简介:程序启动后配置定时器的定时时间为1秒,定时到来时执行中断服务函数翻转LED状态。
2. 硬件资源
1)LED灯
LED-IO1
2)独立按键
BOOT-IO0
3)Timer1
3. 原理图
本章实验使用的定时器为ESP32-S3的片上资源,因此并没有相应的连接原理图。
12.4 软件设计
12.3.1 程序流程图
程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:
图12.3.1.1 程序流程图
12.3.2 程序解析
本书籍的代码都在main.py脚本下编写的,读者可在光盘资料下找到对应的源码。Timer实验main.py源码如下:
from machine import Pin,Timer import time """ * @brief 基本定时器TIMEX中断服务函数 * @param tim:定时器句柄 * @retval 无 """ def BTMR_TIMEX_INT_IRQHandler(tim): led_state = led.value() led.value(not led_state) """ * @brief 程序入口 * @param 无 * @retval 无 """ if __name__ == '__main__': # 初始化LED并输出高电平 led = Pin(1,Pin.OUT,value = 1) # 开启定时器1 tim = Timer(1) # 配置定时器1:1000ms中断、循环模式及中断回调函数BTMR_TIMEX_INT_IRQHandler tim.init(period = 1000, mode = Timer.PERIODIC, callback = BTMR_TIMEX_INT_IRQHandler)
这示例代码的主要部分包括一个定时器和一个LED灯。
首先,通过Pin类初始化LED灯,设置其引脚为输出模式,并初始化为高电平(也就是LED灯初始为亮的状态)。
然后,通过Timer类开启一个定时器,设置其编号为1。
接下来,配置这个定时器。设置其周期为1000毫秒(也就是1秒),模式为Timer.PERIODIC,表示这是一个循环定时器,即每隔设定的周期就会触发一次中断。同时,设置中断回调函数为BTMR_TIMEX_INT_IRQHandler,这意味着每当定时器触发中断时,都会执行这个函数。
最后,BTMR_TIMEX_INT_IRQHandler函数的作用是在每次定时器中断时切换LED灯的状态。它首先读取当前LED灯的状态,然后反转这个状态,最后将新的状态写入LED灯。因此,每当定时器触发中断时,LED灯的状态(亮或灭)就会被反转。
12.5 下载验证
下载代码完成后,ESP32-S3开发板每隔1000毫秒触发一次中断,然后在中断服务函数中切换LED灯的状态。