在下面实验中,我们使用 风雅一号板-通用兼容扩展板 。

在使用外部中断时,我们需要明确在哪些引脚使用中断,中断触发的条件和中断响应后需要进行的操作。
在以下代码中,我们设置 GPIO22 为按键输入引脚使用上拉电阻使能,配置 GPIO22 为下降沿触发中断,在中断响应后执行 handle_interrupt 函数,切换 led_state 的值和 LED 灯状态,并在中断打印 LED 状态信息。
在主程序的 while 循环中,输出调试信息 "Waiting for button press...",主循环不会干扰中断的执行,中断由硬件触发且实时响应。
示例代码如下,在配套资料的文件夹:elegance-devkit v1\Demo\02 GPIO_EXTI 中:
Python
# Python env : MicroPython v1.23.0
# -*- coding: utf-8 -*-
# @Time : 2024/6/14 上午11:10
# @Author : 李清水
# @File : main.py
# @Description : GPIO外部中断实验,完成按键按下切换LED点亮/熄灭任务
# ======================================== 导入相关模块 ========================================
# 硬件相关的模块
from machine import Pin
# 时间相关的模块
import time
# ======================================== 全局变量 ============================================
# LED状态标志位:True 表示点亮,False 表示熄灭
led_state: bool = False
# ======================================== 功能函数 ============================================
def handle_interrupt(pin: Pin) -> None:
"""
GPIO外部中断的回调函数,用于切换LED的点亮/熄灭状态。
中断触发后,先进行按键消抖处理。确认按键仍然按下后,
根据当前LED状态切换为点亮或熄灭,并打印状态信息。
Args:
pin (Pin): 触发中断的GPIO引脚实例。
Returns:
None
"""
# 声明全局变量
global LED
global led_state
# 消抖处理:延时50ms
time.sleep_ms(50)
# 再次确认按键是否仍然按下(GPIO引脚电平为低)
if pin.value() == 0:
# 切换LED状态
led_state = not led_state
if led_state:
# LED 点亮
LED.on()
print("The LED is ON")
else:
# LED 熄灭
LED.off()
print("The LED is OFF")
# ======================================== 初始化配置 ==========================================
# 上电延时3s
time.sleep(3)
# 打印调试消息
print("FreakStudio: Using GPIO EXTI interrupt to toggle LED")
# 设置GPIO 22 为按键输入引脚,启用上拉电阻
KEY = Pin(22, Pin.IN, Pin.PULL_UP)
# 设置GPIO 25为LED输出引脚,下拉电阻使能
LED = Pin(25, Pin.OUT, Pin.PULL_DOWN)
# 配置KEY的中断:中断回调函数为handle_interrupt,下降沿触发
KEY.irq(handler=handle_interrupt, trigger=Pin.IRQ_FALLING)
# ======================================== 主程序 ============================================
# 主循环:程序空闲时输出按键状态信息
while True:
# 等待中断触发,打印调试信息
print("Waiting for button press...")
time.sleep(1)
烧录代码,打开终端,可以看到不按下按键时,终端输出如下:

按下按键时,LED 灯点亮;再次按下时,LED 灯熄灭,实验现象类似于 3.1 中 GPIO 读写例程。
第一次按下按键时:

当第二次按下按键时:
这里,我们在代码中增加了类型注解,并符合 PEP8 规范,所谓类型注解就是 Python 中用来标明变量、函数参数和返回值数据类型的一种机制,简单来说就是在代码中明确告诉别人或者程序工具:某个变量、函数参数或者返回值是什么类型(比如整数、字符串、列表等),它就像在给变量和函数做备注,比如说,你定义了一个函数接收数字,但是有人传了个文字进来,类型注解可以提前警告你哪里出问题了。
关于类型注解的更多内容,可以查看如下文章:
https://mp.weixin.qq.com/s/7r4hgM3a187si_D5ReEMCA
同时,我们整个代码遵守 PEP8 规范,PEP8 是 Python 编程语言的代码风格指南 ,全称是 Python Enhancement Proposal 8 (Python 增强提案第 8 号),它是一份文档,规定了编写 Python 代码时的最佳实践和格式要求,简单来说就是一种代码书写规则,类似写作文的格式要求。它教你怎么排版代码更整齐、更好看,比如变量名要用小写字母加下划线、函数之间留两行空白、每行代码不要超过 79 个字符等等,它的目标就是让大家写出来的代码风格统一,看起来更舒服,同时也更容易维护和合作。
关于 PEP8 规范的更多内容,可以查看如下文章: