前置知识

官方文档:RP2040 Datasheet: A microcontroller by Raspberry Pi.

使用记录

1. PIO的时钟

PIO的全速时钟为125MHz

分频配置通过SDK的APIpio_sm_set_clkdiv_int_frac8pio_sm_set_clkdiv

也可以配置PIO结构体的pio->sm[0].clkdiv属性

2. PIO SM的PULL指令阻塞

pull block可以使TX-FIFO为空时暂停指令执行

3. 修改系统时钟频率

hardware/clocks.h下的set_sys_clock_khz函数可以方便地修改系统时钟

时钟频率不能随意设置,使用官方提供的脚本src/rp2_common/hardware_clocks/scripts/vcocalc.py可以计算时钟配置参数

4. 双核编程

详见官方文档2.8.2节

rp2040内部有两个Cortex M0+核心,两个内核有各自独立的Nested Vectored Interrupt Controller (NVIC) 及Debug Access Port (DAP),共用一个Single-cycle IO block (SIO),也就是说同一个引脚在一个时钟周期只能被一个内核操作

部分内部寄存器被两个内核同时操作时有一定的仲裁机制,通常Core0的操作是优先的

两个内核之间的通信可以使用内部的位宽32、深度8的FIFO(MailBox)

pico/multicore.h下的multicore_launch_core1可以将函数代码运行在Core1上

5. PIO和CORE同时操作GPIO

PIO和CORE初始化GPIO使用的函数是不同的逻辑,PIO初始化GPIO会将GPIO的功能指定为GPIO_FUNC_PIO0GPIO_FUNC_PIO1,而CORE会将其功能指定为GPIO_FUNC_SIO

因此GPIO不能被PIO和CORE同时操作