第一个PIO程序
RP2040 上的 PIO 子系统允许为所谓的 PIO 状态机编写小型、简单的程序,其中 RP2040 在两个 PIO 实例中有八个拆分。 状态机负责设置和读取一个或多个 GPIO,缓冲传入或传出处理器(或 RP2040 的超快速 DMA 子系统)的数据,并在需要数据或注意时通过 IRQ 或轮询通知处理器。
这些程序以高达系统时钟速度的周期精度运行(或者程序时钟可以被划分为以较慢的速度运行,以实现不太活跃的协议)。
PIO 状态机比 RP2040 上的通用 Cortex-M0+ 处理器紧凑得多。 事实上,它们的大小(因此成本)与标准 SPI 外围设备相似,例如 RP2040 上也有 PL022 SPI,因为它们的大部分区域都用于所有串行外围设备通用的组件,如 FIFO、移位 寄存器和时钟分频器。 指令集小而规则,因此在解码指令上花费的硅片并不多。 无需为将状态机专门用于单个 I/O 任务而感到内疚,因为有 8 个!
尽管如此,在 I/O 方面,PIO 状态机在一个周期内比 Cortex-M0+ 完成的工作要多得多:例如,对 GPIO 值进行采样、切换时钟信号并推送到 FIFO 全部合二为一 循环,每一个循环。 权衡是 PIO 状态机不能远程运行通用软件。 正如我们将看到的,对 PIO 状态机进行编程对于以前编写过汇编代码的任何人来说都非常熟悉,而对于那些没有编写过汇编代码的人来说,小指令集应该很快就能上手。
对于简单的硬件协议 - 例如 PWM 或双工 SPI - 单个 PIO 状态机可以自行处理实现硬件接口的任务。 对于更多涉及的协议,例如 SDIO 或 DPI 视频,最终可能会使用两个或三个。