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;
}