获取STM32 MCU唯一ID的方法

发布时间:2024-04-11  

前段时间由于应用需要对产品授权进行限制,所以研究了一下有关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个。本质上没有区别,在这里我们按字读取。

1 /*定义STM32 MCU的类型*/ 
2 typedef enum { 
3 STM32F0, 
4 STM32F1, 
5 STM32F2, 
6 STM32F3, 
7 STM32F4, 
8 STM32F7, 
9 STM32L0, 
10 STM32L1, 
11 STM32L4, 
12 STM32H7,
13 }MCUTypedef;
14
15
16 uint32_t idAddr[]={0x1FFFF7AC, /*STM32F0唯一ID起始地址*/
17 0x1FFFF7E8, /*STM32F1唯一ID起始地址*/
18 0x1FFF7A10, /*STM32F2唯一ID起始地址*/
19 0x1FFFF7AC, /*STM32F3唯一ID起始地址*/
20 0x1FFF7A10, /*STM32F4唯一ID起始地址*/
21 0x1FF0F420, /*STM32F7唯一ID起始地址*/
22 0x1FF80050, /*STM32L0唯一ID起始地址*/
23 0x1FF80050, /*STM32L1唯一ID起始地址*/
24 0x1FFF7590, /*STM32L4唯一ID起始地址*/
25 0x1FF0F420}; /*STM32H7唯一ID起始地址*/
26
27 /*获取MCU的唯一ID*/
28 void GetSTM32MCUID(uint32_t *id,MCUTypedef type)
29 {
30 if(id!=NULL)
31 {
32 id[0]=*(uint32_t*)(idAddr[type]);
33 id[1]=*(uint32_t*)(idAddr[type]+4);
34 id[2]=*(uint32_t*)(idAddr[type]+8);
35 }
36 }

3、使用唯一ID

我们得到唯一ID当然是为了使用它,前面在ST资料中描述了三个使用方式。我们在这里来使用它实现软件权限的限制。那么如何用唯一ID来实现软件运行权限的限制呢?我们说一说思路:

首先,我们需要指定一个Flash地址,至于于地址空间的大小则与我们xu要存储的信息有关,一般都不会太长。例如,我们使用MD5来生成加密信息,则最多需要16个字节的存储空间;如果我们使用SHA1来作为生成算法,则最多需要20个字节的空间。当然,我们也可以选取其中的一段或几段。不管选用多大的空间都炫耀将其清零,即初始化为0xFFFFFFFF。

接下来再程序运行前读取前面指定的地址并读取其值,并判断是否全部为0xFFFFFFFF,即判断程序是否第一次运行。如果是,那么就获取唯一ID并作相应的处理,然后将信息写入前面的地址中。

如果不是第一次运行,则读取指定地址的值,并用同样的算法处理唯一ID。然后比较存储的信息与计算的信息是否一致,一致则启动程序运行,不一致则终止运行。

如果有人使用工具读出FLASH内容时,因为改制定的地址已经被写入了信息,所以如果把读出的文件再烧到其它MCU芯片,因唯一ID不同所以信息完全不符程序就不会运行。从而实现了对程序权限的限制。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>