ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MicroPython Pyboard v1.x DFU 固件部署指南:从 `machine.bootloader()` 到 `make deploy` 全流程

MicroPython Pyboard v1.x DFU 固件部署指南:从 `machine.bootloader()` 到 `make deploy` 全流程 MicroPython Pyboard v1.x DFU 固件部署指南从machine.bootloader()到make deploy全流程【免费下载链接】micropythonMicroPython - a lean and efficient Python implementation for microcontrollers and constrained systems项目地址: https://gitcode.com/gh_mirrors/mi/micropython本文以 MicroPython 仓库中 ports/stm32/boards/PYBV10/deploy.md 为核心系统讲解 Pyboard v1.xPYBV10 / PYBV11通过 USB DFUDevice Firmware Update模式烧录固件的两种标准入口——REPL 软件触发与 BOOT0 硬件引脚触发并深入剖析其背后的machine.bootloader()实现原理、主机端烧录命令与 flash 内存布局。读完本文你将掌握从下载 DFU 文件、进入 DFU bootloader、到用make deploy/dfu-util完成固件部署的完整实战能力。一、DFU 部署的核心思路Pyboard v1.x 出厂时即带有 ST 官方 ROM 中的 DFU bootloaderSystem Memory 系统存储器。与需要外部编程器如 ST-LINK、JTAG的烧录方式不同DFU 模式让板子自身通过 USB 暴露为一个 DFU 设备主机端只需一个 DFU 编程器pydfu.py或dfu-util即可把固件写入片内 flash。部署流程可概括为三步获取 DFU 文件从 MicroPython 官方发布页下载对应 Pyboard 型号PYBv1.0 / PYBv1.1的.dfu固件文件或在本仓库中自行编译生成build-PYBV10/firmware.dfu。让板子进入 DFU bootloader二选一——在 MicroPython REPL 中执行machine.bootloader()软件方式或用跳线帽短接 3V3 与 BOOT0 后复位板子硬件方式。主机端烧录运行make BOARDPYBV10 deploy内部调用 tools/pydfu.py或直接使用dfu-util写入固件。说明原文档中提到的 Windows 平台 PDF 与 Linux/Mac 平台 Wiki 文档均为外部资料本文不重复其外部链接仅聚焦仓库内可直接验证的流程与源码。二、方式一REPL 中执行machine.bootloader()进入 DFU 模式原文档给出的首选方法是板子上已运行 MicroPython 时在 REPL 执行machine.bootloader()执行后板子会立即进入 DFU bootloaderUSB 连接断开并重新枚举为 DFU 设备USB VID:PID0483:df11。由于整个过程不需要按任何物理按键这一方式非常适合自动化升级流程——正如 ports/stm32/README.md 所述你可以将其自动化无需手动按任何按钮即可更新板子。底层实现原理machine.bootloader()在 STM32 端口的真实实现位于 ports/stm32/modmachine.c 的mp_machine_bootloader()函数其执行序列为反初始化 USB 栈调用pyb_usb_dev_deinit()或 tinyUSB 栈的mp_usbd_deinit()干净地断开当前 USB 会话刷新文件系统缓存调用storage_flush()确保待写入数据落盘避免进入 bootloader 后丢数据关闭全局中断__disable_irq()调用powerctrl_enter_bootloader()把控制权交给 bootloader。跳转目标地址按芯片系列区分modmachine.cSTM32F7 / STM32H7 系列跳转到0x1ff00000该系列的系统存储器 bootloader 基址STM32H5 系列跳转到0x0bf97000其他系列含 Pyboard v1.x 使用的 STM32F405RG跳转到0x00000000STM32F4 系列系统存储器即从 0x0000 0000 映射。powerctrl_enter_bootloader()的两种跳转策略在 ports/stm32/powerctrl.c 中进入 bootloader 有两种策略由板级宏MICROPY_HW_ENTER_BOOTLOADER_VIA_RESET决定通过复位进入推荐默认启用的板型将 bootloader 状态密钥、跳转地址、r0 寄存器写入备份 RAM 中的BL_STATE_PTR清 DCache 后调用NVIC_SystemReset()复位。复位后powerctrl_check_enter_bootloader()powerctrl.c检查该状态标记确认是由软件复位进入且密钥匹配则通过__HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH()把系统存储器重映射到 0x00000000再branch_to_bootloader()跳转。这种方式的优点在于一切包括看门狗都被复位进入 bootloader 前状态干净。直接跳转进入直接调用branch_to_bootloader(r0, bl_addr)powerctrl.c以内联汇编从 bootloader 基址读出栈顶指针ldr r2, [r1, #0]与入口地址ldr r2, [r1, #4]分别写入 MSP 后bx跳转。三、方式二BOOT0 引脚硬件方式进入 DFU 模式当板子上尚未运行 MicroPython例如固件损坏、首次部署时无法使用软件方式此时用硬件方式短接 3V3 与 BOOT0在 Pyboard 上DFU 引脚P1即 BOOT0与一个 3V3 引脚在板子底部左侧、倒数第二排相邻排列ports/stm32/README.md 对此有明确标注复位板子按下并松开 RST 复位按钮或重新上电板子上电后由于 BOOT0 被拉高芯片从系统存储器内置 DFU bootloader启动此时 USB 设备会枚举为 DFU 设备烧录完成后务必移除 3V3 与 BOOT0 之间的跳线再按一次 RST板子即从用户 flash 正常启动 MicroPython。从源码结构看PYBV10 板的复位按钮在 mpconfigboard.h 中对应电源管理相关配置其 DFU 引脚为 BOOT0P1。该板型基于 STM32F405RG启用 USB FSMICROPY_HW_USB_FS与 VBUS 检测MICROPY_HW_USB_VBUS_DETECT_PIN (pin_A9)即板载 micro USB 口。四、主机端烧录 DFU 固件4.1 从仓库编译 Pyboard v1.x 固件在仓库 ports/stm32/ 目录下执行cd ports/stm32 make BOARDPYBV10 submodules make BOARDPYBV10构建完成后DFU 固件位于build-PYBV10/firmware.dfu。PYBV11 同理把BOARD换成PYBV11即可。4.2 用make deploy一键烧录板子进入 DFU 模式后在 ports/stm32/ 目录执行参考 ports/stm32/README.mdmake BOARDPYBV10 deploy该目标默认调用仓库自带的 tools/pydfu.py 脚本完成 DFU 传输。若希望改用独立的dfu-util工具可传入USE_PYDFU0make BOARDPYBV10 USE_PYDFU0 deploy4.3 使用dfu-util直接烧录Linux/macOS 下安装dfu-util后可手动指定设备与固件文件sudo dfu-util -a 0 -d 0483:df11 -D build-PYBV10/firmware.dfu参数说明-a 0选择 DFU 中的 AltSetting 0内部 flash 区域-d 0483:df11匹配 ST 官方 DFU 设备的 USB VID:PID-D指定要写入的 DFU 镜像。4.4 常见权限问题如果烧录时报权限错误Permission denied或libusb相关错误通常是当前用户无权访问 USB 设备sudo make BOARDPYBV10 deploy五、进阶为 Pyboard v1.x 启用 mboot 引导程序原文档面向的是板载 ST ROM bootloader 的标准 DFU 流程。仓库还提供了另一个可选方案——MicroPython 自研的mboot引导程序见 ports/stm32/mboot/README.md。mboot 支持 STM32F4xx/F7xx/WBxx提供标准 USB DFU 接口、自定义 I2C 接口还能直接从 FAT / littlefs 文件系统加载.dfu.gz固件全部特性开启仅需 32KB flash。对于 Pyboard v1.x默认不使用 mboot但板级配置已完整提供可用于演示与测试mboot/README.md让板子进入出厂 DFU 模式上电时短接 BOOT0 与 3V3在ports/stm32/mboot/目录构建并部署 mbootcd ports/stm32/mboot make BOARDPYBV10 USE_MBOOT1 clean all deploy之后按住 USR 键、按 RST 复位、持续按住 USR 直到蓝色 LED 亮起循环中的第 4 项再松开红色 LED 每秒闪烁一次表示已进入 mboot回到ports/stm32/目录用同样的USE_MBOOT1参数构建并部署 MicroPython 固件cd ports/stm32 make BOARDPYBV10 USE_MBOOT1 clean all deployUSE_MBOOT1会改变板子的链接配置与 flash 布局见 mpconfigboard.mk不使用 mboot 时TEXT0_ADDR 0x08000000ISR 段在前使用 mboot 时TEXT0_ADDR 0x08020000ISR 与完整固件整体后移。mboot 所需的 I2C 引脚用于 I2C 升级接口也已在 mpconfigboard.h 中配置好I2C1SCLPB8、SDAPB9。六、理解 Pyboard v1.x 的 flash 布局DFU 烧录是否安全取决于你对 flash 布局的理解。PYBv1.x 的片内 flash 布局以 PYBv1.0 为例mboot/README.md无 mboot 时0x08000000 0x08004000 0x08020000 | ISR text | filesystem | rest of MicroPython firmware有 mboot 时0x08000000 0x08004000 0x08020000 | mboot | filesystem | ISR and full MicroPython firmware关键结论文件系统区0x08004000 起与固件区分离因此在标准 DFU 流程与 mboot 配置之间切换时文件系统保持完整用户数据不会丢失mboot/README.md 明确说明DFU 烧录只写固件区不影响文件系统若固件损坏导致无法进入 REPL仍可通过 BOOT0 硬件方式恢复——这也是 DFU 方案相对其他部署方式的可靠性优势。七、注意事项与排错清单区分 PYBv1.0 与 PYBv1.1两者进入 DFU 的方式相同但make的BOARD参数不同PYBV10/PYBV11构建产物目录分别为build-PYBV10/、build-PYBV11/硬件方式务必移除 BOOT0 跳线烧录完成后若不移除跳线复位后芯片会再次从系统存储器启动而不会运行用户固件USB 重新枚举执行machine.bootloader()后 USB 会断开并重新枚举为0483:df11设备这是正常现象不需要重新插拔权限问题优先用 sudo 重试见 4.4从源码结构看PYBV10 使用 STM32F405RG其跳转地址为0x00000000系统存储器这与 F7/H7 系列0x1ff00000不同移植自定义板型时不要照搬跳转地址。八、总结Pyboard v1.x 的 DFU 部署提供了软硬兼备的完整升级路径软件方式machine.bootloader()适合自动化与日常升级其底层经由 powerctrl.c 完成 USB 反初始化、文件系统刷新、中断关闭与 bootloader 跳转硬件方式BOOT0 短接适合首次烧录与故障恢复。配合make deploy、pydfu.py与dfu-util开发者可以在数秒内完成固件更替且文件系统数据全程无损。若需更强的部署能力还可通过USE_MBOOT1引入 mboot获得文件系统加载固件、I2C 升级等高级特性。【免费下载链接】micropythonMicroPython - a lean and efficient Python implementation for microcontrollers and constrained systems项目地址: https://gitcode.com/gh_mirrors/mi/micropython创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表