stm32工厂引导加载程序可能被openocd覆盖?
Posted
技术标签:
【中文标题】stm32工厂引导加载程序可能被openocd覆盖?【英文标题】:stm32 factory bootloader possibly overwritten with openocd? 【发布时间】:2018-11-23 11:34:22 【问题描述】: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 固件,它可以上下拉动三个 gpio 并刷新它。 gpios 以 700ms 的间隔上下拉动。
刷机后,我无法再连接openocd了。我忘了指定偏移量,手册说偏移量默认为 0,因为它起作用了,我想我的糟糕的 hello world 不是引导加载程序,而是愉快地上下拉动一些随机引脚……这可能吗?我发现的所有其他线程都说引导加载程序是写保护的。
这是我最后一次联系:
> 停止 停 目标因调试请求而停止,当前模式:处理程序 HardFault xPSR:0x01000003 pc:0xffffffffe msp:0xffffffdc > 闪存 write_image 擦除 fw.hex flash write_image 擦除 fw.hex 启用自动擦除 目标因断点而暂停,当前模式:Handler HardFault xPSR:0x61000003 pc:0x2000003a msp:0xffffffdc 在 0.285697s (14.001 KiB/s) 内从文件 fw.hex 写入 4096 个字节 > 重置 重置 jtag 状态包含无效的模式值 - 通信失败 轮询目标stm32f1x.cpu失败,试图重新检查 检查失败,GDB 将停止。在 100 毫秒内再次轮询高度赞赏的任何方向。
编辑: 我现在得到的,还尝试了另一个st-link:
% sudo openocd -f /usr/share/openocd/scripts/interface/stlink-v2.cfg -f /usr/share/openocd/scripts/target/stm32f1x.cfg 打开片上调试器 0.10.0 在 GNU GPL v2 下获得许可 有关错误报告,请阅读 http://openocd.org/doc/doxygen/bugs.html 信息:自动选择第一个可用的会话传输“hla_swd”。要覆盖使用“传输选择”。 信息:选定的传输接管低级目标控制。与普通 JTAG/SWD 相比,结果可能有所不同 适配器速度:1000 kHz 适配器_nsrst_delay:100 没有分开的 信息:无法匹配请求的速度 1000 kHz,使用 950 kHz 信息:无法匹配请求的速度 1000 kHz,使用 950 kHz 信息:时钟速度 950 kHz 信息:STLINK v2 JTAG v17 API v2 SWIM v4 VID 0x0483 PID 0x3748 信息:使用 stlink api v2 信息:目标电压:3.244356 错误:初始化模式失败(无法连接到目标) 在程序“初始化”中 在程序“ocd_bouncer”中【问题讨论】:
【参考方案1】:将固件刷到 0x00000000 而不是 0x08000000,我迷路了吗?
不,一点都不重要,它们是一样的。
复位后,MCU 将地址为0
的字加载到SP
中,并将下一个地址为4
的字加载到PC
中。 BOOT0
和 BOOT1
引脚控制映射到 0x00000000
的内存。通常,BOOT0
绑定为低电平,0x08000000
的闪存在0x00000000
镜像。
我糟糕的 hello world 不是引导加载程序,而是愉快地上下拉动一些随机引脚……这可能吗?我发现的所有其他线程都说引导加载程序是写保护的。
出厂的bootloader确实是写保护的,openocd无法覆盖。
但是,您的应用程序可能通过在GPIOA->CRH
或AFIO->MAPR
中写入错误值来重新配置SWD
引脚,从而阻止openocd 工作。这是导致此问题的最常见原因。
幸运的是,有办法恢复。
在重置下连接
如果在 openocd 启动时控制器的复位引脚保持低电平一段时间,则会阻止应用程序启动,并弄乱 GPIO 配置。
Openocd 可以自动执行此操作,当
被告知要这样做,reset_config srst_only srst_nogate
行出现在配置脚本的某处。
MCU 复位引脚连接到调试器硬件,即官方 ST-Link/V2 上的引脚 15。
或者您可以通过您的董事会提供的任何方式手动执行此操作。如果幸运的话,它有一个复位按钮,如果没有,你必须想办法将 MCU 复位引脚接地。
将复位引脚拉低 启动openocd 等到Info : Target voltage
行出现。可能还要再等一秒钟。
释放复位引脚。
这需要一些尝试和错误,你会通过练习变得更好。
然后您可以刷新您改进的应用程序,这会小心避免重新配置 SWD 引脚。
【讨论】:
我必须保持复位引脚拉低,连接openocd,输入reset halt
,然后在一秒钟内释放引脚才能擦除闪存。否则无法停止目标或 openocd 失去连接。现在我可以使用正确的 SWD 引脚配置来刷新我的新 hello-world。非常感谢您的澄清!以上是关于stm32工厂引导加载程序可能被openocd覆盖?的主要内容,如果未能解决你的问题,请参考以下文章
Windows上使用 OpenOCD 给 STM32 下载程序