树莓派Pico中MicroPython PIO中断引发循环及参数错误问题
问题分析与修复方案
核心问题拆解
- 语法错误:初始化StateMachine时,
Pin(8)后面漏写了闭合括号,导致代码解析失败 - IRQ回调参数不匹配:PIO状态机的irq回调仅需接收1个参数(状态机实例),但定义的
irqHandler写了2个参数,直接触发TypeError: function takes 2 positional arguments but 1 were given - PIO程序无限循环触发IRQ:PIO程序默认会重复执行,代码里的
irq(block, 0)会阻塞并持续触发IRQ,导致系统卡死在循环中,连print('Run')都无法执行,必须重启Pico
修复后的完整代码
from machine import Pin, PWM from time import sleep, sleep_ms, time_ns import rp2 def main(): # 补全漏写的闭合括号 sm = rp2.StateMachine(0, test, freq=180000, sideset_base=Pin(8)) sm.irq(irqHandler) sm.active(1) print('Run') sleep(5) print('Slept') # 停止状态机,避免持续触发IRQ sm.active(0) # 调整回调参数为单参数,匹配PIO要求 def irqHandler(sm): print('IRQ servo') @rp2.asm_pio(sideset_init=rp2.PIO.OUT_LOW) def test(): mov(x,x) .side(1) mov(x,x) .side(0) irq(block, 0) # 添加wrap()让程序执行一次后停止,不再循环 wrap()
关键修复说明
- 先补全
Pin(8)后的闭合括号,解决最基础的语法解析问题 - 将
irqHandler的参数改为仅保留sm,符合PIO状态机irq回调的参数规范 - 在PIO程序末尾添加
wrap(),让程序执行一遍后停止;也可以在主程序sleep结束后调用sm.active(0)手动停止状态机,两种方式都能解决无限IRQ循环的问题
内容的提问来源于stack exchange,提问作者user7117046
相关产品推荐
相关产品推荐

