stm32的几种读保护措施讲解

发布者:WhisperingWish最新更新时间:2019-10-09 来源: eefocus关键字:stm32  读保护  加密 手机看文章 扫描二维码
随时随地手机看文章

综合网上讲解的几种读保护措施,这里简单总结下:


采用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里面设置一份设置选项字节为默认出厂形式才可以再次烧录读写


关键字:stm32  读保护  加密 引用地址:stm32的几种读保护措施讲解

上一篇:STM32F40x系列ADC外部通道和引脚对应关系
下一篇:STM32ADC使用方法解析

推荐阅读最新更新时间:2024-11-13 00:22

stm32 ADC的规则通道和注入通道混合使用
之前完成了规则通道DMA的数据传输了,不过平时在使用ADC的时候可能就会遇到很多情况,不可能就这样简单的按规则通道来采样,DMA存储,使用数据的;可能有时候会需要立刻采样,那样我们就需要利用到注入通道了。文档关于注入通道的解释: 1 利用外部触发或通过设置ADC_CR2寄存器的ADON位,启动一组规则通道的转换。 2 如果在规则通道转换期间产生一外部注入触发,当前转换被复位,注入通道序列被以单次扫描方式进行转换。 3 然后,恢复上次被中断的规则组通道转换。如果在注入转换期间产生一规则事件,注入转换不会被中断,但是规则序列将在注入序列结束后被执行。   将变阻器的那路ADC设置为注入通道: 1 ADC_In
[单片机]
stm32IO口方向设置
在操作DS18B20时,需要用到IO口的方向设置。经过自己研究现总结如下,供大家分享。如有问题,请指正交流。 1 例子 /*IO方向设置*/ #define DS18B20_IO_IN() {GPIOE- CRH&=0XFFFFFFF0;GPIOE- CRH|=8 0;} #define DS18B20_IO_OUT() {GPIOE- CRH&=0XFFFFFFF0;GPIOE- CRH|=3 0;} /*IO操作函数*/ #define DS18B20_DQ_OUT PEout(8) #define DS18B20_DQ_IN PEin(8) 2 分析 GPIOE- CRH&=0XFFFFFFF0;GPIOC- CRH|=8
[单片机]
stm32 timer1/pwm 笔记
//--------------------------------TIMER1 先说下RCC时钟 //-------------------------RCC(具体参考所用芯片) AHB所连接的时钟 * RCC_AHBPeriph_DMA1,RCC_AHBPeriph_DMA2,RCC_AHBPeriph_SRAM * RCC_AHBPeriph_FLITF,RCC_AHBPeriph_CRC,RCC_AHBPeriph_FSMC * RCC_AHBPeriph_SDIO APB1所连接的时钟 * RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RC
[单片机]
STM32 DSP库函数详解
对于每个函数,都存在浮点数和定点数的类型,由于使用方法是一致的,这里我们仅以32为浮点数为例来说明。 一.BasicMathFunctions 1.绝对值 pDst = abs(pSrc ), 0 = n blockSize 示例 float32_t *pSrc; float32_t *pDst; uint32_t blocksize; arm_add_f32(pSrc,pDst,blocksize); 2.求和 pDst = pSrcA + pSrcB , 0 = n blockSize. 示例 float32_t *pSrcA; float32_t *pSrcB; float32_t *pD
[单片机]
STM32入门学习笔记之看门狗实验(下)
14.4.2 窗口看门狗实验 功能:程序一运行使得接在PB5上的LED1亮300ms后关闭,进入死循环。等待WWDG中断的到来,在中断里面,喂狗,并对PE5上的LED2进行翻转操作。可以看到LED2不停的闪烁,LED1只在刚启动的时候闪一下。 (1)在上一个实验的wdg.h文件的函数列表区域添加以下代码。 void WWDG_Init( u8 tr, u8 wr, u8 fprer ) ; //窗口看门狗初始化 (2)在上一个实验的wdg.c文件末尾添加以下代码。 /*************************************************** Name :WWDG_IRQHandler
[单片机]
stm32调试,进入 HardFault_Handler
一、现象: 进入调试之后程序要不就进入void HardFault_Handler(void),要么就是进入void MemManage_Handler(void), 二、原因: cstack溢出。heap不够。 三、修改: stm32f10x_startup.s Stack_Size EQU 0x0001000 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp ;// ;// ;// Heap_Size EQU 0x00008000
[单片机]
STM32存储器地址映射
上图是STM32的存储器地址映射图,地址范围为:0x0000_0000-0xFFFF_FFFF;其中代码区的地址是从0x0800_0000开始的,结束于0x0800_0000+芯片的Flash的大小,RAM的起始地址是0x2000_0000,结束于0x2000_0000+芯片的RAM大小。 支持位带操作的两个内存区的范围是: 0x2000_0000‐0x200F_FFFF( SRAM 区中的最低 1MB) 0x4000_0000‐0x400F_FFFF(片上外设区中的最低 1MB) 其中对于SRAM位带区的某个比特位,假设它的地址为Addr,位序号为n(0 =n =7),则该比特在别名区的地址为: Bit_Addr=0x2200
[单片机]
STM32学习笔记之 DS18B20 SEARCH ROM
使用说明,根据MCU不同 用户只需修改4函数 //单总线复位函数 int OWReset(); 单线总线的复位函数,注意这个要做相应修改,如果期间存在要返回1,期间不存在返回0, 直接从总线上读取的是期间存在返回0,不存在返回1 //向总线发送一个字节 void OWWriteByte(unsigned char dat); //向总线发送一位 void OWWriteBit(unsigned char bit_value); //读取总线一位 unsigned char OWReadBit(); 使用时用 int OWFirst();发现第一个单线器件 如果期间存在返回1,并且把ID存在 unsigned char
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved