我正在使用最新的 STMCubeProgrammer/ST-Link-U
tility 版本。我的目标是直接在 .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 的设置禁止选项字节编程)。
所以,我有点不知所措可能会出什么问题:/有什么想法吗?