STM32F2去掉读出保护
Posted
技术标签:
【中文标题】STM32F2去掉读出保护【英文标题】:STM32F2 removal of readout protection 【发布时间】:2014-02-28 14:49:38 【问题描述】: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();
【问题讨论】:
【参考方案1】:我使用的库如下(没有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
不是真正的解决方案,但我希望这可以节省一些时间。
【讨论】:
【参考方案2】:这是因为在清除保护标志之前,以及在批量闪存擦除过程中,您重新启动了芯片。
恢复芯片的唯一方法是使用系统引导程序。
上电时强制boot0
引脚为1
并强制boot1
引脚为0
,启动引导加载程序然后连接USB 并使用DFU 编程器对芯片进行编程。
可以下载DFU编程器here。
【讨论】:
以上是关于STM32F2去掉读出保护的主要内容,如果未能解决你的问题,请参考以下文章