STM32通过读取芯片唯一ID号来实现程序的保护,防止被抄袭

大家好!我叫肖亚平,从小热爱上了电子技术,读书时阴差阳错的选择了电子这方面的专业,学习电子技术、一直到今年毕业 。对于我的理解来说,学校里面学到的技术不是全部实用,但是必须有用,所以一直奋斗在前线 。我对学习总结出一句话“压力不是有人努力,而是比你牛X N倍的人依然在努力”
STM32通过读取芯片唯一ID号来实现程序的保护,防止被抄袭 。STM32芯片通过可以把程序读出来 。只要在相同的芯片上面,就可以跑起来,那么如何才能让一个程序只能够在一个芯片上正常运行呢?
经过一个下午的时间,总结出这个方法 。通过读取ID号,然后在修改HEX文件来保护自己的程序不被抄袭,相对于开发成本中等的产品,还是有用的 。但是,有一点麻烦 。我用的是芯片 。下面将介绍详细的步骤和方法 。
一.获取ID码
工欲善其事,必先利其器,准备好工具,需要一个及下载软件,一个可以正常运行的硬件 。temp[12]; //存放芯片ID的临时变量 aa[12] = {0xee,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11};//预置ID号,在HEX文中修改 。aa这个数组用于存放预置ID号
复制代码
/******************************************************************************函数名称:读取芯片唯一ID码创建时间:2015-08-11修改时间:2015-08-11备注:******************************************************************************/void (void){u32 temp0,temp1,temp2;temp0 = *(__IO u32*)();//产品唯一身份标识寄存器(96位)temp1 = *(__IO u32*)();temp2 = *(__IO u32*)();//ID码地址:,只需要读取这个地址中的数据就可以了 。temp[0] = (u8)(temp0 & );temp[1] = (u8)((temp0 & )>>8);temp[2] = (u8)((temp0 & )>>16);temp[3] = (u8)((temp0 & )>>24);temp[4] = (u8)(temp1 & );temp[5] = (u8)((temp1 & )>>8);temp[6] = (u8)((temp1 & )>>16);temp[7] = (u8)((temp1 & )>>24);temp[8] = (u8)(temp2 & );temp[9] = (u8)((temp2 & )>>8);temp[10] = (u8)((temp2 & )>>16);temp[11] = (u8)((temp2 & )>>24);}
复制代码
通过void (void)就可以得到ID码了,这个ID码可以用串口输出,也可以用STM32 ST-LINK 读出来 。这里,两种方法我都会讲到 。方法一:通过串口输出得到ID码 。/****************************************************************************************************************************函数名称:串口2初始化配置创建时间:2015-08-11修改时间:2015-08-11备注:*****************************************************************************************************************************/void (void){ ;//定义GPIO类型结构体; //定义串口类型结构体md(, ); //配置GPIOA时钟,并使能时钟 。
md(2,);//配置的时钟,并使能时钟. = ;//配置PA.02作为e. = ; //配置成推挽输出. = ;//配置GPIO时钟为(GPIOA, &);//初始化re. = ;//配置PA.03作为e. = G;//配置GPIO输入浮空(GPIOA, &);//初始化ure. = ;//配置串口波特率为cture. = ; //8位数据位. = ; //1位停止位. = ; //.ntrol = ; //硬件流程控制. =| ; //启动发送和接收(, &); //初始化串口(, , ); //使能串口2接收中断(, ); //使能外部中断}
复制代码
/****************************************************************************************************************************函数名称:发送数据函数创建时间:2015-08-11修改时间:2015-08-11备注:*****************************************************************************************************************************/void ( , * ){= 0; //发送数据临时变量for( = ; > 0;--) //数据的个数{(, *++); //调用发送函数//++; //发送数据的地址加1,切换到下一个要发送数据的地址 。while((, ) == RESET);//发送缓冲区空状态标志位 。只有当缓冲区为空时,才发送下一个数据 。}}
复制代码
串口配置好后,就可以调用(12,temp);函数,就能在串口助手看到ID码了 。