《ESP32-S3使用指南—MicroPython版 V1.0》第十二章 Timer实验

第十二章 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灯的状态。


请使用浏览器的分享功能分享到微信等