如何获取STM32 MCU的唯一ID

前段时间由于应用需要对产品授权进行限制,所以研究了一下有关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不同所以信息完全不符程序就不会运行。从而实现了对程序权限的限制。

 欢迎关注:

 

  • 15
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
### 回答1: STM32MCU用户手册是一本详细介绍STM32系列微控制器的指南,适合于初学者和具有一定经验的用户。用户手册提供了全面的硬件和软件开发信息,涵盖了STM32MCU的主要知识点和应用。手册主要分为以下几个部分: 第一部分是引言,主要介绍STM32MCU的概述、应用和参考示例。 第二部分是硬件描述,主要描述了STM32MCU的基础硬件、存储器、引脚和外设。同时,还介绍了MCU的电力管理和时钟树等方面的内容。 第三部分是软件开发部分,主要介绍了编程和开发环境,包括Keil工程和CubeMX软件,编程语言和STM32F1、STM32F4系列MCU的例程。 第四部分是应用部分,主要是用于指导用户将STM32MCU应用于实际项目中的方法和技巧。其中包括多种传感器应用示例,通信以及控制相关的例程。 总体而言,STM32MCU用户手册是一个完善的指南,它覆盖了STM32微控制器系列的相关知识,并且提供了一些实用的例程方便用户参考。对于想要学习STM32MCU的爱好者和开发者来说,这是一个非常重要的参考资料。 ### 回答2: STM32MCU用户手册是一本详细介绍STM32微控制器(MCU)系列产品的使用、配置和编程的技术手册。这本手册包括了STM32MCU系列的所有型号,从STM32F0到STM32H7都有详细介绍。 手册分为多个章节,分别介绍了STM32MCU的概述、硬件架构、时钟、外设、存储器、中断、电源管理、编程和调试等方面。 首先,手册介绍了STM32MCU的概述,包括MCU架构、型号、技术参数、开发环境等信息,让用户了解产品的特点及其应用场景。 其次,手册重点阐述了STM32MCU的硬件架构,包括内核、存储器、时钟、中断、通信接口等方面,让用户更好的了解硬件的特性和使用方法。 接下来,手册详细介绍了STM32MCU的外设,包括通信接口(如UART、SPI、I2C等)、定时器、ADC、DAC等,以及其在使用过程中的一些常见问题和解决方案,为用户提供了实用的技术指南。 手册还介绍了STM32MCU的编程和调试方法,包括使用不同的开发环境、编写程序、下载和调试等方面的内容,让用户掌握MCU程序开发的方法和技巧。 总之,STM32MCU用户手册是一部十分实用而全面的技术手册,无论是对于初学者还是有经验的开发者来说,都有很大的参考和借鉴价值。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值