ST意法半导体
直播中

HTSX

9年用户 813经验值
擅长:可编程逻辑
私信 关注
[问答]

HEX文件中的选项字节验证失败怎么处理?

我正在使用最新的 STMCubeProgrammer/ST-Link-Utility 版本。我的目标是直接在 .elf/.hex 文件中提供选项字节,所以我们的制造部门只需要下载这个文件。
我已经设法将设置自动放入 .elf/.hex 文件中。但是当我尝试对设备进行编程时,出现验证错误。设备似乎(!)已正确编程,但我想确定一下。
该设备是 L011F4。调试和发布版本对应的选项字节有两种配置。对于调试版本,选项字节与工厂交付的空白设备相同。对于发布版本,RDP 级别为 1,并且引导加载程序引脚被禁用。两种配置都没有写保护。
即使对于没有 RDP 的调试版本,验证也会失败,我不知道为什么。这是我对 STM32_Programmer_CLI.exe 的调用:
-c port=swd freq=4000 ap=0 index=0 mode=normal -vb 1 -rdu -e all -d %1 -v
%1 替换为 .elf/.hex 文件的名称。我知道“ap=0”和“index=0”是默认值,这只是为了将来可能的扩展(并行编程等)。详细级别也一样,这是为了调试脚本。我不确定“-e all”是否多余,因为如果我理解正确的话,“-rdu”应该会自动完全擦除设备。-v 是明确验证下载。
这是应用程序数据区之后的调试 .hex 文件的内容:
:020000041FF8E3 => 设置高地址字节(0x1FF8,选项字节的位置)
:10000000 AA00 55FF 7080 8F7F0000FFFF0000FFFFF8
:040010000000FFFFEE
:04000005080039A90D
:00000001FF => 十六进制文件结束
这应该将 FLASH_OPTR@0x1FF8000/4 = 0x807000AA(默认值)和 FLASH_WRPROT1 和 2 寄存器 @0x1FF8008/C/10 设置为无写保护。还包括高半字中的反向位。
通过上面的脚本,根据STM32_Programmer_CLI.exe的输出,重置RDP级别,批量擦除和下载都可以,但是验证在第二个字节停止:
正在验证...
读取进度:
███▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ 6%
错误:在地址 0x08000001 处发现数据不匹配(字节 = 0x00 而不是 0x08)
错误:下载验证失败
由于 RDP 已重置,因此应该可以验证设备。
使用较旧的 ST-Link Utility 时,似乎无法轻松重置 RDP 级别,并且使用 STMCubeProgrammer 的 GUI 版本来验证我的脚本是否有错误会丢失连接(此外,似乎没有办法以通过 GUI 的设置禁止选项字节编程)。
所以,我有点不知所措可能会出什么问题:/有什么想法吗?






回帖(1)

黄剑屏

2023-1-12 10:43:53
我想我找到了一个解决方案——不是使用 srecord,而是 objcopy。这是我的批处理文件:


  • arm-atollic-eabi-objcopy.exe -O ihex -R .opt_bytes %1 Image.hex
  • arm-atollic-eabi-objcopy.exe -O ihex -j .opt_bytes %1 OptBytes.hex
  • STM32_Programmer_CLI.exe -c port=swd freq=4000 ap=0 index=0 mode=normal -vb 1 -rdu -e all -d Image.hex -v
  • STM32_Programmer_CLI.exe -c port=swd freq=4000 ap=0 index=0 mode=hotplug -vb 1 -d OptBytes.hex
  • STM32_Programmer_CLI.exe -c port=swd freq=4000 ap=0 index=0 mode=hotplug -vb 1 -r32 0x1FF80000 0x14
  • STM32_Programmer_CLI.exe -c port=swd freq=4000 ap=0 index=0 mode=hotplug -vb 1 -ob displ
  • del Image.hex
  • del OptBytes.hex




  • 第 1 行和第 2 行将 .elf 图像拆分为纯代码和仅选项字节的 .hex 文件(我使用十六进制输出,因为它使我能够验证输出)。objcopy 可执行文件来自 Atollic TrueStudio。
  • 第3行去除RDP,擦除设备,然后下载验证码
  • 第 4 行下载选项字节
  • 第 5 行应该只给我一个 4 字节十六进制值的选项字节(见下面的问题)
  • 第 6 行读取选项字节和闪存保护字节
  • 第 7 和第 8 行删除拆分文件 - 这是为了确保这些文件不会被意外单独使用。

所以,我认为只剩下问题了,关于第 5 行:我想通过 -r32 选项读取选项字节,因为输出很短并且很容易被解析,但它会抛出错误。使用第 6 行能够读取选项字节并以更易于阅读的形式提供预期信息。它不容易解析 - 知道如何以简单的 4 字节十六进制值获取选项字节吗?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分