STM32G474 IAP 双bank升级的坑
真不容易,
- 选项字中必须确保DBANK为1,为1表示将512k的flash分成2个独立的256k flash
- 选项字BFB2是切换的关键,如果你不想用传统的bootload的方案的话,
- 该值为1表示使用bank2作为启动时0x08000000的地址
- 该值为0表示使用bank1作为启动时0x08000000的地址
- 巨坑之一,并不是设置了BFB2为1就一定会运行在物理bank2上,因为设置了BFB2=1后,启动时刻的固化在单片机内的bootload会判断bank2的程序是否具备可运行的条件(向量表),如果不具备就还是会运行在物理bank1上!你需要自己去下载关于启动时刻的流程,这里提供一个讨论链接
- 实际运行的物理bank,需要通过SYSCFG_MEMRMP 寄存器的 FB_MODE位去判断
- 值为0,表示实际运行在bank1
- 值为1,表示实际运行在bank2
- 你可以使用这个寄存器和BFB2的状态是否一致去判断运行状态
- 写flahs时,应该总是写0x08040000(虚拟bank2基址),因为正常运行后,无论是物理bank1还是bank2,都会被映射到启动地址0x08000000,而你不能改写真正运行的flash,所以写入地址总是0x08040000开始
- 巨坑之二擦除flash块时,应该按FB_MODE的值去判断应该擦除的块,而不是BFB2!
- 注意擦除等耗时操作时记得喂狗。