- 嵌入式
- 语言运行时
- 编程语言
- 解释器
- 编译器
- 物联网
- 系统编程
本文围绕 ports/rp2/boards/WEACTSTUDIO/deploy.md 这一部署文档展开,系统讲解如何将 MicroPython 固件烧录到 WeAct Studio RP2040 开发板:从 REPL 内执行machine.bootloader()与硬件 BOOTSEL 两种进入 bootloader 模式的方式,到 UF2 文件的获取、拷贝与自动复位机制,再到machine.bootloader()
的源码级实现原理。读完本文,你将掌握该开发板固件升级的完整闭环,并能根据板载 Flash 容量正确构建与部署对应版本的固件。
一、部署方式概览:为什么选择 UF2 Bootloader
WeAct Studio RP2040(常以 "Pico Board RP2040" 之名出现在各渠道)是基于树莓派 RP2040 双核 MCU 的开发板,板载 2/4/8/16 MiB 外部 Flash 与 USB-C 接口(见 board.json 中的 features 字段)。其固件部署采用 RP2040 原生 ROM bootloader 提供的UF2 协议:开发板无需任何专用烧录器或 SWD 调试线,只要通过 USB 连接主机,将编译产物 拖拽到弹出的 U 盘即可完成烧录。这与树莓派 Pico 生态的部署方式完全一致,是 RP2040 平台最便捷的固件更新途径。 要让板子进入等待固件更新的 bootloader 模式,原文档提供了两种等价手段: 如果板子上已经运行着 MicroPython(或任何可用 REPL 的固件),无需触碰任何按键,直接在 REPL 中执行: 该命令会立即使芯片重启并进入 UF2 引导模式。这是最干净的软件触发方式,适合远程操作或板卡被封装在机壳内、不便按键的场景。 若板子上尚未烧录任何固件(或固件已损坏无法进入 REPL),则需要使用硬件方式: 需要注意原文档在此处的细节描述——在 WEACTSTUDIO 板上是"按住 BOOTSEL 的同时按复位键(NRST)",这与树莓派官方 Pico 的"按住 BOOTSEL 插入 USB"略有区别,原因在于该开发板的 BOOTSEL 与 USB 供电链路设计。两者本质都是让 RP2040 在启动阶段检测到 BOOTSEL 引脚被拉低,从而跳过 Flash 中的用户程序,直接运行 ROM 中的 USB bootloader。 成功进入后,主机上会出现一个名为RPI-RP2的 USB 大容量存储设备(U 盘),其中包含 等引导文件。看到这个盘符即代表板子已就绪,可以开始烧写固件。 烧录所需的 文件来自 MicroPython 源码的 rp2 移植目录。通用构建流程见 ports/rp2/README.md: 构建完成后,固件位于 CMake 构建目录顶层(默认 。 由于 WeAct Studio RP2040 存在 2/4/8/16 MiB 四种 Flash 容量版本,默认固件按 16 MiB 编译,其他容量需通过 参数指定(见 board.md): ,分别对应 mpconfigvariant_FLASH_2M.cmake、mpconfigvariant_FLASH_4M.cmake、mpconfigvariant_FLASH_8M.cmake 三个变体配置;不指定时使用默认的 mpconfigvariant.cmake(16 MiB)。 从这些 CMake 变体文件可以看出,不同变体不仅切换了 PICO SDK 的板级定义(如 : 因此,务必选择与你的板卡实际 Flash 容量匹配的变体 进行构建,否则固件布局可能与硬件不符。 拿到匹配的 后,烧写本身只需三步: 整个流程中不需要任何额外烧录软件。RP2040 的 ROM bootloader 会解析 UF2 文件中的块(block)头信息,将固件逐块写入板载 Flash 的指定扇区,并在校验完成后自动复位芯片、重新启动。原文档特别强调了这一点:"Once programming of the new firmware is complete the device will automatically reset and be ready for use." ——烧录完成即自动重启,无需手动断电,重启后便直接运行新固件,可通过串口 REPL 验证版本。 此外,ports/rp2/README.md 还给出了进阶部署路径:除拷贝 UF2 外,也可在 bootloader 模式下使用 进入引导模式。 理解烧录流程后,不妨深入 ports/rp2/modmachine.c 看一下 的真实实现,这能解释"为什么执行一条命令板子就变成了 U 盘": 该函数的关键调用链分三步: 从实现可以看出,"REPL 执行命令"与"按住 BOOTSEL 复位"殊途同归:前者通过软件调用 重定向到 ROM 引导流程,后者通过硬件引脚状态让 ROM 在启动时直接进入同一流程。二者最终都落在 RP2040 的 USB UF2 引导程序上,这正是该平台部署机制高度统一的根源。 WEACTSTUDIO 板的固件还冻结了板级 模块(见 modules/board.py 与 mpconfigboard.cmake),烧录完成后即可在 REPL 中直接驱动板载外设: 该模块与板级引脚映射 pins.csv( )保持一致,可作为烧录成功后快速验证固件与板卡工作状态的第一手工具。 综上所述,WeAct Studio RP2040 的固件部署高度依赖 UF2 bootloader 的"拖拽即烧录"机制:进入引导模式有软件( 精准构建,烧录完成后板卡自动复位即用。掌握这套流程,即可像升级普通 USB 设备一样完成 MicroPython 固件的迭代与维护。 CopilotKit 项目实战:mcp use 框架 Widget 开发基础指南 适用场景 :为 MCP(Model Context Protocol)工具构建 MicroPython OMGS3 开发板烧录指南:进入下载模式(Download Mode)与固件部署全流程 本指南以 deploy_flashmode.md screenshot to code 实操指南:3 步完成截图转代码,从本地部署到第一版页面 把一张网页截图丢给视觉模型,几分钟就能拿到一份能跑的前端代码——sfirmware.uf2二、进入 Bootloader 模式的两种方式
方式一:REPL 内执行
machine.bootloader()import machine machine.bootloader()方式二:硬件按键组合(BOOTSEL + NRST)
验证是否进入 bootloader 模式
INFO_UF2.TXT三、UF2 固件文件的获取与构建
.uf2cd ports/rp2 make submodules make clean makebuild目录),文件名为firmware.uf2针对 WEACTSTUDIO 的板级构建
BOARD_VARIANTcd ports/rp2 make BOARD=WEACTSTUDIO BOARD_VARIANT=FLASH_8M submodules all # 构建 8 MiB 版本BOARD_VARIANT的合法取值为FLASH_2M、FLASH_4M、FLASH_8MPICO_BOARD "weact_studio_rp2040_2mb"),还同步调整了 MicroPython 文件系统可用的 Flash 存储区大小MICROPY_HW_FLASH_STORAGE_BYTES变体 PICO_BOARD 定义 文件系统存储区(字节) 计算说明 默认(16 MiB) weact_studio_rp2040_16mb15728640 16 MiB − 1 MiB FLASH_2M weact_studio_rp2040_2mb1048576 2 MiB − 1 MiB FLASH_8M weact_studio_rp2040_8mb7340032 8 MiB − 1 MiB 四、烧写流程与自动复位机制
firmware.uf2RPI-RP2USB 存储设备;firmware.uf2文件复制(拖拽)到该设备中;picotool load -x firmware.elf直接加载 ELF 固件,该命令可通过make deploy便捷触发;若板内已有 MicroPython,同样支持在 REPL 执行import machine; machine.bootloader()五、源码级原理解析:
machine.bootloader()做了什么
machine.bootloader()MP_NORETURN void mp_machine_bootloader(size_t n_args, const mp_obj_t *args) { MICROPY_BOARD_ENTER_BOOTLOADER(n_args, args); rosc_hw->ctrl = ROSC_CTRL_ENABLE_VALUE_ENABLE << ROSC_CTRL_ENABLE_LSB; reset_usb_boot(0, 0); for (;;) { } }MICROPY_BOARD_ENTER_BOOTLOADER允许各板卡在进入引导模式前执行自定义动作(例如 WEACTSTUDIO 这类板卡若需要切换引脚状态或写标志位,可在此宏处扩展);reset_usb_boot(0, 0),这是整个机制的落点——它把 RP2040 复位到 ROM 中的 USB bootloader,该 bootloader 随后枚举为RPI-RP2大容量存储设备并等待 UF2 文件。函数声明为MP_NORETURN并以死循环收尾,表明此调用不会返回,芯片已经完全切换到 bootloader 上下文。reset_usb_boot()六、注意事项与排障建议
RPI-RP2盘符,请检查 USB 线是否为数据线(而非仅充电线),并确认 BOOTSEL 按键时机——务必在复位/上电之前保持按住。BOARD=WEACTSTUDIO的对应变体后再试。七、拓展:板载外设与
board模块
boardimport board board.led.toggle() # 翻转板载 LED(GPIO25)状态 board.key.value() # 读取用户按键(GPIO23,内部上拉),返回 0 或 1LED,GPIO25machine.bootloader())与硬件(BOOTSEL + NRST)两条路径,固件按 Flash 容量通过BOARD_VARIANT相关推荐
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考