【发布时间】:2015-08-30 01:03:02
【问题描述】:
我有一些使用 StdPeriph 库来编程 stm32 的经验。但现在我用 STM32CubeMX 代码生成器尝试了 STM32Cube HAL。我用这个选项生成了一个项目:
- 中间件:通过 SDIO 的 FreeRTOS 和 FatFS
- 编译器为 GCC
- stm32f103ret6 MCU
我将生成的代码导入 Eclipse 环境。我制作了一个二进制文件,并像往常一样用“st-flash write ...”将其刷新。我的测试程序成功地循环写入 USART1 “Hello” - 这没问题。但是,当我尝试刷新另一个代码时,它以“未知芯片 ID”失败。如果我手动将 NRST 连接到 GND,st-flash 会给出:
...Flash: 0 bytes (0 KiB) in pages of 2048 bytes
完整输出:
2015-06-14T16:07:29 INFO src/stlink-common.c: Loading device parameters....
2015-06-14T16:07:29 INFO src/stlink-common.c: Device connected is: F1 High-density device, id 0x10036414
2015-06-14T16:07:29 INFO src/stlink-common.c: SRAM size: 0x10000 bytes (64 KiB), Flash: 0 bytes (0 KiB) in pages of 2048 bytes
我尝试在 Windows 中使用 ST-Link Utility,但它无法连接到此 MCU 来更改选项字节(使用 stm32 连接到其他设备效果很好)。 我尝试刷过 USART1,但失败了。
我刷的源代码当然不包含任何读/写保护启用。我又试了2个单片机,还是重现了这个错误。
如何通过 MCU 拆砖并刷写任何东西?
【问题讨论】:
-
一些 MCU 包含电路(闪存上的一个或多个特定位)以防止对闪存内容的未经授权的访问。当启用安全性(这些位设置为特定值)时,闪存被视为安全资源,不能再重新编程。您应该向您最喜欢的神或女神祈祷,您所处的情况并非如此。达到这种情况的另一种方法是设置闪存保护寄存器,该寄存器也映射到某个闪存地址。您应该能够通过重新编程此闪存地址来从这种情况中恢复。
-
我知道您写了“没有 R/W 保护”,但即使您的代码没有明确设置启用 R/W 保护,您可能在尝试对代码进行编程时将其直接编程到闪存中(进错地址什么的)。
-
如果仍然设置了 R/W 保护,我应该可以通过 Windows 中的 ST-Link 实用程序将其删除,不是吗?但我什至无法连接到我的设备...
-
大约两周前遇到了完全相同的问题(尽管在不同的 MCU 上)。原因是我们写入了 Flash-Secure 字节(准确地说是 2 位)。现在,如果您的已编程应用程序部署了此安全功能附带的后门机制,则可以撤消它。否则,将无法再通过 JTAG(或任何其他方式)访问 MCU。换句话说,这里必须避免使用,检查 Con Air(电影)并搜索 Pinball 的引语,以“我不知道如何告诉你,赛勒斯......”开头。
-
但为了消除所有疑虑,我建议您参考 STM32 数据表,看看这个 MCU 上是否存在安全功能。搜索 Flash Security 或类似内容...