八、如何禁止STM32通过SWD和ISP升级保护自己的产品 HAL_FLASH_Program

1、STM32支持的升级方式

      方式一:通过KEIL5 SWD升级

      方式二:通过J-Flash  SWD升级   

      方式三:通过ISP升级  STM32cubeProgrammer   

      方式四:通过IAP升级,就是需要程序员将STM32flash分成两个区,主程序区和升级程序区,主程序将需要升级的固件下载到外置或者内置的flash上,然后通过IAP跳转到升级程序区,升级程序区将下载的估计通过flash写,写到主程序的flash存储区上。

      这四种升级方式,只有第四种需要程序参与,程序员可以根据自己的协议加密解密,这样就可以防止黑客烧录程序。

    方式一,方式二,方式三,这三种烧录程序的方式都存在明显的漏洞,任何黑客可以说只要懂STM32的程序员,都可以让你的产品直接烧录成他的程序,根本没办法保护自己的产品,所以STM32提供了RDP寄存器用来保护自己的程序

  2、RDP数据手册分析

 

级别0:无保护模式,支持五种升级方式

       级别1:使能读保护,STM32cube Programmer无法连接,但是jlink仍然可以连接,特别注意 要是将级别1修改为级别0,会将整个STM32芯片内置的flash清空。

       级别2:启动以后,jlink 无法连接,ISP模式无法启动,而且还是不可逆的,只支持方式四和方式五升级

 3、如何禁止STM32通过SWD和ISP升级

  3.1 HAL_FLASH_Unlock//解锁flash

  3.2 HAL_FLASH_OB_Unlock//解锁ob

  3.3 HAL_FLASHEx_OBProgram//写

  3.4 HAL_FLASH_OB_Launch();//这句话一定要加上,否则重启之后RDP不生效

  3.5 HAL_FLASH_OB_Lock;//ob加锁

   3.6 HAL_FLASH_Lock();//flash加锁

 4、如何禁止STM32通过SWD和ISP升级 详细代码

{

    FLASH_OBProgramInitTypeDef pOBInit;
    HAL_StatusTypeDef ret = HAL_ERROR;
    memset(&pOBInit,0,sizeof(FLASH_OBProgramInitTypeDef));
    
    HAL_FLASHEx_OBGetConfig(&pOBInit);/*读取RDP寄存器中值*/
    printf("111111111-get---RDPLevel:0x%x OPTIONBYTE_WRP:0x%x OPTIONBYTE_BOR;0x%x OPTIONBYTE_USER:0x%x OPTIONBYTE_RDP:0x%x\n",\
                        pOBInit.RDPLevel,(pOBInit.OptionType & OPTIONBYTE_WRP),
                        (pOBInit.OptionType & OPTIONBYTE_BOR),
                        (pOBInit.OptionType & OPTIONBYTE_USER),
                        (pOBInit.OptionType & OPTIONBYTE_RDP));
    pOBInit.OptionType |= OPTIONBYTE_WRP;
    pOBInit.OptionType |= OPTIONBYTE_RDP;
    if(OB_RDP_LEVEL_2 == pOBInit.RDPLevel)
    {
        printf("pOBInit.RDPLevel;0x%x 1111111111success\n",pOBInit.RDPLevel);
        return 0;
    }
    
    pOBInit.RDPLevel = OB_RDP_LEVEL_2;
    ret = HAL_FLASH_Unlock();/*解锁flash*/
    if(HAL_OK != ret)
    {
        printf("Unlock fail");
        return 1;
    }
    ret = HAL_FLASH_OB_Unlock();/*解锁ob*/
    if(HAL_OK != ret)
    {
        printf("ob Unlock fail");
        return 1;
    }
    ret = HAL_FLASHEx_OBProgram(&pOBInit);/*写RDP区*/
    if(HAL_OK != ret)
    {
        printf("HAL_FLASHEx_OBProgram fail:%d",ret);
        return 1;
    }
    printf("33  test --set--HAL_FLASHEx_OBProgram--- ret:0x%x pOBInit.RDPLevel:0x%x\n",ret,pOBInit.RDPLevel);

    ret = HAL_FLASH_OB_Launch();//这句话一定要加上,否则重启之后RDP不生效
    if(HAL_OK != ret)
    {
        printf("HAL_FLASH_OB_Launch fail:%d",ret);
        return 1;
    }
    
    printf("22  HAL_FLASH_OB_Launch success-- pOBInit.RDPLevel:0x%x\n",pOBInit.RDPLevel);
    
    ret = HAL_FLASH_OB_Lock();/*加锁ob*/
    if(HAL_OK != ret)
    {
        printf("ob Unlock fail");
        return 1;
    }
    ret = HAL_FLASH_Lock();/*加锁flash*/
    if(HAL_OK != ret)
    {
        printf("Unlock fail:%d",ret);
        return 1;
    }
    HAL_FLASHEx_OBGetConfig(&pOBInit);/*获取RDP寄存器值,查看是否配置成功*/
    printf("22  test --end-get----- pOBInit.RDPLevel:0x%x\n",pOBInit.RDPLevel);    

    return 0;

}

        

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值