用 STM32G4(比如 G474)双 Bank 芯片的工程师,几乎都会踩这个坑:
想一次性烧录 APP + 把 DBANK 从 1 改成 0(单 Bank),结果程序直接不跑。
图形工具(ST-LINK Utility / CubeProgrammer)怎么设置都不对,必须烧两遍才行。
ST 官方 LAT1150 笔记把时序、原理、一步到位命令行全部讲清楚,看完再也不踩双 Bank 烧录坑。
资料获取:【应用笔记】LAT1150 STM32G4 应用程序与 Option Bytes 同时烧录问题
1. 典型故障现象(完全一致就是同款问题)
- 芯片:STM32G474(双 Bank Flash)
- 默认 DBANK=1(双 Bank 模式)
- 需求:烧程序 + DBANK=0(单 Bank)一步完成
- 用 GUI 工具同时烧程序 + 改 OB → 程序不运行、读 Flash 乱码
- 必须先改 DBANK → 复位 → 再烧程序才正常
2. 根因:烧录顺序反了!
GUI 工具的执行顺序是:
- 先烧程序(此时还是 DBANK=1 双 Bank 模式)
- 再改 DBANK=0(变成单 Bank)
问题在于:
双 Bank 模式烧的程序,在单 Bank 模式下取指方式完全不同,程序直接 “错位” 变无效。
- DBANK=1(双 Bank):64bit 读取
- DBANK=0(单 Bank):128bit 读取
模式不匹配 → Flash 内容读出来不一样 → 程序跑飞。
3. 正确顺序(必须这样才对)
- 先改 DBANK=0
- 复位让 OB 生效
- 再烧程序
但 GUI 工具不能调整顺序,所以做不到一步完成。
4. 一步到位解决方案:ST-LINK_CLI 命令行
LAT1150 给出唯一正确方法:
用命令行工具 ST-LINK_CLI.exe,先改 OB → 复位 → 擦除 → 烧录。
直接复制这条命令(G4 单 Bank 专用)
st-link_cli.exe -c SWD -OB DBANK=0 -Rst -ME -P test.hex -V
命令含义(顺序不能乱)
-c SWD:连接调试口-OB DBANK=0:先改选项字节,关闭双 Bank-Rst:复位,让 OB 生效-ME:全片擦除-P xxx.hex:烧录程序-V:校验
执行一次,程序 + OB 同时到位,直接运行。
5. 为什么 GUI 工具不行?
因为 CubeProgrammer / ST-LINK Utility 都是固定顺序:
先烧程序 → 后改 OB
无法改成 “先改 OB → 再烧程序”。
所以在 G4 双 Bank 切单 Bank 这个场景下,GUI 工具天生不支持。
STM32G4 切换 DBANK 必须先改 OB、再烧程序,GUI 做不到,只能用命令行一步完成。
7. LAT1150 最终结论
- STM32G4 双 Bank 切单 Bank 时,烧录顺序决定程序是否能运行
- 先烧程序后改 OB → 程序异常
- 先改 OB 再烧程序 → 正常运行
- 一键完成只能用 ST-LINK_CLI 命令行
- 命令顺序:修改 OB → 复位 → 擦除 → 烧录
381