You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需OpenOCD通过SWD接口烧写Raspberry Pi Pico外部Flash方法咨询

RP2040 SWD烧写外部Flash操作步骤

RP2040本身无内置Flash,固件存储在外接QSPI Flash中,SWD无法直接操作Flash外设,因此需要先将轻量Flash操作小程序(stub)加载到片上RAM运行,通过stub完成固件擦写。你已经实现SWD读写RAM、寄存器、halt内核的基础功能,可按以下序列操作:

前置准备

  • 提前编译适配RP2040的Flash操作stub程序,体积控制在4KB以内即可,核心实现QSPI Flash的擦除、页写入、读取功能,stub的参数交互固定使用指定RAM地址,比如用0x20000000存操作命令、0x20000004存Flash目标地址、0x20000008存数据缓冲区指针、0x2000000C存操作长度、0x20000010存操作状态
  • 提取待烧写固件的纯二进制内容,若为UF2格式需跳过UF2头结构,仅保留有效Flash数据段,长度按4KB扇区对齐

完整操作序列

1. 确认内核处于Halt状态

  • 读取Cortex-M0+的DHCSR寄存器(地址0xE000EDF0),确认S_HALT位(位17)为1,若未halt则发送halt命令,同时禁用所有内核中断,避免意外唤醒

2. 加载stub到片上RAM

  • 选择未被使用的RAM区域,比如RP2040 SRAM基地址0x20000000起始的空间,通过SWD写RAM操作将编译好的stub二进制代码完整写入该区域
  • 写入完成后读回前16字节校验,确认写入数据正确

3. 配置Flash擦除参数

  • 往约定的参数地址写入擦除操作参数:
    • 操作命令字段写0x01(代表按扇区擦除,可根据你的stub实现调整定义)
    • Flash起始地址写0x10000000(RP2040 Flash映射的基地址)
    • 操作长度写待烧写固件的总长度

4. 启动stub运行

  • 通过SWD写入内核寄存器:
    • PC寄存器设置为stub入口地址,注意Cortex-M0+仅支持Thumb模式,入口地址需要最低位设为1,即实际地址 | 0x1
    • SP寄存器设置为合法的栈地址,比如0x20001000,避免栈溢出
    • 写入DHCSR寄存器清除Halt位,让内核开始运行stub

5. 等待擦除完成

  • 循环读取约定的状态RAM地址,当状态值变为0xAA时代表操作完成,若超时或返回0xFF代表擦除失败
  • 操作完成后重新发送halt命令,将内核拉回Halt状态

6. 分块写入固件

  • 按Flash页大小(通常256字节)拆分固件,逐块执行以下操作:
    1. 将当前256字节固件数据通过SWD写入约定的数据缓冲区RAM地址
    2. 配置参数:操作命令写0x02(代表页写入)、Flash地址写当前目标偏移 + 0x10000000、长度写256
    3. 重复上述启动stub、等待完成、拉回Halt的操作
  • 所有固件块烧写完成后,发送读取命令让stub回读Flash内容,和原固件做校验,确认烧写正确性

7. 复位启动新固件

  • 校验通过后,通过SWD写AIRCR寄存器(地址0xE000ED0C),写入值0x05FA0004触发系统复位,新固件即可正常启动

注意事项

  • 操作前需确保RP2040的QSPI引脚处于默认功能,未被复用为其他外设
  • Stub编译时需添加-mcpu=cortex-m0plus -mthumb编译参数,不要使用浮点指令,避免运行异常
  • 擦除操作可根据实际需求调整地址和长度,避免擦除固件以外的用户存储数据

内容的提问来源于stack exchange,提问作者Luca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:24:06