"); //-->
前段时间由于应用需要对产品授权进行限制,所以研究了一下有关STM32 MCU的唯一ID的资料,并最终利用它实现了我们的目标。
1、基本描述
在STM32的全系列MCU中均有一个96位的唯一设备标识符。在ST的相关资料中,对其功能的描述有3各方面:
用作序列号(例如 USB 字符串序列号或其它终端应用程序)
在对内部 Flash 进行编程前将唯一 ID 与软件加密原语和协议结合使用时用作安全密钥以提高 Flash 中代码的安全性
激活安全自举过程等
在资料中对其特性的描述是:96 位的唯一设备标识符提供了一个对于任何设备和任何上下文都唯一的参考号码。用户永远不能改变这些位。96 位的唯一设备标识符也可以以单字节/半字/字等不同方式读取,然后使用自定义算法连接起来。
想要读取唯一ID,就需要知道它的存储地址,在不同系列的MCU中地址是有差别的,我们查询了部分MCU的资料并将其总结如下:
2、获取唯一ID
前面我们对唯一ID做了简单的描述,并且得到了其存储地址,接下来我们说以说如何得到这个ID。
前面已经描述过唯一ID可以按字节、半字、字等方式读取。唯一ID是一个96位的信息串,所以按字读取就是3个字,按半字读取就是6个,按字节读取就是12个。本质上没有区别,在这里我们按字读取。
/*定义STM32 MCU的类型*/
typedef enum {
STM32F0,
STM32F1,
STM32F2,
STM32F3,
STM32F4,
STM32F7,
STM32L0,
STM32L1,
STM32L4,
STM32H7,
}MCUTypedef;
uint32_tidAddr[]={0x1FFFF7AC, /*STM32F0唯一ID起始地址*/
0x1FFFF7E8, /*STM32F1唯一ID起始地址*/
0x1FFF7A10, /*STM32F2唯一ID起始地址*/
0x1FFFF7AC, /*STM32F3唯一ID起始地址*/
0x1FFF7A10, /*STM32F4唯一ID起始地址*/
0x1FF0F420, /*STM32F7唯一ID起始地址*/
0x1FF80050, /*STM32L0唯一ID起始地址*/
0x1FF80050, /*STM32L1唯一ID起始地址*/
0x1FFF7590, /*STM32L4唯一ID起始地址*/
0x1FF0F420}; /*STM32H7唯一ID起始地址*/
/*获取MCU的唯一ID*/
voidGetSTM32MCUID(uint32_t *id,MCUTypedef type)
{
if(id!=NULL)
{
id[0]=*(uint32_t*)(idAddr[type]);
id[1]=*(uint32_t*)(idAddr[type]+4);
id[2]=*(uint32_t*)(idAddr[type]+8);
}
}
3、使用唯一ID
我们得到唯一ID当然是为了使用它,前面在ST资料中描述了三个使用方式。我们在这里来使用它实现软件权限的限制。那么如何用唯一ID来实现软件运行权限的限制呢?我们说一说思路:
首先,我们需要指定一个Flash地址,至于于地址空间的大小则与我们xu要存储的信息有关,一般都不会太长。例如,我们使用MD5来生成加密信息,则最多需要16个字节的存储空间;如果我们使用SHA1来作为生成算法,则最多需要20个字节的空间。当然,我们也可以选取其中的一段或几段。不管选用多大的空间都炫耀将其清零,即初始化为0xFFFFFFFF。
接下来再程序运行前读取前面指定的地址并读取其值,并判断是否全部为0xFFFFFFFF,即判断程序是否第一次运行。如果是,那么就获取唯一ID并作相应的处理,然后将信息写入前面的地址中。
如果不是第一次运行,则读取指定地址的值,并用同样的算法处理唯一ID。然后比较存储的信息与计算的信息是否一致,一致则启动程序运行,不一致则终止运行。
如果有人使用工具读出FLASH内容时,因为改制定的地址已经被写入了信息,所以如果把读出的文件再烧到其它MCU芯片,因唯一ID不同所以信息完全不符程序就不会运行。从而实现了对程序权限的限制。
————————————————
原文链接:https://blog.csdn.net/foxclever/article/details/80294516
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
FreeRTOS 在STM32上的移植 V1.0
基于STM32的智能地震监测预警系统
详解STM32单片机的堆栈
汽车表盘显示和GPS地图显示的动感演示
STM32 3.3V参考电压(用于DAC和ADC)
STM32的低功耗模式总结!
“sacq”的STM32运行uCGUI演示的视频片段1
STM32开发-LL库与HAL库对比
IAR_STM32开发板原理图
手把手教你学ARM-STM32 第二讲 STM32最小系统
基于STM32的MP3播放器设计与实现(提供MDK完整源码)
STM32的定时器进行输入脉冲的计数(代码).
基于STM32指甲式脉搏血氧仪七大核心功能解析与实现
STM32 5向摇杆接口电路
如何使用STM32的PVD对电源的电压进行监控
功率监测与控制系统DIY——搭建环境,定时器翻转LED
STM32 100M、10M网卡电路(上)
STM32 GPIO的十大优越功能综述
手把手教你学ARM-STM32 第三讲 系统时钟初始化函数与延时函数的实现
聚焦工程师需求,贸泽电子带来丰富 STMicroelectronics 产品方案
手把手教你学ARM-STM32 第一讲 绪论(上)
STM32 100M、10M网卡电路(下)
三款经典的STM32开发板例程汇总
采用按键消抖电路,不用再软件延时了
RealView MDK开发STM32奇怪错误的解决
STM32 心电图方案全解析:手把手教你开发医疗级心电监测设备!
意法半导体出厂中国制造的STM32 MCU
结合RTC实现的“智能定时任务系统”:设计与实战
STM32微控制器系列——常见问题解答(基本篇)
STM32 3.3V电源电路(提供给CPU和大部分外设)