MicroPython 中断支持大全:树莓派 Pico 能用哪些中断?不能用哪些?
1.具有中断功能的外设
在之前 MicroPython 针对于树莓派 Pico 的版本中(以 v1.23.0 为例),只有以下外设具有中断功能:
| 外设 | 中断方法的描述 |
|---|---|
| 引脚 Pin 类 | 外部电平变化可触发 GPIO 外部中断,触发中断后调用中断回调函数。 |
| 数字音频接口 I2S 类 | 当缓存 buf 对象被填满或清空时会触发中断,触发中断后调用中断回调函数。 |
| 实时时钟 RTC 类 | 当定时时间到达时触发中断,触发中断后调用中断回调函数。 |
| 定时器 Timer 类 | 定时执行中断回调函数,系统/硬件定时器可设置周期或一次性回调(类似定时中断), |
| 适合周期性任务或超时处理。 | |
| 直接内存读取 DMA 类 | DMA 数据传输完成或接收到 null trigger 时触发中断,触发中断后调用中断回调函数。 |
| 状态机 StateMachine 类 | 状态机相关的中断,可由数字位 0 或 1 触发,触发中断后调用中断回调函数。 |
可以看到,MicroPython 的 SDK 并没有提供其他外设的中断功能,例如串口的中断接收,但这并不意味着我们不能使用其他方法代替轮询(在 while 循环中使用 UART.any() 判断串口是否有数据可以接收)的方式,我们可以使用定时器定时查询串口状态、多线程、协程等方式更高效无误地完成串口数据地及时接收。
在最新的 MicroPython 针对于树莓派 Pico 的版本(以 v1.26.0 为例),新增了 I2CTarget 类和 UART 类的中断,如下面表格所示:
| 外设 | 中断方法的描述 |
|---|---|
| I2CTarget 类 | 可以把 Pico(或其他板)配置为 I²C 从机(target),并对多种事件注册 IRQ 回调(包括地址匹配、读/写请求、读/写结束等)。部分事件要求使用 hard IRQ(实时性要求高时需 hard=True)。 |
| UART 类 | 已在多个端口实现中断触发(包括 rp2),支持的触发类型包括 IRQ_RXIDLE、IRQ_RX、IRQ_TXIDLE、IRQ_BREAK 等(可按端口有差异,rp2 支持 RX、RXIDLE、TXIDLE 等)。 |
2.串口中断相关控制方法
UART.irq() 是 Pico 配置串口中断的核心方法,用于为指定 UART 实例(如 UART0/UART1)绑定中断处理函数,当串口发生你预设的事件(如接收到字符、接收线空闲)时,会自动触发该函数执行,无需主程序轮询串口状态,大幅提升串口响应效率。
官方提供的串口中断方法如下所示:



针对树莓派 Pico 对应的RP2040(表中 “RP2” 行) ,它支持的串口中断触发源有:
IRQ_RXIDLE:接收 ≥1 个字符后 RX 线空闲触发(适合处理完整数据段);IRQ_TXIDLE:仅当发送消息长度 >5 字符时触发,且触发时仍有 5 个字符待发送;IRQ_BREAK:检测到 RX 线 Break 状态触发,触发后需接收有效字符才能再次触发。


在之前 MicroPython 针对于树莓派 `Pico` 的版本中(以 `v1.23.0` 为例),只有以下外设具有中断功能
浙公网安备 33010602011771号