类 StateMachine – 访问 RP2040 的可编程 I/O 接口

StateMachine 类提供访问RP2040的PIO(可编程I / O)接口。

有关汇编 PIO 程序的信息,请参阅 rp2.asm_pio().

构造函数

class rp2.StateMachine(id[, program, ...])

获取编号为id的状态机。RP2040 有两个相同的 PIO 实例,每个实例有 4 个状态机:所以总共有 8 个状态机,编号为 0 到 7。

可选择给定程序初始化程序:见 StateMachine.init.

方法

StateMachine.init(program, freq=- 1, *, in_base=None, out_base=None, set_base=None, jmp_pin=None, sideset_base=None, in_shiftdir=None, out_shiftdir=None, push_thresh=None, pull_thresh=None)

配置状态机实例以运行给定的程序。

该程序被添加到该 PIO 实例的指令存储器中。如果指令存储器已经包含该程序,则重新使用其偏移量以节省指令存储器。

  • freq是以赫兹为单位运行状态机的频率。默认为系统时钟频率。

    时钟分频器计算为,因此可能存在轻微的舍入误差。system clock frequency / freq

    最小可能的时钟分频器是系统时钟的 65536 分之一:因此在默认系统时钟频率 125MHz 下,freq的最小值 为 1908。要以较慢的频率运行状态机,您需要使用 machine.freq().

  • in_base是用于 in()指令的第一个引脚。

  • out_base 是用于 out()指令的第一个引脚。

  • set_base是用于set()指令的第一个引脚。

  • jmp_pin是用于指令的第一个引脚。 jmp(pin, ...)

  • sideset_base是用于侧面设置的第一个引脚。

  • in_shiftdir是ISR将转移,无论是方向 PIO.SHIFT_LEFTPIO.SHIFT_RIGHT

  • out_shiftdir是OSR将转移,无论是方向 PIO.SHIFT_LEFTPIO.SHIFT_RIGHT

  • push_thresh是触发自动推送或有条件重新推送之前的阈值(以位为单位)。

  • pull_thresh是触发自动推送或有条件重新推送之前的位阈值。

StateMachine.active([value])

获取或设置状态机当前是否正在运行。

>>> sm.active()
True
>>> sm.active(0)
False
StateMachine.restart()

重新启动状态机并跳转到程序的开头。

此方法使用 RP2040 的 SM_RESTART寄存器清除状态机的内部状态 。这包括:

  • 输入和输出移位计数器

  • 输入移位寄存器的内容

  • 延迟计数器

  • 等待 IRQ 状态

  • 使用停止的指令运行 StateMachine.exec()

StateMachine.exec(instr)

执行单个 PIO 指令。用于 asm_pio_encode 对来自给定字符串instr的指令进行编码。

>>> sm.exec("set(0, 1)")
StateMachine.get(buf=None, shift=0)

从状态机的 RX FIFO 中拉出一个字。

如果 FIFO 为空,它会阻塞直到数据到达(即状态机推送一个字)。

该值在返回前右移位移位,即返回值为。word >> shift.

StateMachine.put(value, shift=0)

将一个字推送到状态机的 TX FIFO。

如果 FIFO 已满,它将阻塞直到有空间(即状态机拉出一个字)。

该值首先左移移位位,即状态机接收。 value << shift.

StateMachine.rx_fifo()

返回状态机的 RX FIFO 中的字数。值为 0 表示 FIFO 为空。

用于在调用之前检查数据是否正在等待读取 StateMachine.get().

StateMachine.tx_fifo()

返回状态机的 TX FIFO 中的字数。值为 0 表示 FIFO 为空。

用于检查是否有空间使用 StateMachine.put().

StateMachine.irq(handler=None, trigger=0 | 1, hard=False)

返回给定 StateMachine 的 IRQ 对象。

可选地配置它。