历史上的今天
今天是:2024年10月09日(星期三)
2019年10月09日 | stm32的几种读保护措施讲解
2019-10-09 来源:eefocus
综合网上讲解的几种读保护措施,这里简单总结下:
采用stm32唯一ID作为加密的字符,使用固定密码,采用16位字节AES加密的方式生成密文,然后写进flash,,app程序执行的时候需要判断读取的stm32唯一ID号和AES解密出来是否一致,是执行程序,否则不执行,测试过,但这个方案针对生产比较麻烦,这里不采用
ChipUniqueID[2] = *(__IO u32 *)(0X1FFFF7F0); // 高字节
ChipUniqueID[1] = *(__IO u32 *)(0X1FFFF7EC); //
ChipUniqueID[0] = *(__IO u32 *)(0X1FFFF7E8); // 低字节
ChipUniqueID[3] = 0xffffffff;
printf("rn########### 芯片的唯一ID为: %X-%X-%X-%Xn",
ChipUniqueID[0],ChipUniqueID[1],ChipUniqueID[2],ChipUniqueID[3]);
memcpy(aesKey , "chenjianqun66666" ,16); //AES加密密钥,16字节(128bit)
memset(expressText ,0 ,1024);
memset(expressText ,0 ,1024);
AES_Decrypt(expressText , cipherText , aesKey);//useaesKey decrypt 解密
count[0] =((u32)expressText[3]<<24)|((u32)expressText[2]<<16)|((u32)expressText[1]<<8)|((u32)expressText[0]);
count[1] =((u32)expressText[7]<<24)|((u32)expressText[6]<<16)|((u32)expressText[5]<<8)|((u32)expressText[4]);
count[2] =((u32)expressText[11]<<24)|((u32)expressText[10]<<16)|((u32)expressText[9]<<8)|((u32)expressText[8]);
if((count[0] == flash[0])&&(count[1]== flash [1])&&(count[2] == flash [2]))
{
//App程序
}
方案二:
采用stm32内部flash读保护函数进行读保护,此时板卡芯片不能读写也不能烧录,所以再设计方面需要外部触发信号关闭读保护并且擦除flash的程序,(可以采用按键的触发方式,当按键按下的时候,度保护关闭并擦除)此时可以再次读写和烧录。(待测试)
if(GPIO_ReadInputDataBit(GPIOA , GPIO_Pin_0))
{
if(FLASH_GetReadOutProtectionStatus()!=RESET)
{
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE);
// FLASH_EraseAllPages(); //解除读保护的时候擦除所有
FLASH_Lock();//上锁
}
}
else{
if(FLASH_GetReadOutProtectionStatus()!=SET)
{
FLASH_Unlock();//不解锁FALSH也可设置读保护
FLASH_ReadOutProtection(ENABLE);
FLASH_Lock();//上锁
}
}
这里也可以采用在内部的ram中烧进一段代码,用于取消读保护和擦除,需要再次烧录的时候,使用Boot0 ,boot1进入ram启动状态即可
方案三:
另一种方式修改flash的选项字节(Option type) 官方工具stlink utility(可以参考https://blog.csdn.net/hxiaohai/article/details/78546431?fps=1&locationNum=5)也是修改这个的保护等级,但是103的好像不行(从以下文件中可以看到103系列并没有选项字节文件,加密方式只能选用上述的方案二,但是207的读保护方式因为没有103在方案二的函数,所以只能设置选项字节)修改STM32F2xx_OPT.s 中RDP寄存器的0xAA,为0x00,注意:这里不可以修改为0xCC,0xCC为最高等级,这个值的修改会导致芯片变成砖头
根据网上的资料:http://www.51hei.com/mcu/2767.html 工程中加入opt.s文件既可以实现对flash的加密,但是解密的时候还是需要用stlink的官方工具stlink utility进行设置,要不然就需要在sram里面设置一份设置选项字节为默认出厂形式才可以再次烧录读写
史海拾趣
|
其实从事什么行业不重要,重要的是你能否成为这个行业的精英!! 如果这个问题解决了, 那你的人生已经成功了一半。记住先解决目标: 因为你不知道自己努力的方向,加油是没有用的。人的潜能是无限的, 但人的精力是有限的,不可能所有的事 ...… 查看全部问答> |
|
Microsoft (R) Windows Debugger Version 6.11.0001.404 X86 Copyright (c) Microsoft Corporation. All rights reserved. Opened \\\\.\\pipe\\com_1 Waiting to reconnect... Connected to Windows XP 2600 x86 compatible target at (Wed ...… 查看全部问答> |
|
我用c#在2440上面编写应用程序,开发速度快~ 但是c#怎么碰到底层硬件,怎样直接控制2440的GPIO, evc当中有个内存映射的东西,但是在c#下面怎么搞?? 网上查了下,c#的都是LED的那个,但问题是 GPIO的话是不是得先要写个GPIO驱动的DLL,然后再去createfi ...… 查看全部问答> |
|
设备名称:离心机 使用单片机控制板通过485控制变频器(RTU 9600) 现在遇到一个问题,马达的外壳与地线连接时通信容易中断,而且温控传感器信号受干扰。(变频器与离心机分别用过两个插头供电) 现在特郁闷,这东东有时正常工作,有时不行,有时半 ...… 查看全部问答> |
|
AD603的接法是按其厂家资料上的其中一种接法接的,就是5脚和7脚之间接一个2.15K 的电阻,使得其增益范围为0~40dB,在测试AD603放大倍数的时候发现其并不是按40Vg+20(dB){Vg为1脚和2脚之间的电压差,在-500mV~500mV之间是线性变化的,也就是按那个 ...… 查看全部问答> |
|
我用的是CC2530 Development Kit的开发板套件,在套件里,有个CC2531 USB Dongle,将这个USB Dongle插到电脑上的时候,提示无法识别,参照文档看的时候,上面有说要装个驱动,但是我搜了好久,也没发现它要装什么样的驱动才可以识别,哪位大侠可以 ...… 查看全部问答> |




