说明:本文记录 关于 STM32 的 Flash 读保护的设置和解除方法,可以简单的保护 Flash 中的代码不被读出,这个方法能防止通过调试工具读出MCU内部程序,但不清楚专业搞破解的是否有手段读出设置了读保护的程序,为了代码更安全还是建议根据 MCU ID 增加软件加密,或者使用其他加密方式。
测试平台:测试环境是 STM32G474 , 其他 STM32 系列的类似,可以 CV 过去试试。
1.设置和解除读保护的代码:
/**
* @brief 设置 Flash 读保护.
* @param [in] state: true: 使能读保护, false: 关闭读保护.
* @retval true: 设置成功.
* @retval false: 设置失败.
*/
bool SetFlashReadProtection(bool state)
{
FLASH_OBProgramInitTypeDef OptionsBytesStruct = { 0 };
HAL_StatusTypeDef err;
HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct);
printf("HAL_FLASHEx_OBGetConfig():OptionsBytesStruct.RDPLevel = %02X \r\n", OptionsBytesStruct.RDPLevel);
if (((state == true) && (OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_0))
|| ((state == false) && (OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_1)))
{
OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;
if (state == true)
{
OptionsBytesStruct.RDPLevel = OB_RDP_LEVEL_1;
}
else
{
OptionsBytesStruct.RDPLevel = OB_RDP_LEVEL_0;
}
err = HAL_FLASH_Unlock();
err |= HAL_FLASH_OB_Unlock();
err |= HAL_FLASHEx_OBProgram(&OptionsBytesStruct);
if (err == HAL_OK)
{
HAL_FLASH_OB_Launch();
HAL_FLASH_OB_Lock();
HAL_FLASH_Lock();
}
else
{
printf("flash lock false \r\n");
return false;
}
printf("HAL_FLASHEx_OBGetConfig():OptionsBytesStruct.RDPLevel = %02X \r\n", OptionsBytesStruct.RDPLevel);
}
else
{
}
printf("flash lock true \r\n");
return true;
}
2.关闭调试接口代码
注意:HAL_FLASHEx_DisableDebugger(); 调用后 SWD 接口会被关闭,ST-LINK 等调试工具无法通过 SWD 连接 MCU,也无法使用 STM32 ST-LINK Utility 软件 通过 ST-LINK 连接MCU解除读保护。
JTAG:接口未测试
HAL_FLASHEx_DisableDebugger(); //禁用调试接口,锁后调试接口不能再使用,SWD口禁用。
HAL_FLASHEx_EnableDebugger(); //启用调试接口
3.读保护解除
3.1 通过 ST-LINK Utility 软件 和 ST-LINK 连接MCU解除读保护
添加读保护后无法读出 Flash 中的数据
解除读保护流程
Read Out Protection : 改为 Level 0 ,调整为 Level 0 后 Flash 中的程序会被自动擦除。
注意:千万不要改为 Level 2 ,改成Level 2 后 MCU 将会被彻底锁死,相当于熔断保护,无法通过软件再恢复。
文章来源:https://www.toymoban.com/news/detail-823717.html
3.2 通过 软件 解除
如果程序分 bootloader 和 app ,bootloader 中设置了读保护或者关闭调试接口,那可以通过专用的app去解除保护, app 中调分别调用文章来源地址https://www.toymoban.com/news/detail-823717.html
SetFlashReadProtection(false);//解除读保护
HAL_FLASHEx_EnableDebugger(); //启用调试接口
到了这里,关于STM32 Flash读保护设置和解除方法,保护代码不被读出。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!