【发布时间】:2018-08-02 06:44:11
【问题描述】:
我有两个带有 STM32F437 (IGH6 7BA4S VQ PHL 7B 542) 处理器的板。我们使用 openocd 和 jtag 对它们进行编程,但最近一张卡停止工作。无法再对卡进行编程,我们发现的差异之一是卡之间的用户选项字节不同。
- 0x0EC 在工作卡上
- 0xCFC 就坏了
我尝试使用 options_write 命令。请注意,STM32F4 显然属于“stm32f2x”命令。
openocd -f openocd.cfg -c "reset halt; stm32f2x unlock 0; reset halt; stm32f2x options_write 0 0x0EC"
这导致错误消息:“错误:stm32x 设备受保护”
在“3.7.2 编程用户选项字节”下的 STM32F437 参考手册 RM0090 中它说:
要在该扇区上运行任何操作,Flash 选项中的选项锁定位 (OPTLOCK) 控制寄存器 (FLASH_OPTCR) 必须清零。要被允许清除该位,您有 执行以下序列:\n
- 在闪存选项密钥寄存器 (FLASH_OPTKEYR) 中写入 OPTKEY1 = 0x0819 2A3B
- 在闪存选项密钥寄存器 (FLASH_OPTKEYR) 中写入 OPTKEY2 = 0x4C5D 6E7F
可以通过以下方式保护用户选项字节免受不必要的擦除/编程操作 通过软件设置 OPTLOCK 位。
为此,我在 telnet 会话中尝试了以下操作:
-
mww 0x08 0x08192A3B mww 0x08 0x04C5D6E7Fmdw 0x0Cmww 0x18 0x0ECmww 0x14 0x0EC
第 1 行的 0x08 为 FLASH_OPTKEYR,第 3 行的 0x0C 为 FLASH_SR,用于检查 BSY 位是否未设置,第 4 行的 0x14 为 FLASH_OPTCR1,第 5 行的 0x14 为 FLASH_OPTCR。
然后重新启动并尝试对应用程序进行编程
openocd -f openocd.cfg -c "program HCF-220_07_010_PA2.hex reset exit"
这会导致错误:
错误:stm32x 设备受保护。
我还尝试在编程之前执行以下命令解锁:
openocd -f openocd.cfg -c "openocd -f openocd.cfg -c "reset halt; stm32f2x unlock 0; program HCF-220_07_010_PA2.hex reset exit"
同样的结果:
错误:stm32x 设备受保护。
更新
我在telnet中尝试了以下没有运气,用户选项仍然是0xCFC:
-
mww 0x40023C08 0x08192A3B mww 0x40023C08 0x04C5D6E7Fmdw 0x40023c0cmww 0x40023C18 0x0ECmww 0x40023C14 0x0ECmww 0x40023C08 0x02Power Cycle
在 RM0090 第 3.7.2 章中还说:4. Set the option start bit (OPTSTRT) in the FLASH_OPTCR register
因此上面的 nr 6.。
【问题讨论】: