我正在尝试在加载了 Adafruit Feather MicroPython 1.2 的基于 RP2040 的自定义板上用 MicroPython 实现 UART 中断。虽然我知道此功能通常适用于 WiPy 设备,但它对于我的自定义板至关重要。
我无法进行硬件更改,因此我在引脚 4 (TXD) 和 5 (RXD) 上初始化了 UART,并在 RXD 上分配了引脚更改中断。我的代码:
import _thread
from machine import Pin, UART, I2C, mem32, Timer
from micropython import schedule
import micropython
# ... Other code ...
Serial = UART(1, baudrate=115200, tx=txPin, rx=rxPin)
rxTrig = False
def onSerial(p):
global rxTrig
if Serial.any():
rxTrig = True
# ... Other code ...
def main():
global rxTrig
rxPin.irq(handler=onSerial, trigger=Pin.IRQ_RISING, hard=True)
RXD 上的每个上升沿都会调用 onSerial
,如果数据可用,则会将 rxTrig
设置为 True,这在 Core 1 上运行的连续 while 循环中使用。这可以无缝工作。
我实现了两个嵌套计时器,由于 Core 1 上的无限循环,它们被卡住了。我怀疑计时器正在 Core 1 上执行,导致了这种情况。因此,我不再使用变量
rxTrig
和 while 循环,而是通过修改 onSerial(p)
代码来使用另一个引脚更改中断:
cmdPin = Pin(0, Pin.OUT)
# ... Other code ...
def onSerial(p):
global rxTrig
if Serial.any():
cmdPin.on()
# ... Other code ...
def onCommand():
# Consume the command and execute the actions
cmdPin.off()
def main():
cmdPin.irq(handler=onCommand, trigger=Pin.IRQ_RISING, hard=True)
cmdPin
按预期更改了其输出,但中断未触发。如何正确实施?
不知怎的,
cmdPin = Pin(0, Pin.OUT)
没有正确执行。一旦我重新启动 Thonny,它就开始工作,现在我在自定义 RP2040 板上成功地拥有带有中断的 UART。
mdPin = Pin(0, Pin.OUT)
# ... Other code ...
def onSerial(p):
global rxTrig
if Serial.any():
cmdPin.on()
# ... Other code ...
def onCommand():
# Consume the command and execute the actions
cmdPin.off()
def main():
cmdPin.irq(handler=onCommand, trigger=Pin.IRQ_RISING, hard=True)
这是正确的代码。