如何获取STM32 MCU的唯一ID

摘要:
前段时间,由于应用程序需要限制产品授权,我们研究了STM32MCU的唯一ID信息,并最终使用它来实现我们的目标。如果不是第一次,请读取指定地址的值,并使用相同的算法处理唯一ID。如果有人使用该工具读取FLASH内容,因为指定地址已写入信息,如果读取的文件被刻录到其他MCU芯片,因为唯一ID不同,信息完全不一致,则程序将无法运行。

  前段时间由于应用需要对产品授权进行限制,所以研究了一下有关STM32 MCU的唯一ID的资料,并最终利用它实现了我们的目标。

1、基本描述

  在STM32的全系列MCU中均有一个96位的唯一设备标识符。在ST的相关资料中,对其功能的描述有3各方面:

  • 用作序列号(例如 USB 字符串序列号或其它终端应用程序)
  • 在对内部 Flash 进行编程前将唯一 ID 与软件加密原语和协议结合使用时用作安全密钥以提高 Flash 中代码的安全性
  • 激活安全自举过程等

  在资料中对其特性的描述是:96 位的唯一设备标识符提供了一个对于任何设备和任何上下文都唯一的参考号码。用户永远不能改变这些位。96 位的唯一设备标识符也可以以单字节/半字/字等不同方式读取,然后使用自定义算法连接起来。

  想要读取唯一ID,就需要知道它的存储地址,在不同系列的MCU中地址是有差别的,我们查询了部分MCU的资料并将其总结如下:

如何获取STM32 MCU的唯一ID第1张

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

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

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

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

欢迎关注:

如何获取STM32 MCU的唯一ID第2张

免责声明:文章转载自《如何获取STM32 MCU的唯一ID》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux下java nohup 后台运行关闭后进程停止的原因,不挂断后台运行命令java箭头函数,lambda表达式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

新能源汽车三大核心技术

            在新能源汽车的整个平台架构中,VCU (Vehicle Control Unit整车控制器)、MCU (Moter Control Unit 电机控制器)和 BMS (BATTERY MANAGEMENT SYSTEM 电池管理系统)是最重要的核心技术,对整车的动力性、经济性、可靠性和安全性等有着重要影响。 目录: VCU MCU...

MCU与FPGA通信

1.MCU启动FPGA相应功能模块 通过译码器选择相应的功能模块,调用实现功能。 2.MCU与FPGA串口通信 SPI协议简单、可靠、易实现,速度快,推荐使用SPI。SPI为四线机制,包含MOSI、MISO、SCK、SSEL。 (SPI协议:http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_B...

华大MCU的应用中的问题记录

这两年芯片的价格越炒越贵,特别是像STM32,TI,NXP等等知名品牌更是水涨船高,甚至有时候你即使你愿意花大价钱去购买,也不一定能买得到,所以很多公司纷纷转向了国产芯片。国产芯片其实也不太好买得到,价钱也不便宜,而且可供参考的资料也是寥寥无几,有时候你遇到了问题想上网找资料都很难找到可以参考的,这也是国产芯片的一个弱势吧。 废话不多说了,接下来谈谈华大单...

痞子衡嵌入式:盘点国内RISC-V内核MCU厂商(2020年发布产品)

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是国内RISC-V内核MCU厂商(2020)。 虽然RISC-V风潮已经吹了好几年,但2019年才是其真正进入主流市场的元年,最近国内大量芯片公司崛起,其中有很多公司想在RISC-V新赛道有一番作为,毕竟ARM内核早已是红海,而RISC-V尚处于蓝海。今天痞子衡就为大家盘点一下发布过RISC-...

STM32代码自动生成工具使用说明

1.什么是“代码自动生成工具” 为了降低开发者的开发门槛,缩短开发周期,降低开发资源投入,机智云推出了代码自动生成服务。云端会根据产品定义的数据点生成对应产品的设备端代码。 自动生成的代码实现了机智云通信协议的解析与封包、传感器数据与通信数据的转换逻辑,并封装成了简单的API,且提供了多种平台的实例代码。当设备收到云端或APP端的数据后,程序会将数据转换成...

痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU特性那些事(4)- RT105x选型

  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦i.MX RT1xxx系列MCU的RT105x选型。   大家都知道i.MX RT105x是i.MX RT系列第一款产品,在提这款产品特性的时候,我们往往说的是i.MXRT1052DVL6B的特性,这也是RT105x系列主推的一款核心芯片,目前一些第三方硬件公司(比如ZLG、野火、...