You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派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()

关键修复说明

  1. 先补全Pin(8)后的闭合括号,解决最基础的语法解析问题
  2. 将irqHandler的参数改为仅保留sm,符合PIO状态机irq回调的参数规范
  3. 在PIO程序末尾添加wrap(),让程序执行一遍后停止;也可以在主程序sleep结束后调用sm.active(0)手动停止状态机,两种方式都能解决无限IRQ循环的问题

内容的提问来源于stack exchange,提问作者user7117046

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 03:57:07