定时器中断
大约 2 分钟ESP32Python
上一节我们介绍了 ESP32 的外部中断的使用,本节课介绍 ESP32 的定时器功能。
实验原理
定时器,顾名思义就是用来计时的,我们常常会设置计时或闹钟,然后时间到了就告诉我们要做什么。ESP32 也是这样,通过定时器可以完成各种预设好的任务。ESP32 定时器到达指定时间后也会产生中断,然后在回调函数内执行所需功能,这个和外部中断类似。
ESP32 内置 4 个 64-bit 通用定时器。每个定时器包含一个 16-bit 预分频器和一个 64-bit 可自动重新加载向上/向下计数器。
使用计时器的好处,是实现类似并行处理的功能,也就是一个应用里只能有一个 while True
,两个以上都是不可以的,但是如果使用定时器,就可以同时运行多个 while True
。
硬件电路设计
物料清单(BOM 表):
材料名称 | 数量 |
---|---|
直插式 LED | 2 |
1kΩ 电阻 | 2 |
杜邦线(跳线) | 若干 |
面包板 | 1 |
LED 的正极接开发板的 D2、D4 引脚,并串联一个电阻,负极接 GND,如下图:
注意
一定要接电阻,不然会由于电流过大,烧坏 LED。
软件程序设计
ESP32 定时器位于 machine 模块当中。可以调用的定时器有 timer0-3 共 4 个定时器。
构造函数 class machine.Timer(id, ...)
:构造给定 id 的新计时器对象,可以是任意整数 n(这个整数会转化成 n % 4),但是最多调用 4 个,新调用的会抢占定时器。
Timer.init(*, mode=Timer.PERIODIC, period=- 1, callback=None)
:定时器初始化,其中的参数:
mode
:2 种工作模式,Timer.ONE_SHOT(执行一次)、Timer.PERIODIC(周期性);period
:单位为 ms;callback
:定时器中断后的回调函数。
Timer.deinit()
:销毁计时器。
因此,我们的代码需要这么写:
import time
from machine import Pin, Timer
# 定义 Pin 控制引脚
led_1 = Pin(2, Pin.OUT)
led_2 = Pin(4, Pin.OUT)
# 定义定时器中断的回调函数
def timer_irq(timer_pin):
led_1.value(not led_1.value())
# 定义定时器
timer = Timer(0)
# 初始化定时器
timer.init(period=500, mode=Timer.PERIODIC, callback=timer_irq)
while True:
led_2.value(not led_2.value())
time.sleep(1)