我目前正在开发一个基于 STM32F4 的独立板(STM32F469)。到目前为止,一切正常。我正在通过 ST-Link Utility 使用 STM32F4-DISCOVERY ST-Link 通过 SWD 对我的微控制器进行编程。
星期五,当我下班时,一切都很顺利。今天早上我回到办公室时,我的程序没有在板上启动。当我尝试通过 SWD 连接到 STM32F4 时,STM32 ST-Link Utility 显示警告说:
无法读取内存!禁用读出保护并重试
我没有设置任何东西。我做了一些研究并尝试了一些事情:
- 更改Target > Option Bytes > Read Out Protection中的选项字节。我不知道它是否与实际 RDP 状态相关,但是当我打开此选项卡时,RDP 处于Level 1。当我将其设置为 0 并单击Apply时,几秒钟后会显示一条错误消息,称无法设置选项字节!请重置目标并重试。
- 我试图擦除芯片。当然,自从设置了 RDP 后,它就不起作用了。
- 我已经更新了 ST-Link 固件。我没有更新 STM32 ST-Link Utility,因为到目前为止运行良好(v4.0.0.0)。我没有改变任何东西。
- 我试图连接到复位下的芯片。好听,不行
我不知道还能做什么。当我阅读我的 STM32F4 (RM0386) 的参考手册时,第 87 页我们可以阅读:
级别 1:启用读保护。
这是选项字节擦除后的默认读保护级别。读保护级别 1 通过将任何值(分别用于设置级别 0 和级别 2 的 0xAA 和 0xCC 除外)写入 RDP 选项字节来激活。设置读保护级别 1 时:
- 在连接调试功能或从 RAM 或系统存储器引导加载程序引导时,不能执行对闪存或备份 SRAM 的访问(读取、擦除、编程)。在读取请求的情况下会产生总线错误。
- 从闪存启动时,允许从用户代码访问(读取、擦除、编程)闪存和备份 SRAM。
当级别 1 处于活动状态时,将保护选项字节 (RDP) 编程为级别 0 会导致闪存和备份 SRAM 被批量擦除。因此,用户代码区域在读取保护被移除之前被清除。整体擦除仅擦除用户代码区域。包括写保护在内的其他选项字节在大容量擦除操作之前保持不变。OTP 区域不受整体擦除的影响并且保持不变。仅当级别 1 处于活动状态且请求级别 0 时才执行整体擦除。当保护级别增加(0->1、1->2、0->2)时,没有整体擦除。
首先,RDP有没有可能被某种超自然现象激活了?我发誓我没有设置这个位。另外,正如我所读到的1 级描述,有可能回到 0 级(但用户程序已被擦除)。对我来说,从 1 级到 0 级是行不通的。所以....恐怕RDP级别实际上是2,在这种情况下......好吧,我死了。
有没有办法解决这个问题?我不明白周末会发生什么变化,因为一切正常,但现在一切都没有了。
提前致谢。