STM32 Flash读保护设置和解除方法,保护代码不被读出。

说明:本文记录 关于 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 中的数据

STM32 Flash读保护设置和解除方法,保护代码不被读出。_第1张图片

解除读保护流程

STM32 Flash读保护设置和解除方法,保护代码不被读出。_第2张图片

Read Out Protection : 改为 Level 0 ,调整为  Level 0 后 Flash 中的程序会被自动擦除。

注意:千万不要改为 Level 2 ,改成Level 2 后 MCU 将会被彻底锁死,相当于熔断保护,无法通过软件再恢复。

STM32 Flash读保护设置和解除方法,保护代码不被读出。_第3张图片

3.2 通过 软件 解除

如果程序分 bootloader 和 app ,bootloader 中设置了读保护或者关闭调试接口,那可以通过专用的app去解除保护, app 中调分别调用

SetFlashReadProtection(false);//解除读保护
HAL_FLASHEx_EnableDebugger(); //启用调试接口

你可能感兴趣的:(STM32,stm32,嵌入式硬件,单片机)