我有两块板,带有STM32F437(IGH6 7BA4S VQ PHL 7B 542)处理器。我们用openocd和jtag编程这些,但最近一张卡停止工作。不再可能对卡进行编程,我们发现的差异之一是卡之间的用户选项字节不同。
我尝试做的是使用options_write命令。请注意,STM32F4显然属于" stm32f2x"命令。
openocd -f openocd.cfg -c "reset halt; stm32f2x unlock 0; reset halt; stm32f2x options_write 0 0x0EC"
这导致错误消息:"错误:stm32x设备受保护"
在STM32F437参考手册RM0090下" 3.7.2编程用户选项字节"它说:
要在此扇区上运行任何操作,请在Flash选项中选择锁定位(OPTLOCK) 必须清除控制寄存器(FLASH_OPTCR)。你可以清除这一点 执行以下序列:\ n
- 在Flash选项密钥寄存器(FLASH_OPTKEYR)中写入OPTKEY1 = 0x0819 2A3B
- 在Flash选项密钥寄存器(FLASH_OPTKEYR)中写入OPTKEY2 = 0x4C5D 6E7F
可以保护用户选项字节,防止不需要的擦除/编程操作 通过软件设置OPTLOCK位。
为此,我在telnet会话中尝试了以下内容:
mww 0x08 0x08192A3B
mww 0x08 0x04C5D6E7F
mdw 0x0C
mww 0x18 0x0EC
mww 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 0x04C5D6E7F
mdw 0x40023c0c
mww 0x40023C18 0x0EC
mww 0x40023C14 0x0EC
mww 0x40023C08 0x02
Power Cycle
在RM0090第3.7.2章中,它还说:4. Set the option start bit (OPTSTRT) in the FLASH_OPTCR register
因此,上面的nr 6.
答案 0 :(得分:1)
闪存寄存器的基地址为0x40023C00(根据RM0090)。 0x08与基偏移,因此您应该写入0x40023C08
答案 1 :(得分:0)
对我来说可行的解决方案如下:
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * \
bytes((BLOCK_SIZE - len(s) % BLOCK_SIZE, ))
是的,不能解锁。stm32f2x lock 0
reset init
mww 0x40023C08 0x08192A3B
mww 0x40023C08 0x04C5D6E7F
等待闪存写入完成,请确保我们收到00000000 mdw 0x40023c0c
mww 0x40023C18 0x0FFF0000
写出与工作中相同的user_options mww 0x40023C14 0x0FFFAAEC
设置选项的起始位,步骤“ 4”。 rm0090。mww 0x40023C14 0x0FFFAAEE
等待闪存擦除完成,请确保我们收到00000。这大约需要10秒钟。它不能与OpenOCD命令“ options_write”一起使用的原因,可以在OpenOCD手册中找到。 “ user_options”自变量采用FLASH_OPTCR的位31-28和7-0。