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_x、not_y:如果寄存器为零则为真x_dec、y_dec:如果寄存器非零则为真,并执行后递减x_not_y:如果 X 不等于 Y 则为真pin:如果输入引脚被置位则为真not_osre:如果 OSR 非空(尚未达到其阈值)则为真
label:如果条件为真则跳转到的标签
- wait(polarity, src, index)
阻塞,等待引脚或 IRQ 线上的高/低电平。
polarity:0 或 1,表示等待低电平值还是高电平值
src:以下之一:
gpio(绝对引脚)、pin(相对于状态机in_base参数的引脚)、irqindex:0-31,src 的索引
- in_(src, bit_count)
将数据从 src 移入 ISR。
src:以下之一:
pins、x、y、null、isr、osrbit_count:要移入的位数(1-32)
- out(dest, bit_count)
将数据从 OSR 移出到 dest。
dest:以下之一:
pins、x、y、pindirs、pc、isr、execbit_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:以下之一:
pins、x、y、exec、pc、isr、osrsrc:以下之一:
pins、x、y、null、status、isr、osr;此参数可选地通过用invert()或reverse()包裹来修饰(但不能同时使用两者)
- irq(...)
设置或清除一个 IRQ 标志。此指令有两种形式:
- irq(index)
index:0-7,或
rel(0)到rel(7)
- irq(mode, index)
mode:以下之一:
block、clearindex:0-7,或
rel(0)到rel(7)
如果使用
block,则指令会停顿,直到该标志被另一个实体清除。如果使用clear,则清除该标志而不是置位。相对 IRQ 索引通过模 4 加法将状态机 ID 加到 IRQ 索引上。IRQ 0-3 对处理器可见,4-7 为状态机内部使用。- set(dest, data)
用值 data 设置 dest。
dest:
pins、x、y、pindirsdata:值(0-31)
- nop()
这是一条伪指令,汇编为
mov(y, y),且没有副作用。- .side(value)
这是一个可应用于任何指令的修饰符,用于控制 side-set 引脚值。
value:要在 side-set 引脚上输出的值(位)
- .delay(value)
这是一个可应用于任何指令的修饰符,指定指令执行后延迟多少个周期。
value:延迟的周期数,0-31(如果使用 side-set 引脚,则最大值会减小)
- [value]
这是一个修饰符,等效于
.delay(value)。