|
|
没错,就是树莓派PICO (RP2040)上的PIO, 目前STC从AVR等单片机学到了很多,例如快速PWM,DMA, 硬件算数加速器等,比最早的原始STC进步了很多,这就叫博采百家之长。
如果能引入PIO(某种意义上的超简洁简易FPGA),会让STC单片机更深入很多之前不能进入的领域,希望厂家能考虑。
RP2040上的PIO子系统允许你为所谓的PIO状态机编写小型、简单的程序,RP2040在两个PIO实例中有八个分裂的状态机。 状态机负责设置和读取一个或多个gpio,将数据缓冲到处理器或从处理器 (或RP2040的超高速DMA子系统),并在需要数据或注意时通过IRQ或轮询通知处理器。 这些程序的运行周期精度最高可达系统时钟速度 (或程序时钟可以划分给不活泼的协议去慢慢的运行)。
PIO概要
RP2040有两个完全相同的PIO模块,RP2350有3个PIO模块。每个PIO块都独立连接到总线、GPIO和中断控制器。一个 PIO 块的结构图如下图所示。
图38
图38. PIO块结构图。RP2040有两个PIO块,每个块有四个状态机。四个状态机可以从一片共享指令内存中同时执行指令。
FIFO数据队列负责在PIO和系统之间缓冲传输的数据。每个状态机可以通过GPIO映射逻辑监视并操作最多30个GPIO。
可编程输入输出块(PIO)是一个非常灵活的硬件接口。它能支持许多IO标准,例如:
8080 和 6800 并行总线
I2C
3针I2S
SDIO
SPI、DSPI、QSPI
UART
DPI 或 VGA(通过电阻式DAC)
PIO的编程方式与处理器类似。每个PIO有四个状态机,每个状态机可以独立执行顺序代码,操作 GPIO 并传输数据。但不同于通用处理器,PIO 状态机是专门为输入输出设计的,因此具有确定性、精确的时间,并与固定功能的硬件紧密结合。
每个状态机都拥有以下内容:
两个 32 位移位寄存器 - 可以向任意方向位移任意比特
两个 32 位可擦写寄存器(scratch registor)
每个方向上(TX/RX)都有 4x32 位总线 FIFO,可以重新配置为单向 8x32 FIFO
支持小数的时钟分频器(16 位整数,8 位小数)
灵活的 GPIO 映射
DMA 接口,每个时钟周期最多可传输来自系统 DMA 的 1 个字
IRQ 标志设置/清除/状态查询
每个状态机及其相关的硬件所占用的芯片面积大约相当于标准的串行接口,如 SPI 或 I2C 控制器等。但是,PIO 状态机可以动态配置或重新配置,实现多种不同的接口。
状态机能用软件的形式编程,相比于像 CPLD 那样采用完全可配置的逻辑芯片,PIO能在同样的成本和功耗下提供更多的硬件接口。它还带来了人们更为熟悉的编程模型,和更简单的工具流程,因此人们可以利用 PIO 的灵活性直接进行编程,而不需要使用 PIO 库中事先定义好的接口。
PIO 不仅非常灵活,性能还非常高,这都要归功于每个状态机中的固定功能的硬件。在输出 DPI 时,PIO 能够在 48MHz 系统时钟的支持下,在活跃的扫描线期间提供 360Mb/s 的吞吐量。在这个例子中,一个状态机负责处理帧和扫描线的时间,并生成像素时钟,另一个负责处理像素数据,并解包行程编码的扫描线。
状态机的输入和输出可以映射到最多 32 个 GPIO 上(在 RP2040 中限制为 30 个 GPIO),所有状态机都能独立、同时访问任何 GPIO。例如,标准的 UART 代码允许 TX、RX、CTS 和 RTS 使用任意四个 GPIO,而 I2C 也允许将 SDA 和 SCL 映射到任意 GPIO 上。具体的自由度取决于 PIO 程序使用 PIO 针脚映射资源的方式,一个接口可以在一定数量的 GPIO 范围内自由移动。
3.2. PIO程序
四个状态机执行共享指令内存的程序。系统软件将内存加载至该区域,配置状态机和 IO 映射,然后将状态机设置为运行状态。PIO 程序可以来自多个地方:可以由用户直接汇编,可以来自 PIO 库,或者由用户的软件生成。
之后,状态机就会自动运行,系统软件通过 DMA、中断和控制寄存器与之交互,就像操作 RP2040 上的其他外设一样。对于更复杂的接口,PIO 提供了一个短小灵活的指令集,可以让系统软件更深入地操作状态机的控制流。
图39
图39. 状态机概览。数据通过一对 FIFO 输入输出。状态机可以执行一段程序,让这些 FIFO、
一系列内部寄存器和管脚之间传输数据。时钟分频器可以降低状态机的执行速度。
3.2.1. PIO程序
PIO 状态机执行短小的二进制程序。
PIO 库提供了像 UART、SPI 或 I2C 等通用接口的程序,因此许多情况下不需要自己编写 PIO 程序。但是,直接对 PIO 编程可以带来更大的灵活性,支持许多连设计者都没有考虑供的接口。
PIO 一共有九条指令:JMP、WAIT、IN、OUT、PUSH、PULL、MOV、IRQ 和 SET。关于每条指令的详细信息请参见3.4节。
尽管 PIO 只有九条指令,手工编写二进制 PIO 程序也非常困难。PIO 汇编是用文本形式描述的 PIO 程序,每条命令对应于二进制程序中的一条指令。
下面是一个 PIO 汇编程序的例子:
Pico 示例:https://github.com/raspberrypi/pico-examples/tree/master/pio/squarewave/squarewave.pio 第7-12行
7 .program squarewave
8 set pindirs, 1 ; Set pin to output
9 again:
10 set pins, 1 [1] ; Drive pin high and then delay for one cycle
11 set pins, 0 ; Drive pin low
12 jmp again ; Set PC to label `again`
SDK 自带了 PIO 汇编器,名为 pioasm。该程序接受一个 PIO 汇编程序的文本文件,其中可以包含多个程序,并输出汇编后的程序。这些汇编后的程序以 C 头文件的形式输出,头文件中包含了常量数组。更多信息请参考3.3节。 |
-
|