tl; dr:将固件刷新到0x00000000而不是0x08000000,我输了吗?
您好,
我的设备基于STM32F103CBTx,它带有专有固件并具有读取保护功能。 我通过连接到PA13和PA14的ST-Link v2 SWDIO和SWCLK连接到此命令:
sudo openocd -f /usr/share/openocd/scripts/interface/stlink-v2.cfg -f /usr/share/openocd/scripts/target/stm32f1x.cfg
我不记得我是如何移除闪存保护的,但它起作用,因为原始固件不再起作用了。然后我创建了一个简单的hello world固件,它可以上下拉动三个gpios并闪烁它。 gpios以700毫秒的间隔上下拉动。
闪烁后,我再也无法连接openocd了。我忘了指定偏移量,手册说偏移量默认为0,因为它工作,我想而不是引导加载程序,我的糟糕的hello世界正在快乐地拉上一些随机引脚......这可能吗?我发现的所有其他线程都说引导加载程序是写保护的。
这是我的最后一次接触:
> halt halt target halted due to debug-request, current mode: Handler HardFault xPSR: 0x01000003 pc: 0xfffffffe msp: 0xffffffdc > flash write_image erase fw.hex flash write_image erase fw.hex auto erase enabled target halted due to breakpoint, current mode: Handler HardFault xPSR: 0x61000003 pc: 0x2000003a msp: 0xffffffdc wrote 4096 bytes from file fw.hex in 0.285697s (14.001 KiB/s) > reset reset jtag status contains invalid mode value - communication failure Polling target stm32f1x.cpu failed, trying to reexamine Examination failed, GDB will be halted. Polling again in 100ms
高度赞赏任何指示。
编辑: 我现在得到的,还尝试了另一个st-link:
% sudo openocd -f /usr/share/openocd/scripts/interface/stlink-v2.cfg -f /usr/share/openocd/scripts/target/stm32f1x.cfg Open On-Chip Debugger 0.10.0 Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html Info : auto-selecting first available session transport "hla_swd". To override use 'transport select '. Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD adapter speed: 1000 kHz adapter_nsrst_delay: 100 none separate Info : Unable to match requested speed 1000 kHz, using 950 kHz Info : Unable to match requested speed 1000 kHz, using 950 kHz Info : clock speed 950 kHz Info : STLINK v2 JTAG v17 API v2 SWIM v4 VID 0x0483 PID 0x3748 Info : using stlink api v2 Info : Target voltage: 3.244356 Error: init mode failed (unable to connect to the target) in procedure 'init' in procedure 'ocd_bouncer'
答案 0 :(得分:1)
将固件刷新到0x00000000而不是0x08000000,我输了吗?
不,这根本不重要,它们是一样的。
复位后,MCU加载0
中地址SP
的字,以及4
中地址PC
的下一个字。 BOOT0
和BOOT1
引脚控制哪个内存映射到0x00000000
。通常,BOOT0
为低电平,0x08000000
的闪存在0x00000000
处镜像。
而不是引导加载程序我的糟糕的hello世界正在快乐地拉上一些随机引脚......这可能吗?我发现的所有其他线程都说引导加载程序是写保护的。
工厂bootloader确实是写保护的,openocd不能覆盖它。
但是,您的应用程序可能通过在SWD
或GPIOA->CRH
中写入错误的值来重新配置AFIO->MAPR
引脚,从而阻止openocd工作。这是导致这个问题的最常见原因。
幸运的是,有一种方法可以恢复。
重置后连接
如果在启动openocd时控制器的复位引脚保持低电平一段时间,则会阻止应用程序启动,并弄乱GPIO配置。
当
时,Openocd可以自动执行此操作reset_config srst_only srst_nogate
出现在配置脚本的某处。或者您可以通过您的主板提供的任何方式手动完成。如果你很幸运,它有一个复位按钮,如果没有,你必须找到一种方法以某种方式接地MCU复位引脚。
Info : Target voltage
行。也许还要一秒钟。这需要一些试验和错误,你会在练习中变得更好。
然后,您可以刷新改进的应用程序,小心避免重新配置SWD引脚。