使用OpenOcd刷新ELF文件会使ELF标头写入Flash

问题描述

我使用OpenOcd刷新STM32 ARM Cmake项目的Elf图像。

在mem.ld脚本中,为FLASH扇区的原始地址分配了一个偏移量为0x08020200的地址。

如果使用OpenOCD和write_image命令将Elf文件写入Flash,则似乎ELF标头已写入0x08020000的FLASH。

enter image description here

应用程序二进制文件已正确写入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的闪存开头不会损坏。