之前已经说过,PIO支持的多条指令.
JMP命令 => JMP (条件) [地址],条件可以是如下数值:
- 000 = 无条件(默认)
- !X = X 寄存器为0
- X-- = X 寄存器在减1后非零
- !Y = Y 寄存器为0
- Y-- = Y 寄存器在减1后非零
- X!=Y = 两者不等
- PIN = 引脚状态
- !OSRE = 输出寄存器非空
WAIT命令 => wait [状态,1/0] [gpio/pin/irq] [num],这个命令如下填充:
- 状态 = 需要等待当前标志变为1或者0.
- num = 当是gpio的时候,这里指的是实际GPIO号,当是pin的时候,这里是sm pin,当然irq的时候,这里指的是中断号.
IN命令 => in [源], [位数],从源输入数据到ISR,这个命令填充如下:
- 源可以是:PINS,X,Y,NULL(全0),ISR,OSR
- 位数:1 - 32位
OUT命令 => out [目标], [位数],从OSR输出内容到目的地,这个命令填充如下:
- 目标可以是:PINS,X,Y,NULL(全0),PINDIR,PC,ISR,OSR
- 位数:1 - 32位
PUSH/PULL 命令 => push/pull [iffull/ifempty] [block/unblock],主要是推送/抓取移位寄存器的数据,这个命令填充如下:
- 如果iffull/ifempty为1,则如果队列满(对PUSH而言)/空(对PULL而言),则不进行任何操作,默认0.
- 如果block,则阻塞等待直至有效.
MOV命令 => mov [目标] (操作) [源],其中操作是可选的,如果操作是!或者~,则数据取反,如果操作是::则按位翻转.
IRQ 命令 => irq (set/nowait/wait/clear) [中断号],具体参数如下:
- irq / irq set / irq set nowait => 不等待IRQ
- irq wait => 等待IRQ清除
- irq clear => 清除IRQ
- 中断号,范围0 ~ 7
SET 命令 => set [目的地] [值],目的地可以是PINS,PINDIR,X,Y,值范围可以是0 - 31.
到此为止所有指令都描述完了,等下次再来分析例子.