无需任何操作即可启用读取保护且无法禁用

Posted

技术标签:

【中文标题】无需任何操作即可启用读取保护且无法禁用【英文标题】:Read-out protection enabled without any action and can't be disabled 【发布时间】:2017-11-21 09:37:39 【问题描述】:

我目前正在开发基于 STM32F4 的独立开发板 (STM32F469)。到目前为止,一切正常。我正在通过 ST-Link Utility 和 STM32F4-DISCOVERY ST-Link 通过 SWD 对我的微控制器进行编程。

星期五,当我下班时,一切都很顺利。今天早上我回到办公室时,我的程序没有在板上启动。当我尝试通过 SWD 连接到 STM32F4 时,STM32 ST-Link Utility 显示警告说:

无法读取内存!禁用读出保护并重试

我没有设置任何东西。我做了一些研究并尝试了一些事情:

更改目标>选项字节>读出保护中的选项字节。我不知道它是否与实际 RDP 状态相关,但是当我打开此选项卡时,RDP 处于 Level 1。当我将它设置为 0 并单击 Apply 时,几秒钟后会显示一个错误,提示 Could not set Option bytes!请重置目标并重试。 我试图擦除芯片。当然,自从设置了 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有可能被某种超自然现象激活了吗?我发誓我没有设置这个位。另外,正如我所读到的 Level 1 描述,返回到 Level 0 是可能的(但用户程序已被删除)。对我来说,从 1 级到 0 级是行不通的。所以....我担心RDP级别实际上是2,在这种情况下......我已经死了。

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

提前致谢。

【问题讨论】:

只需禁用ST Link studio中的选项即可。它会说它失败了,它对每个芯片都是如此。 4.0.0.0 中的已知错误。但芯片将被擦除并免费使用。如果它不起作用,则由于电源问题无法完成擦除。 ST 链接工作室?你的意思是 ST-Link Utility 吗?如果是这样,我该怎么做?我没有看到任何允许我这样做的选项(除了通过 Option Bytes 选项,但它不起作用)。 是的,我的意思是 ST Link Utility,抱歉。确实是选项字节窗口。它总是说它失败了,但它实际上执行了操作。 Look, FFFF show 对内存的所有访问都重新可用了,已经被擦除了。 我试过了,但它不起作用。实际上,我没有您必须启用/禁用 RDP 的选项。我的 ST-Link Utility 只为我提供 Level 0、Level 1、Level 2 选项。 Look。你的 ST-Link 版本是多少? 【参考方案1】:

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

【讨论】:

注:如果你在擦除过程中很不走运,它可能会不小心将 RDP 设置为 2,而不是 1。 :cries in ASCII:【参考方案2】:

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

尝试这样做:

    断开芯片的所有连接并重置电源。 打开 ST-Link Utility 并转到 Target > Option Bytes。 取消选中 PCROP_RDP(先不要点击“应用”!)。 将读取保护更改为 0(顶部的下拉菜单)。 现在才点击“应用”。

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

【讨论】:

以上是关于无需任何操作即可启用读取保护且无法禁用的主要内容,如果未能解决你的问题,请参考以下文章

通过 OpenOCD 的 STM32 读出保护

我可以在 phpmyadmin (XAMPP) 中禁用 mysql 保护允许访问而无需任何身份验证吗?

无需解压即可读取 zip 文件的内容

致命:无法读取“https://gitlab.com”的用户名:终端提示已禁用

无需订阅即可读取 React Context 值,例如 Redux 的 store.getState()

PHPExcel - 读取下载的 xlsx 文件