Pico PIO 汇编语法深度详解:标识符、指令、伪指令全解析
PIO 汇编语法
PIO 汇编器(pioasm)是将 PIO 汇编源文件转换为可执行机器码的工具,其输出的汇编代码可集成到 RP2040 的应用程序中(包括 SDK 构建的 C/C++ 程序、MicroPython 程序);PIO 汇编语法的核心组成之一是标识符,用于定义程序结构、常量、配置参数等,是编写 PIO 汇编程序的基础。
1.标识符
标识符是 PIO 汇编中用于定义常量、程序名称、内存偏移、配置参数的特殊指令,与寄存器操作无关,仅用于控制程序的结构和编译行为。以下是各标识符的语法、功能及使用规则:


2.数据类型
PIO 汇编中的数据类型主要用于定义整数常量、指定分支条件的目标地址,支持多种数值表示形式和自定义符号,具体类型及说明如下:

3.表达式
表达式用于与 pioasm 的值结合进行算数运算、位运算,运算结果为整数,可作为数据类型的取值,具体支持的运算及说明如下:

4.注释
注释用于在代码中添加说明文字,不会被汇编器编译,PIO 汇编支持三种注释形式,满足不同的注释需求:

5.标签
标签实际上只是自动的 .define,其值设置为当前程序指令的偏移量。
标签的形式如下: <symbol>: 或 PUBLIC <symbol>:。
标签必须从行首开始。
PUBLIC 的标签可以通过与 PUBLIC 的 .define 同样的方式从用户代码访问。
.program example
PUBLIC entry_point: ; 公共标签,供外部代码访问
set x, 10 ; 指令偏移量0
loop: ; 普通标签,对应偏移量1
jmp x-- loop ; 跳转到loop标签
jmp entry_point ; 跳转到entry_point标签
在上述示例中,entry_point 的值为 0(对应第一条指令),loop 的值为 1(对应第二条指令)。
6.指令
所有 PIO 汇编指令都遵循统一的语法格式,支持侧集(side-set)和延时(delay)配置,是 PIO 指令编写的标准规范:
<instruction> (side <side_set_value>) ([<delay_value>])
其中,各个参数含义如下:
示例如下:
.program example
.side_set 1 ; 配置1位侧集(必选参数)
pull side 0 ; 侧集值0,无延时
out y, 1 side 1 [5] ; 侧集值1,延时5个周期
jmp loop [3] ; 无侧集(错误,因为.side_set未指定opt,侧集是必选)
jmp loop side 0 [2] ; 侧集值0,延时2个周期
loop:
nop side 1 [0] ; 无操作,侧集值1,无延时
7.伪指令
伪指令是 pioasm 提供的语法糖,并非 PIO 硬件原生支持的指令,而是被汇编器转换为等效的原生指令,用于简化编程。目前 pioasm 仅提供一条伪指令:
nop伪指令:汇编器会将nop转换为原生指令mov y, y(将 Y 寄存器的值赋给自身,无任何副作用)。
它可以用在下面场景:
- 配合侧集操作:在无需执行核心指令时,通过
nop触发侧集控制 GPIO; - 增加延时:执行
nop需占用 1 个时钟周期,可用于微调时序; - 占位:填充指令内存,调整程序偏移。
.program example
.side_set 1
nop side 1 [5] ; 无操作,侧集值1,延时5个周期(总耗时6个周期:1个指令周期+5个延时周期)
nop [3] ; 无操作,无侧集(若.side_set未指定opt则错误),延时3个周期

PIO 汇编器(pioasm)是将 PIO 汇编源文件转换为可执行机器码的工具,其输出的汇编代码可集成到 RP2040 的应用程序中(包括 SDK 构建的 C/C++ 程序、MicroPython 程序);PIO 汇编语法的核心组成之一是标识符,用于定义程序结构、常量、配置参数等,是编写 PIO 汇编程序的基础。
浙公网安备 33010602011771号