定时器中断

罗大富 BigRich大约 2 分钟ESP32Python

上一节我们介绍了 ESP32 的外部中断的使用,本节课介绍 ESP32 的定时器功能。

实验原理

定时器,顾名思义就是用来计时的,我们常常会设置计时或闹钟,然后时间到了就告诉我们要做什么。ESP32 也是这样,通过定时器可以完成各种预设好的任务。ESP32 定时器到达指定时间后也会产生中断,然后在回调函数内执行所需功能,这个和外部中断类似。

ESP32 内置 4 个 64-bit 通用定时器。每个定时器包含一个 16-bit 预分频器和一个 64-bit 可自动重新加载向上/向下计数器。

使用计时器的好处,是实现类似并行处理的功能,也就是一个应用里只能有一个 while True,两个以上都是不可以的,但是如果使用定时器,就可以同时运行多个 while True

硬件电路设计

物料清单(BOM 表):

材料名称数量
直插式 LED2
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)

上次编辑于:
贡献者: Luo