rp2 --- RP2040 专用功能

rp2 模块包含 RP2040 专用的函数和类,可用于 Raspberry Pi Pico。

更多信息请参阅 RP2040 Python 数据手册,示例代码请参阅 pico-micropython-examples

PIO 汇编语言指令

PIO 状态机使用一种自定义汇编语言进行编程,包含九条核心 PIO 机器指令。在 MicroPython 中,PIO 汇编例程被编写为带有装饰器 @rp2.asm_pio() 的 Python 函数,并使用 Python 语法。这类例程支持标准的 Python 变量和算术运算,以及以下用于编码 PIO 指令和指导汇编器的自定义函数。更多细节请参阅 RP2040 数据手册第 3.4 节。

wrap_target()

指定程序回绕后继续执行的位置。默认情况下这是 PIO 例程的起始处。

wrap()

指定程序结束并回绕的位置。如果未使用此指令,则会自动添加到 PIO 例程的末尾。回绕不消耗任何执行周期。

label(label)

在当前位置定义一个名为 label 的标签。label 可以是字符串或整数。

word(instr, label=None)

在汇编输出中插入一个任意的 16 位字。

  • instr:16 位的值

  • label:如果给定,则查找该标签并将标签的值与 instr 进行逻辑或运算

jmp(...)

此指令有两种形式:

jmp(label)
  • label:无条件跳转到的标签

jmp(cond, label)
  • cond:要检查的条件,为以下之一:

    • not_xnot_y:如果寄存器为零则为真

    • x_decy_dec:如果寄存器非零则为真,并执行后递减

    • x_not_y:如果 X 不等于 Y 则为真

    • pin:如果输入引脚被置位则为真

    • not_osre:如果 OSR 非空(尚未达到其阈值)则为真

  • label:如果条件为真则跳转到的标签

wait(polarity, src, index)

阻塞,等待引脚或 IRQ 线上的高/低电平。

  • polarity:0 或 1,表示等待低电平值还是高电平值

  • src:以下之一:gpio(绝对引脚)、pin(相对于状态机 in_base 参数的引脚)、irq

  • index:0-31,src 的索引

in_(src, bit_count)

将数据从 src 移入 ISR。

  • src:以下之一:pinsxynullisrosr

  • bit_count:要移入的位数(1-32)

out(dest, bit_count)

将数据从 OSR 移出到 dest

  • dest:以下之一:pinsxypindirspcisrexec

  • bit_count:要移出的位数(1-32)

push(...)

将 ISR 压入 RX FIFO,然后将 ISR 清零。此指令有以下形式:

  • push()

  • push(block)

  • push(noblock)

  • push(iffull)

  • push(iffull, block)

  • push(iffull, noblock)

如果使用 block,则当 RX FIFO 已满时指令会停顿。默认为阻塞。如果使用 iffull,则仅当输入移位计数达到其阈值时才压入。

pull(...)

从 TX FIFO 拉取到 OSR。此指令有以下形式:

  • pull()

  • pull(block)

  • pull(noblock)

  • pull(ifempty)

  • pull(ifempty, block)

  • pull(ifempty, noblock)

如果使用 block,则当 TX FIFO 为空时指令会停顿。默认为阻塞。如果使用 ifempty,则仅当输出移位计数达到其阈值时才拉取。

mov(dest, src)

src 的值移入 dest

  • dest:以下之一:pinsxyexecpcisrosr

  • src:以下之一:pinsxynullstatusisrosr;此参数可选地通过用 invert()reverse() 包裹来修饰(但不能同时使用两者)

irq(...)

设置或清除一个 IRQ 标志。此指令有两种形式:

irq(index)
  • index:0-7,或 rel(0)rel(7)

irq(mode, index)
  • mode:以下之一:blockclear

  • index:0-7,或 rel(0)rel(7)

如果使用 block,则指令会停顿,直到该标志被另一个实体清除。如果使用 clear,则清除该标志而不是置位。相对 IRQ 索引通过模 4 加法将状态机 ID 加到 IRQ 索引上。IRQ 0-3 对处理器可见,4-7 为状态机内部使用。

set(dest, data)

用值 data 设置 dest

  • destpinsxypindirs

  • data:值(0-31)

nop()

这是一条伪指令,汇编为 mov(y, y),且没有副作用。

.side(value)

这是一个可应用于任何指令的修饰符,用于控制 side-set 引脚值。

  • value:要在 side-set 引脚上输出的值(位)

.delay(value)

这是一个可应用于任何指令的修饰符,指定指令执行后延迟多少个周期。

  • value:延迟的周期数,0-31(如果使用 side-set 引脚,则最大值会减小)

[value]

这是一个修饰符,等效于 .delay(value)