前面我们学习了 ESP32 的 IO 口最基本的输入输出功能,本节课我们将学习 IO 口作为外部中断输入来使用,我们将以中断的方式,实现我们在“KEY实验”所实现的功能。
本节课目标:
开发板载的boot按键,以外部中断的方式,控制板载的LED灯翻转。
本节课内容:
- 外部中断简介
- machine.Pin类
- 硬件设计
- 软件设计
- 下载验证
一、外部中断简介
在上一节“KEY实验”中,为了即时响应按键状态的变化并触发LED灯的反应,程序采用了持续监测按键boot状态的轮询方式,此为基本且直接的方法。然而,轮询机制在某些实际应用场景下可能存在局限性,即当按键被按下时,若程序正处于传感器数据采集阶段,则可能无法即时捕捉到按键动作,导致系统响应延迟或失效。为解决此问题,可对该按键配置外部中断功能。
外部中断是由外部设备触发的请求中断机制,每个中断都关联着一个特定的中断服务程序(或称中断回调函数),该程序在逻辑上独立于主程序之外。当中断条件满足时,控制器会暂停当前执行的主程序流程,转而执行相应的中断服务程序。待中断服务程序执行完毕后,控制器将自动恢复到主程序被中断时的执行点,继续执行主程序。通过这种方式,系统能够实现对外部事件的即时响应与处理,从而提升系统的实时性和可靠性。
二、machine.Pin类
Pin
类提供了设置引脚模式(输入或输出)的方法,以及获取和设置引脚数字逻辑值(0 或 1)的方法。要创建一个 Pin
对象,我们需要指定一个标识符,该标识符用于唯一标识特定的输入/输出引脚。标识符可以是一个整数、字符串,或者是一个包含端口和引脚号码的元组。
下面是MicroPython库的machine.Pin类链接。
类引脚 – 控制 I/O 引脚 — MicroPython latest 文档
1. machine.Pin类的构造对象
构造对象方法如下:
class machine.Pin(id, mode=-1, pull=-1,value=None)
使用示例:led = machine.Pin(2, Pin.OUT, value = 1)
构造函数的参数描述如下:
参数 | 描述 |
id |
|
mode |
|
pull |
|
value | 仅对 |
返回值:Pin
类对象
2. machine.Pin类的方法
设置外部中断
方法原型如下:
Pin.irq(handler=None,trigger=(Pin.IRQ_FALLING | Pin.IRQ_RISING))
方法的参数描述如下:
参数 | 描述 |
handler |
|
trigger | 配置可以生成中断的事件。 可能的值为:
|
返回值:回调对象
三、硬件设计
1. 例程功能
通过编程控制开发板上的LED灯,以500ms间隔交替闪烁,实现类似跑马灯的动态效果。
2. 硬件资源
- LED 灯:GPIO2 --> LED 【高电平:亮; 低电平:灭】
- boot按键:GPIO0 --> key 【按下:低电压;松开:高电压】
3. 原理图
四、软件设计
1. 程序流程图
程序
from machine import Pin
import time
# 实例化 LED
led = Pin(2, Pin.OUT, value=0)
# 实例化按键,配置 KEY 引脚模式及上下拉
key = Pin(0, Pin.IN, Pin.PULL_UP)
def KEY_INT_IRQHandler(key):
"""
按键中断服务函数
:param key: 管脚
"""
time.sleep_ms(10) # 延时 10ms
if key.value() == 0:
led.value(not led.value())
"""
----------------------------- 以下相当于 main() 函数 ----------------------------------
"""
# 定义中断,下降沿触发 按键中断服务函数
key.irq(handler=KEY_INT_IRQHandler, trigger=Pin.IRQ_FALLING )
while True:
pass
五、下载验证
开发板载的boot按键,可以控制板载的LED灯状态的翻转。