- 嵌入式
- 语言运行时
- 编程语言
- 解释器
- 编译器
- 物联网
- 系统编程
本指南以仓库内 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) 两种封装。 RP2350 的 PIO 在 docs/rp2/tutorial/pio.rst 中被描述为与 RP2040 向后兼容,并带来两项增强:TX/RX FIFO 可合并为单个 8 字 FIFO 以提升带宽;RX FIFO 支持对其寄存器进行随机读写访问。不过该文档也明确说明,MicroPython 目前对 RP2350 PIO 增强特性的原生支持还很有限,相关功能正在开发中。 在内核架构支持上,ports/rp2/mpconfigport.h 通过 。 仓库 ports/rp2/boards 目录下包含大量官方支持的板级配置(每个子目录对应一块板),例如: 构建非默认板时通过 参数指定(见下文)。 依据 ports/rp2/README.md,构建流程如下。 在仓库根目录执行: 该步骤生成 ,用于预编译(冻结)内置 Python 代码。 在 ports/rp2 目录执行(默认板为 Raspberry Pi Pico): 固件构建完全基于 CMake,Makefile 只是便利封装。最终产物为构建目录(默认为 。 例如构建 Pico W: ports/rp2/mpconfigport.h 是 rp2 端口最重要的配置头文件,以下配置项值得关注: rp2 端口允许动态调节 CPU 频率(约 48 MHz ~ 250 MHz,默认 125 MHz),并可选设定 UART/SPI 外设时钟(48 MHz 或与 CPU 同频)。底层实现在 modmachine.c 的 。需要注意:更改外设频率后,已存在的 UART/SPI 实例波特率会随之变化,可能需要重新配置。 modmachine.c 中通过 )。 rp2_pio.c 是 PIO 的驱动实现。从源码结构看,状态机对象按 。 machine_pwm.c 展示了 16 通道(RP2350 为 24 通道)PWM 的实现策略:设置频率时尽可能把 做四舍五入换算。这解释了 docs/rp2/quickref.rst 中 PWM 频率可覆盖约 8 Hz ~ 62.5 MHz(125 MHz 系统时钟下)的能力来源。 RP2 端口的文档体系围绕 docs/rp2 组织,建议按以下顺序阅读: 结合本文的规格参数、构建命令与源码路径,即可完成从选型评估到固件部署、再到外设编程的完整链路。 MicroPython rp2 模块完全指南:RP2040/RP2350 的 PIO、状态机与 DMA 编程 rp2 模块是 MicroPython 针对树莓派 MicroPython RP2 移植版完全指南:构建、烧录与 PIO 编程实战 本指南围绕 MicroPython 官方仓库中的 RP2 移植版(ports/r MicroPython RP2 端口 rp2.Flash 类详解:SPI Flash 的低层访问、块协议实现与分区配置 本文围绕 MicroPython rp2核心特性
外设资源
外设 数量/规格 UART 2 个 SPI 控制器 2 个 I2C 控制器 2 个 PWM 通道 24 通道 PIO 12 个状态机(3 个 PIO 块 × 4) HSTX 高速发射器(High-Speed Transmitter) 四、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 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"五、支持的开发板
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)
1. 先构建交叉编译器
make -C mpy-crossmpy-cross2. 构建 rp2 固件
make submodules make clean makebuild)顶层的firmware.uf23. 指定非默认开发板
make BOARD=RPI_PICO_W submodules make BOARD=RPI_PICO_W clean make BOARD=RPI_PICO_W4. 部署固件到设备
firmware.uf2拷贝到出现的 USB 大容量存储设备;picotool load -x firmware.elf,可用make deploy便捷调用;import machine; machine.bootloader()即可进入 bootloader——这一入口的底层实现见 modmachine.c 中的mp_machine_bootloader(),其通过reset_usb_boot()复位进入 USB 引导。七、端口关键配置解析
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()mp_machine_set_freq():先根据新旧频率中的较大值调用rp2_flash_set_timing_for_freq()调整 Flash 时序(升频前先提升 Flash 分频,保证 Flash 读取稳定),再经set_sys_clock_khz()切换系统时钟;若第二参数不为 48 MHz 且不等于 CPU 频率,则调用clock_configure()重配clk_peri2. 复位原因:
machine.reset_cause()watchdog_caused_reboot()判断复位来源,并暴露machine.PWRON_RESET与machine.WDT_RESET两个常量(宏RP2_RESET_PWRON、RP2_RESET_WDT3. PIO 状态机:
rp2模块
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 实现细节
top(计数周期上限)调大以获得最高占空比分辨率,top最大值被限制在 65534 以保证 65535 时可达 100% 占空比;duty_u16写入时通过(duty_u16 * (top + 1) + 65535/2) / 65535九、相关文档指引
machine.freq()、WLAN、PIO、UART、PWM、ADC、SPI、I2C、I2S、RTC、WDT、OneWire、NeoPixel 等外设的即用代码示例;.side()/[]修饰符、wrap_target()/wrap()指令以及 1Hz LED 闪烁完整示例);相关推荐
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考