STM32 读保护的实现
读保护的实现即可以在代码中实现,也可以通过ST提供的软件实现。
基于HAL库的读保护实现
使用的开发板是STM32F2系列,代码如下:
HAL_StatusTypeDef FLASH_EnableReadProtection(void)
{
FLASH_OBProgramInitTypeDef OptionsBytesStruct = { 0 };
HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct);
HAL_StatusTypeDef result = HAL_OK;
if (OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_0)
{
OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;
OptionsBytesStruct.RDPLevel = OB_RDP_LEVEL_1;
HAL_FLASH_Unlock();
HAL_FLASH_OB_Unlock();
if (HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)
{
/* Launch the option byte loading */
HAL_FLASH_OB_Launch();
/* Lock the FLASH Option Control Registers access */
HAL_FLASH_OB_Lock();
HAL_FLASH_Lock();
return result;
}
/* Launch the option byte loading */
HAL_FLASH_OB_Launch();
/* Lock the FLASH Option Control Registers access */
HAL_FLASH_OB_Lock();
HAL_FLASH_Lock();
result = HAL_ERROR;
}
return result;
}
基于标准库的读保护实现
使用的开发板是STM32F4系列,代码如下:
uint32_t Flash_EnableReadProtection(void)
{
/* Returns the FLASH Read Protection level. */
if( FLASH_OB_GetRDP() == RESET )
{
/* Unlock the Option Bytes */
FLASH_OB_Unlock();
/* Sets the read protection level. */
FLASH_OB_RDPConfig(OB_RDP_Level_1);
/* Start the Option Bytes programming process. */
if (FLASH_OB_Launch() != FLASH_COMPLETE)
{
/* Disable the Flash option control register access (recommended to protect
the option Bytes against possible unwanted operations) */
FLASH_OB_Lock();
/* Error: Flash read unprotection failed */
return (2);
}
/* Disable the Flash option control register access (recommended to protect
the option Bytes against possible unwanted operations) */
FLASH_OB_Lock();
/* Read Protection successfully enable */
return (1);
}
/* Read Protection successfully enable */
return (1);
}
除了使用代码实现读保护还可以通过STM32 ST-LINK Utiltity实现读保护,如下图所示: 以上三种方式实现的读保护,都需要在执行完成以后,将开发板断电复位,按复位键有可能不起作用,需要断开电源才行。
实现读保护以后,flash将不可以从外部读取,如果想再次烧录代码,需要解除保护,解除读保护也可以使用代码,例如在代码中添加触发机制,比如串口收到某个特殊字符,则调用函数解除读保护。又或者使用软件,依然还是STM32 ST-LINK Utiltity,操作过程和打开读保护一致,只不过在选择等级的时候选择Level 0,则会将flash上的数据全部擦除,接着就可以重新烧代码。
路漫漫其修远兮,吾将上下而求索
|