STM32F2去掉读出保护

时间:2014-02-04 14:56:26

标签: c flash security microcontroller stm32

STM32F2 micro-controller具有防止使用调试接口读取应用程序代码的功能。它工作正常,通过将读保护(RDP)级别配置为'1' (!0xAA || !0xCC) or '2' (0xCC which is irreversible),可以非常轻松地完成。除了试图将其关闭之外,我还会遇到问题。

当RDP水平降低到0时的预期行为:

  • 芯片将执行批量闪存擦除。
  • 然后清除保护标志。
  • 系统重置

除了电源循环后,闪存已成功擦除,但保护标志保持在电平“1”(0x55),保持调试接口禁用。从而阻止我编写任何新的应用程序代码。有可能摆弄调试器并手动将标志强制为0(0xAA)..

是否有人与STM32F2xx系列有相同或相似的问题可以帮助我?我正在使用STM32标准外设驱动程序来编程闪存。

启用

// Enable read out protection
FLASH_OB_Unlock();
FLASH_OB_RDPConfig(OB_RDP_Level_1);
FLASH_OB_Launch();
FLASH_OB_Lock();

// Restart platform
NVIC_SystemReset();

停用

// Disable read out protection
FLASH_OB_Unlock();
FLASH_OB_RDPConfig(OB_RDP_Level_0);
FLASH_OB_Launch();
FLASH_OB_Lock();

// Restart platform
NVIC_SystemReset();

2 个答案:

答案 0 :(得分:2)

这是因为在清除保护标志之前,在批量闪存擦除过程中,您重新启动芯片。

恢复芯片的唯一方法是使用系统引导程序。

强制boot0引脚为1并强制boot1引脚在上电时为0,启动引导加载程序然后连接USB并使用DFU编程器对芯片进行编程。 您可以下载DFU程序员here

答案 1 :(得分:2)

我使用了如下的库(没有FLASH_Unlock();它没有工作):

// Flash Readout Protection Level 1
if (FLASH_OB_GetRDP() != SET) {
    FLASH_Unlock();                           // this line is critical!
    FLASH_OB_Unlock();
    FLASH_OB_RDPConfig(OB_RDP_Level_1);
    FLASH_OB_Launch();                        // Option Bytes programming
    FLASH_OB_Lock();
    FLASH_Lock();
}

无需NVIC_SystemReset();

对我来说,检查功能最适合STM32 ST-LINK utility CLI

> "C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ST-LINK_CLI.exe" -c SWD -rOB
STM32 ST-LINK CLI v3.0.0.0
STM32 ST-LINK Command Line Interface

ST-LINK SN : 51FF6D064989525019422287
ST-LINK Firmware version : V2J27S0
Connected via SWD.
SWD Frequency = 4000K.
Target voltage = 2.9 V.
Connection mode : Normal.
Device ID:0x422
Device flash Size : 256 Kbytes
Device family :STM32F302xB-xC/F303xB-xC/F358xx

Option bytes:
RDP         : Level 1
IWDG_SW     : 1
nRST_STOP   : 1
nRST_STDBY  : 1
nBoot1      : 1
VDDA        : 1
Data0       : 0xFF
Data1       : 0xFF
nSRAM_Parity: 1
WRP         : 0xFFFFFFFF

不是真正的解决方案,但我希望这能节省一些时间。