无需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字节)拆分固件,逐块执行以下操作:
- 将当前256字节固件数据通过SWD写入约定的数据缓冲区RAM地址
- 配置参数:操作命令写
0x02(代表页写入)、Flash地址写当前目标偏移 +0x10000000、长度写256 - 重复上述启动stub、等待完成、拉回Halt的操作
- 所有固件块烧写完成后,发送读取命令让stub回读Flash内容,和原固件做校验,确认烧写正确性
7. 复位启动新固件
- 校验通过后,通过SWD写
AIRCR寄存器(地址0xE000ED0C),写入值0x05FA0004触发系统复位,新固件即可正常启动
注意事项
- 操作前需确保RP2040的QSPI引脚处于默认功能,未被复用为其他外设
- Stub编译时需添加
-mcpu=cortex-m0plus -mthumb编译参数,不要使用浮点指令,避免运行异常 - 擦除操作可根据实际需求调整地址和长度,避免擦除固件以外的用户存储数据
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

