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 中。 BOOT0BOOT1 引脚控制映射到 0x00000000 的内存。通常,BOOT0 绑定为低电平,0x08000000 的闪存在0x00000000 镜像。

我糟糕的 hello world 不是引导加载程序,而是愉快地上下拉动一些随机引脚……这可能吗?我发现的所有其他线程都说引导加载程序是写保护的。

出厂的bootloader确实是写保护的,openocd无法覆盖。

但是,您的应用程序可能通过在GPIOA->CRHAFIO->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 下载程序

STM32 通过引导加载程序闪烁失败 (UART1)

通过 OpenOCD 的 STM32 读出保护

STM32 OpenOCD调试

如何在 STM32 F072 的软件中跳转到引导加载程序(DFU 模式)?

ARM (STM32fxx) 的 OpenOCD (Olimex) 最终启动序列出错