2

我目前正在开发一个基于 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,在这种情况下......好吧,我死了。

有没有办法解决这个问题?我不明白周末会发生什么变化,因为一切正常,但现在一切都没有了。

提前致谢。

4

2 回答 2

3

当我在擦除闪存(0xff ...)时使用选项字节时,我随机设置了读/写保护。

尝试这样做:

  1. 断开芯片的所有连接并重置电源。
  2. 打开 ST-Link 实用程序并转到目标 > 选项字节。
  3. 取消选中 PCROP_RDP(不要单击“应用”!)。
  4. 将读取保护更改为 0(顶部的下拉菜单)。
  5. 现在才单击“应用”。

您将看到芯片被擦除,并且在“读/写保护”选项卡上的“选项字节”屏幕中,您将看到先前受保护的相应存储体现在被自动取消选中。

于 2020-08-17T14:21:16.000 回答
2

我认为这是由于您的 ST-link 与目标板的联系不完整。当任一调试引脚短路或其中一个调试引脚连接被切断时,我曾经遇到过这个问题。由于您自己没有激活 RDP 并且似乎无法删除保护,我相信这肯定是由于连接问题。确认电气连接,看看是否有效。

于 2017-08-07T01:53:12.623 回答