问题描述
我使用OpenOcd刷新STM32 ARM Cmake项目的Elf图像。
在mem.ld脚本中,为FLASH扇区的原始地址分配了一个偏移量为0x08020200的地址。
如果使用OpenOCD和write_image命令将Elf文件写入Flash,则似乎ELF标头已写入0x08020000的FLASH。
应用程序二进制文件已正确写入0x08020200的闪存中(0x08020200的前四个字节反映了堆栈指针值)
由于0x08020200是闪存扇区5(0x08020000-0x0803FFFF)内的地址,我希望OpenOcd write_image命令的自动擦除功能会擦除整个扇区5(因为只能擦除整个扇区)
什么导致ELF标头写入地址0x08020000的闪存?
我执行了以下步骤:
- 手动擦除整个闪存
- 使用OpenOcd dump_image命令转储整个Flash内容
- 检查转储的图像是否代表清晰的闪存(所有字节均为0xFF)
- 使用OpenOcd write_image命令刷新test.elf文件
- 再次使用OpenOcd dump_image命令转储整个Flash内容
- 检查0x08020200的前四个字节是否反映了堆栈指针值
- 在0x08020000处检查Flash的内容-> ELF标头已写入Flash
解决方法
在闪存开始时对ELF标头进行编程时,我遇到了相同的问题,但是“ stm32编程器CLI”(不是openOCD)存在此问题,我通过十六进制修复了该问题。如果我使用的是十六进制文件,则ELF的闪存开头不会损坏。