RP2040 PICOSDK食用指南——PIO1简介


它有9个指令
这9个指令实际上只属于两类中的一类
一类是从一个地方移动到另外一个位置比如将TX FIFO移动到ScrachX或者Y什么的
,主要是FIFO 寄存器和GPIO
另外一类就是程序流程控制
JMP指令:获取程序计数器,而不是增加到下一行,而是询问一个布尔问题
看起来它检查了一个条件,也可以不检查,可以将程序计数器跳转到您指定的代码中的其他位置
然后程序计数器会像往常一样开始递增直到它碰到另外一个JMP
(也许会跳回顶部
WAIT指令:当您使用等待指令时,程序会暂停,当满足某些条件时,您就可以指定该条件是什么,我们将看看您有哪些选择
当满足该条件时,继续
因此您可以等待来自状态机的其中一个中断,这些标志可以相互来回发送信号,因此如果状态机正在运行并且遇到等待指令它可以等待直到状态机2向其发送信号然后两者同步
所以这是个状态机之间的同步机制,您也可以等待GPIO变为高/低电平
比如在构建SPI通道的PIO实现时,也许您可以让您的PIO状态机在芯片选择线上停顿而不执行任何指令,当他变低的时候一切都会启动,
它也可以用于实现UART,UART通道也许您会等待起始位,因此它允许您暂停程序直到满足某些条件
IRQ指令:是状态机生成,这些标志的机制,因此状态机可以抛出一个IRQ,该IRQ被状态机2观察以进行同步,正如我所提到的,通过这些IRQ指令,每个状态机也可以生成一个中断回到ARM,可以看作标志机制IRQ,它会影响程序流
IN指令:IN指令是将数据从指定的源移动到移位寄存器
,所以该指令的目的地是输入移位寄存器。你可以用这个玩一些游戏,比如说实际上只将两位从临时X寄存器移动到输入输入移位寄存器中
OUT指令:类似的有一个输出指令,您可以在其中指定源
主要是您希望数据到达的目的地,而数据的来源将是输出移位寄存器。因此,如果OUT X,这意味着请将数据从输出移位寄存器移动到X暂存寄存器
也可以将输出移位寄存器中的两位移动到X暂存寄存器,有输入和输出将数据移入输入移位寄存器或者移出输出移位寄存器
PUSH:将数据从输入移位寄存器移出到RX FIFO。因此,您点击了PUSH指令,这就是将数据推送至ARM的过程,将数据从TX FIFO拉入输入移位寄存器,
然后移入uh输出寄存器
因此ARM根据PIO正在实施的协议向我们发送一些他想要放入GPIO的数据,这些数据出现在TXFIFO中,我们将其吸入状态机并将其序列化为GPIO
因此,正如名称暗示的那样,推拉移动允许您指定源和目标,它表示请将X临时寄存器或Y临时寄存器中的任何内容或者我源中的任何内容移动到我的目标
您的目的地可以包括这里的五个寄存器中的任何一个,目的地可能还包括GPIO,您说请将X SCRACH寄存器的内容移动到32位以内的GPIO。

PON!然后所有的32位都会切换GPIO
语法是exec ,它的意思是将指定的寄存器内容解释位命令。正确的?
这里的每条指令都只是一条16位的数字
这个表只是告诉我们这个16位数字中的·1每一位代表什么。如果我们在Y scratch寄存器中有一个16位数字,并且该数字被正确格式化为指令,
那么您可以说请获取Y临时寄存器中的数据,数据并执行它
您可以向任何寄存器写入值,但是要遵守约束在表中,此处数据的位宽只有五位,这意味着使用此设置指令,您只能将信息写入这些寄存器,将信息设置为这些寄存器的值,这些值,不得大于32,如果您想将其中一个寄存器的值初始化为大于该值的数字,比如想出其它机制将数字放入该寄存器中,
比如您可以让ARM将一个较大的旧数字弹出到TX FIFO中,执行一条PULL指令将该数字从TX FIFO拉到输出移位寄存器中,然后您可能执行一条移动X指令,该指令表示,请获取输出移位寄存器的内容并将其移动到X暂存寄存器。现在,您的X暂存器中已经有了一个很大的旧数字。正确的?所以您必须在这里晚一些游戏。

时钟分频器~可以减慢系统时钟相对于PIO状态机的速度。自动推送和自动合并。我们稍后可以在数据表中查看这一点,但是请允许我花一分钟谈论它
输入移位寄存器输出移位寄存器上都有移位计数器,因此如果您说请将我的输出移位寄存器中的一位移动到引脚,它将使移位计数器增加1,如果移动两位,移位计数器就会增加2.因此他会一次移出一位数据,或者每次移出n位(其中n为指定值)。
自动push/pull,允许您在计算出从输出移位寄存器移出一定数量的位时通知系统,请自动执行推/拉指令,我不会明确的写一个拉指令。我希望你计算一下,我从这个寄存器中移出的位数。当他达到我指定的阈值(例如8)时候,就会自动从TX FIFO中将另一个数据拉回输出移位,寄存器。所以这是一种机制,然后类似的在相反的方向上进行推送。当我计算出进入输入移位寄存器的一定数量的位数时,会自动将推送推送到RX5/。因此,当您只有32条指令可用的时候,自动推送和拉取功能可以为您的PIO程序节省一条拉取/推送指令。
您关心的是能够保存这些单独的·1指令,好的这就是您,可以实现这一点的机制。连接TX FIFO和RX FIFO的FIFO均为32位位宽,深度为4个样本,如果您正在编写一个程序,其中您只打算将数据从ARM发送到PIO机器,例如VGA驱动,那么您只会将数据发送到引脚,您可以将两个FIFO连接起来这样对于每个可以接触GPIO的指令,您都可以在一个方向的引脚映射中获得一个深度为8个样本的FIFO
PIN MAPPING IN指令可以接触GPIO,请从引脚拉入,out指令可以推出到GPIO,move指令可以将信息从寄存器移动到GPIO,还可以为每条可以接触GPIO的指令配置GPIO,您可以配置与该指令相关的GPIO,如果您说设置引脚,则在PIO程序的配置中成请您在说将引脚设置为两个时候所谈论的引脚。
并且您可以将不同的引脚配置到不同的指令。因此,如果您说将X临时寄存器的内容移动到引脚,那么这些引脚可能是您所谈论的一组不同的引脚,而不是当您说将引脚设置为某个值时所谈论的不同集合,或者他们可以重叠他们可以谈论相同的引脚。
其中存在一些限制,接下来查看代码的时候会讨论这些限制
side set是我提到的一个功能,对于每条指令,都可以与该指令同时执行,您还可以说希望最多5个引脚按照您指定的方式更改其值,因此您可以说,例如将X2侧设置为1,这意味着,在这个循环中请将X临时寄存器的内容设置为2,同时转到我已配置为sid设置GPIO的GPIO,并将其设置为一。这两件事同时发生,这对于SPI通道之类的东西非常方便,您可以在其中执行诸如从数据线读取数据之类的操作,同时切换时钟,SID允许您同时执行这两件事
WRAPPING
每个程序都是从顶部到底部的。也许有跳跃,因此,也许你会移动一点点,但是当你到达程序的底部指令时,他会循环回到顶部,然后再次开始执行。
所以他循环执行。wrapping允许您,假设您的程序有一些您只想执行一次的指令集,也许您正在初始化寄存器值或者其它东西。然后还有另一组指令,
您希望在程序运行期间一遍又一遍的执行。这些指令
您可以使用跳转指令来实现这一点,该指令会将您带回到该代码段并无条件的反复跳转。为了在您无法承受的情况下节省跳转该指令。回绕允许您设置一个目标回绕点,以便当您到达程序底部时,您可以说,请不要到达顶部,请回到我指定的这个回绕点。
这样她就不会一直绕道顶部 而是到达指定点
自动推拉只是为了节省您的推送指令或拉取指令
wrapping是为了节省跳转
寄存器一共有五个,其中一个是计数器,两个临时寄存器想干嘛干嘛,然后两个用于FIFO,这些状态机也可以直接访问GPIO
这些中断,正如数据表所称,他们更像是一种标志,您可以在这些状态机之间发出信号,也可以通过i发出中断的方式向ARM发出中断信号
PIO的汇编指令集只有9条指令,
浙公网安备 33010602011771号