- 嵌入式
- 语言运行时
- 编程语言
- 解释器
- 编译器
- 物联网
- 系统编程
本指南以仓库内 docs/rp2/general.rst 为骨架,系统梳理 MicroPython RP2 端口对 Raspberry Pi RP2040 / RP2350 芯片的硬件支持范围、核心外设资源与固件构建部署流程。读完本文,你将掌握 RP2xxx 芯片的关键规格参数(CPU、SRAM、Flash、外设数量),理解 rp2 端口在 ports/rp2 目录中的组织方式,并能独立完成从源码编译固件到烧录部署的完整实操。
一、RP2 端口概览
MicroPython 的 rp2 端口(port)为 Raspberry Pi Foundation 的 RP2xxx 系列微控制器提供官方支持,覆盖 RP2040 与 RP2350 两款芯片,对应市面上常见的 Raspberry Pi Pico、Pico W、Pico 2、Pico 2 W 等开发板。该端口位于仓库的 ports/rp2 目录,其能力在 ports/rp2/README.md 中有明确清单:
- REPL:通过 USB VCP 提供,也可选配 UART(默认映射到 GP0/GP1);
- 文件系统:内部 Flash 使用 littlefs2(同时支持 FAT 与 ROMFS,见 ports/rp2/mpconfigport.h 中
MICROPY_VFS_LFS2/MICROPY_VFS_FAT定义); - 代码生成:支持原生代码生成(native code generation)与内联汇编(inline assembler);
time模块:提供 sleep、time、ticks 系列函数;os模块:支持 VFS;machine模块:提供Pin、ADC、PWM、I2C、SPI、SoftI2C、SoftSPI、Timer、UART、WDT等类;rp2模块:提供可编程 IO(PIO)支持。
从源码结构看,端口的硬件抽象实现分散在 machine_adc.c、machine_pwm.c、machine_uart.c、rp2_pio.c 等文件中,并通过 mpconfigport.h 中MICROPY_PY_MACHINE_*宏逐一开关。
二、RP2040 芯片规格详解
根据 docs/rp2/general.rst,RP2040 采用 40nm 硅工艺制造,封装为 7x7mm 的 QFN-56 SMD。
核心特性
- CPU:双核 Arm Cortex-M0+,标称 133 MHz,官方资料说明可超频至 400 MHz 以上;
- SRAM:264 KB,分为 6 个独立 bank;
- 存储架构:芯片内部没有Flash 或 EEPROM,复位后由 bootloader 从外部 Flash 或 USB 总线将固件加载到内部 SRAM 执行;
- 外部 Flash 接口:QSPI 总线控制器,最多支持 16 MB 外部 Flash;
- 电源管理:片上可编程 LDO 用于生成内核电压;
- 时钟:2 个片上 PLL,分别生成 USB 时钟与内核时钟;
- GPIO:30 个 GPIO 引脚,其中 4 个可选用作模拟输入。
外设资源
| 外设 | 数量/规格 |
|---|---|
| UART | 2 个 |
| SPI 控制器 | 2 个 |
| I2C 控制器 | 2 个 |
| PWM 通道 | 16 通道 |
| USB | USB 1.1 控制器 |
| PIO | 8 个状态机(2 个 PIO 块 × 4) |
PIO 的细节在 docs/rp2/tutorial/pio.rst 中有进一步说明:每个 PIO 块有 32 条指令存储空间(由四个状态机共享),每个状态机拥有 4 字(32 bit)的 TX/RX FIFO,且 FIFO 可链接 DMA 进行大数据量传输。
更详尽的技术参数请查阅芯片厂商提供的 RP2040 数据手册(
rp2040-datasheet)。
三、RP2350 芯片规格详解
RP2350 同样采用 40nm 硅工艺,提供QFN-60(RP2350A)与QFN-80(RP2350B)两种封装。
核心特性
- CPU:双核Arm Cortex-M33 或 Hazard3 RISC-V处理器,最高 150 MHz(支持在两种内核架构间选择构建);
- SRAM:520 KB 片上 SRAM(约为 RP2040 的两倍);
- 外部 Flash:经 QSPI 最多支持 16 MB 片外 Flash;
- USB:USB 2.0 Full-Speed/Low-Speed 控制器;
- GPIO:RP2350A 提供 30 个,RP2350B 提供 48 个 GPIO 引脚。
外设资源
| 外设 | 数量/规格 |
|---|---|
| UART | 2 个 |
| SPI 控制器 | 2 个 |
| I2C 控制器 | 2 个 |
| PWM 通道 | 24 通道 |
| PIO | 12 个状态机(3 个 PIO 块 × 4) |
| HSTX | 高速发射器(High-Speed Transmitter) |
RP2350 的 PIO 在 docs/rp2/tutorial/pio.rst 中被描述为与 RP2040 向后兼容,并带来两项增强:TX/RX FIFO 可合并为单个 8 字 FIFO 以提升带宽;RX FIFO 支持对其寄存器进行随机读写访问。不过该文档也明确说明,MicroPython 目前对 RP2350 PIO 增强特性的原生支持还很有限,相关功能正在开发中。
四、RP2040 与 RP2350 关键差异对照
| 维度 | RP2040 | RP2350 |
|---|---|---|
| 内核 | 双核 Cortex-M0+ @133 MHz | 双核 Cortex-M33 或 Hazard3 RISC-V @150 MHz |
| SRAM | 264 KB(6 bank) | 520 KB |
| 封装 | QFN-56 | QFN-60 / QFN-80 |
| GPIO | 30 个 | 30 个(A)/ 48 个(B) |
| PWM 通道 | 16 | 24 |
| PIO 状态机 | 8 | 12 |
| USB | 1.1 | 2.0 FS/LS |
| 特有外设 | 可编程 LDO、2×PLL | HSTX |
在内核架构支持上,ports/rp2/mpconfigport.h 通过PICO_ARM与PICO_RISCV宏区分构建目标:Arm 构建启用 Thumb 与内联 Thumb 发射器(MICROPY_EMIT_THUMB),RISC-V 构建则启用 RV32 及 ZBA/ZCMP 扩展发射器(MICROPY_EMIT_RV32、MICROPY_EMIT_RV32_ZBA、MICROPY_EMIT_RV32_ZCMP)。同时,MICROPY_HW_MCU_NAME会根据PICO_RP2040、PICO_RP2350 && PICO_ARM、PICO_RP2350 && PICO_RISCV分别报告为"RP2040"、"RP2350"、"RP2350-RISCV"。
五、支持的开发板
仓库 ports/rp2/boards 目录下包含大量官方支持的板级配置(每个子目录对应一块板),例如:
RPI_PICO、RPI_PICO_W、RPI_PICO2、RPI_PICO2_W(官方 Pico 系列);ARDUINO_NANO_RP2040_CONNECT(Arduino Nano RP2040 Connect);ADAFRUIT_FEATHER_RP2040、ADAFRUIT_FEATHER_RP2350等 Adafruit 系列;PIMORONI_PICOLIPO、PIMORONI_TINY2040;SEEED_XIAO_RP2040、SEEED_XIAO_RP2350;WAVESHARE_RP2040_PLUS、WAVESHARE_RP2040_ZERO、WAVESHARE_RP2350B_CORE;SPARKFUN_*系列、WEACTSTUDIO、W5500_EVB_PICO等。
构建非默认板时通过BOARD=参数指定(见下文)。
六、从源码构建固件(适用于 RP2040 / RP2350)
依据 ports/rp2/README.md,构建流程如下。
1. 先构建交叉编译器
在仓库根目录执行:
make -C mpy-cross该步骤生成mpy-cross,用于预编译(冻结)内置 Python 代码。
2. 构建 rp2 固件
在 ports/rp2 目录执行(默认板为 Raspberry Pi Pico):
make submodules make clean make固件构建完全基于 CMake,Makefile 只是便利封装。最终产物为构建目录(默认为build)顶层的firmware.uf2。
3. 指定非默认开发板
例如构建 Pico W:
make BOARD=RPI_PICO_W submodules make BOARD=RPI_PICO_W clean make BOARD=RPI_PICO_W4. 部署固件到设备
- 方式一(拖拽烧录):按住 BOOTSEL 键上电/复位进入 bootloader 模式,将
firmware.uf2拷贝到出现的 USB 大容量存储设备; - 方式二(picotool):使用
picotool load -x firmware.elf,可用make deploy便捷调用; - 方式三(REPL 内触发):若设备已运行 MicroPython,执行
import machine; machine.bootloader()即可进入 bootloader——这一入口的底层实现见 modmachine.c 中的mp_machine_bootloader(),其通过reset_usb_boot()复位进入 USB 引导。
七、端口关键配置解析
ports/rp2/mpconfigport.h 是 rp2 端口最重要的配置头文件,以下配置项值得关注:
MICROPY_HW_ENABLE_UART_REPL:默认(0),即 REPL 默认仅在 USB 上;需要改用 UART REPL(例如配合machine.USBDevice使用时)可将其置为1后重新编译;MICROPY_HW_USB_MSC:默认(0),USB 大容量存储默认关闭;MICROPY_HW_FLASH_STORAGE_BYTES:分配给可读写文件系统的 Flash 字节数,默认1408 * 1024;MICROPY_HW_ROMFS_BYTES:ROMFS 分区大小,默认0(即默认不启用 ROMFS);MICROPY_HW_ENABLE_PSRAM:默认(0),开启后 PSRAM 将并入堆(见MICROPY_GC_SPLIT_HEAP),并把 GC 栈项类型切换为 32 位以避免 PSRAM 堆全量扫描导致的 GC 栈溢出降速;MICROPY_PY_MACHINE_FREQ_NUM_ARGS_MAX:(2),对应machine.freq()最多接受两个参数(内核频率 + 外设频率);MICROPY_HW_SOFT_TIMER_ALARM_NUM/MICROPY_HW_LIGHTSLEEP_ALARM_NUM:硬件定时器告警索引分配(0-3 范围内,3 号保留给 pico-sdk alarm pool);MICROPY_HW_USB_VID/PID:0x2E8A/0x0005,即 Raspberry Pi 厂商 ID 与 RP2 MicroPython 产品 ID;- 网络栈:
MICROPY_PY_NETWORK开启后默认附带 socket、ssl、websocket、webrepl、dupterm,默认主机名为"mpy-rp2"。
八、运行时能力与源码印证
1. 频率调节:machine.freq()
rp2 端口允许动态调节 CPU 频率(约 48 MHz ~ 250 MHz,默认 125 MHz),并可选设定 UART/SPI 外设时钟(48 MHz 或与 CPU 同频)。底层实现在 modmachine.c 的mp_machine_set_freq():先根据新旧频率中的较大值调用rp2_flash_set_timing_for_freq()调整 Flash 时序(升频前先提升 Flash 分频,保证 Flash 读取稳定),再经set_sys_clock_khz()切换系统时钟;若第二参数不为 48 MHz 且不等于 CPU 频率,则调用clock_configure()重配clk_peri。需要注意:更改外设频率后,已存在的 UART/SPI 实例波特率会随之变化,可能需要重新配置。
2. 复位原因:machine.reset_cause()
modmachine.c 中通过watchdog_caused_reboot()判断复位来源,并暴露machine.PWRON_RESET与machine.WDT_RESET两个常量(宏RP2_RESET_PWRON、RP2_RESET_WDT)。
3. PIO 状态机:rp2模块
rp2_pio.c 是 PIO 的驱动实现。从源码结构看,状态机对象按NUM_PIOS * 4静态预分配(RP2040 为 2×4=8 个,RP2350 为 3×4=12 个,与 docs/rp2/tutorial/pio.rst 描述一致),模块内部用掩码跟踪各 PIO 块的 32 条指令内存占用;asm_pio装饰器解析程序后会调用asm_pio_encode将汇编指令编码为硬件指令。PIO 中断通过pio_irq0()处理,将 PIO IRQ 与状态机 IRQ 统一路由到mp_irq_handler()。
4. PWM 实现细节
machine_pwm.c 展示了 16 通道(RP2350 为 24 通道)PWM 的实现策略:设置频率时尽可能把top(计数周期上限)调大以获得最高占空比分辨率,top最大值被限制在 65534 以保证 65535 时可达 100% 占空比;duty_u16写入时通过(duty_u16 * (top + 1) + 65535/2) / 65535做四舍五入换算。这解释了 docs/rp2/quickref.rst 中 PWM 频率可覆盖约 8 Hz ~ 62.5 MHz(125 MHz 系统时钟下)的能力来源。
九、相关文档指引
RP2 端口的文档体系围绕 docs/rp2 组织,建议按以下顺序阅读:
- docs/rp2/quickref.rst:RP2 端口速查表,涵盖
machine.freq()、WLAN、PIO、UART、PWM、ADC、SPI、I2C、I2S、RTC、WDT、OneWire、NeoPixel 等外设的即用代码示例; - docs/rp2/tutorial/intro.rst:上手教程入口,包含 reset.rst(工厂复位:擦除 Flash、重新烧录 .uf2)与 pio.rst(PIO 编程模型、九条指令、
.side()/[]修饰符、wrap_target()/wrap()指令以及 1Hz LED 闪烁完整示例); - examples/rp2:端口配套示例代码(如 PIO 相关 demo)。
结合本文的规格参数、构建命令与源码路径,即可完成从选型评估到固件部署、再到外设编程的完整链路。
- 嵌入式
- 语言运行时
- 编程语言
- 解释器
- 编译器
- 物联网
- 系统编程
相关推荐
- MicroPython rp2 模块完全指南:RP2040/RP2350 的 PIO、状态机与 DMA 编程
MicroPython rp2 模块完全指南:RP2040/RP2350 的 PIO、状态机与 DMA 编程 rp2 模块是 MicroPython 针对树莓派
- MicroPython RP2 移植版完全指南:构建、烧录与 PIO 编程实战
MicroPython RP2 移植版完全指南:构建、烧录与 PIO 编程实战 本指南围绕 MicroPython 官方仓库中的 RP2 移植版(ports/r
- MicroPython RP2 端口 rp2.Flash 类详解:SPI Flash 的低层访问、块协议实现与分区配置
MicroPython RP2 端口 rp2.Flash 类详解:SPI Flash 的低层访问、块协议实现与分区配置 本文围绕 MicroPython rp2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考