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 中的数据

解除读保护流程

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

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

3.2 通过 软件 解除

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

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

  • 18
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32是STMicroelectronics(意法半导体)推出的一系列32位微控制器(MCU)系列产品。STM32芯片内部集成了Flash存储器,该存储器用于存储程序代码和数据。为了确保程序代码和数据的安全性,STM32提供了一种Flash保护的功能。 Flash保护使得数据或代码不被非授权访问和复制,保护了知识产权和软件的安全。在STM32芯片中,Flash保护可以通过设置相应的Flash控制寄存器来实现。 通常,Flash保护提供了两种级别:级别1和级别2。级别1可以保护程序代码、EEPROM数据和Option Bytes(包含了设备的一些基本配置)不被非法取;级别2在级别1的基础上提供了进一步的保护,可以防止任何方式的取,包括自带的调试功能以及外部编程方式。 要设置Flash保护,首先需要对Flash设备进行解锁,然后根据需求设置相应的保护级别。在解锁过程中,必须提供正确的密钥以确认授权。一旦Flash保护设置,只有通过解密才能取该区域的数据。 需要注意的是,一旦设置Flash保护,将无法再进行擦除或编程操作。所以在设置Flash保护之前,必须确保程序代码、数据和设备选项已经写入Flash中,并且不再需要修改。 总结来说,STM32芯片的Flash保护功能通过设置相应的寄存器来实现,以保护程序代码和数据的安全。但需要注意的是,设置Flash保护后将无法再修改Flash内容,所以在设置前需要确保Flash中的数据已经完整且不再需要修改。 ### 回答2: STM32Flash保护功能是指通过设置特定的寄存器位来保护Flash存储器中的内容,防止未经授权的取或修改。Flash保护功能可以有效保护应用程序的机密性以及保护重要代码和数据不被盗取或恶意篡改。 STM32芯片提供了多种级别的Flash保护,可以根据需要进行灵活的配置。主要有两种级别的Flash保护: 1. 全域级别的Flash保护:可以保护整个Flash存储器中的内容,使其无法被取。设置该级别的保护后,所有的Flash存储器都无法取,包括应用程序代码和数据。只能进行写操作,但无法取其内容。 2. Bank级别的Flash保护:可以对Flash存储器的不同区域进行不同的保护设置。可以设置某些Flash存储器区域只能写入而不能取,另一些区域允许既取又写入。 使用STM32Flash保护功能需要通过编程STM32芯片的Flash保护寄存器来实现。具体的步骤包括设置保护级别、选择Flash存储器区域、设置保护位等。保护设置通常在芯片初始化之前进行,以确保代码和数据的安全性。 需要注意的是,一旦Flash保护设置,就无法再对其进行修改或取消。因此,在设置Flash保护之前,务必仔细考虑保护级别和区域的设置,以免造成不可逆的数据丢失或功能限制。 总结起来,STM32Flash保护功能可以有效保护代码和数据的安全性,防止未经授权的取和修改。通过合理配置保护级别和区域,可以提高系统的安全性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值