PIO 深度解析:控制寄存器如何掌控状态机工作
树莓派 Pico 上控制 PIO 的相关寄存器
PIO0 和 PIO1 寄存器的基地址为 0x502000000 和 0x503000000。
我们可以通过读写 CTRL 控制寄存器来完成重启时钟分频信号、重启或使能状态机等工作:

可以读取 FSTAT 寄存器获取 FIFO 状态:

我们可以通过 FDEBUG 寄存器设置 TX FIFO 暂停与溢出、RX FIFO 空读取与暂停来调试 FIFO:

我们可以通过 FLEVEL 寄存器读取 FIFO levels:

我们可以通过 TXFx 寄存器和 RXFx 寄存器来直接读写 FIFO(x=0~3):

我们可以对 IRQ 寄存器写入 1 来清除状态机中断标志位:

我们可以对 IRQ_FORCE 寄存器写入 1 强制断言相应的 IRQ:

我们可以通过读取 DBG_CFGINFO 寄存器来读取指令内存的大小、状态机的数量、TX/RX FIFOs 的深度:

我们可以通过 EXECCTRL 寄存器控制状态机的行为,包括使能 Side-set 侧集操作、跳转 Pin 引脚、WRAP 折返等:


我们可以通过 SHIFTCTRL 寄存器控制 OSR 和 ISR 移位器的行为,包括合并 FIFO、PUSH 和 PULL 操作、设置自动加载和自动推送的计数器阈值等:


我们可以通过 PINCTRL 控制引脚,包括 SET 与 OUT 操作计数、以及四种操作的引脚基地址读写等:

关于 INSTR 指令寄存器、CLKDIV 分频寄存器、INTE 中断使能寄存器、INTF 中断强制触发寄存器、INTR 原始中断寄存器和 INTS 掩码中断寄存器上述已经进行讲解,这里仅对关于 PIO 控制中一些关键的寄存器进行讲解,余下寄存器大家可以自行查看手册。关于 PIO 的更多原理和底层机制这里不再详细讲解,这里我们内容重点在于使用 PIO 实现不同通信接口,感兴趣的同学可以查看 RP2040 数据手册和 Pico SDK 开发手册对 PIO 底层原理做更多学习。

PIO0 和 PIO1 寄存器的基地址为 0x502000000 和 0x503000000。
浙公网安备 33010602011771号