获取STM32 MCU唯一ID的方法

发布者:innovation2最新更新时间:2024-04-11 来源: elecfans关键字: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个。本质上没有区别,在这里我们按字读取。

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不同所以信息完全不符程序就不会运行。从而实现了对程序权限的限制。


关键字:STM32  MCU  唯一ID 引用地址:获取STM32 MCU唯一ID的方法

上一篇:STM32F4的FPU性能的设置及要点
下一篇:转学STM32的入门总结和学习步骤

推荐阅读最新更新时间:2024-11-11 06:45

stm32 中怎样把变量定义到flash中
目的:将变量定义到flash中 其实写这个是相当于一个记录而已,突然在做字模显示问题,想到如果将字模数据放到内存中的话,难免多了很容易出问题,不如就放在flash中,这样就可以不去改变他 int a;a在内存中 const int a;a在flash中,这个可以通过打印地址来看
[单片机]
51单片机点阵8X8贪吃蛇设计(仿真 + 程序)
51单片机点阵8X8贪吃蛇设计(仿真 + 程序)闲来无聊制作的贪吃蛇8X8程序和仿真下面压缩包里都有,元器件都是平时最常用的,很好制作。 单片机程序源码: #include reg51.h #define uchar unsigned char #define SNAKE 20 //最大长度 #define TIME 50 //显示延时时间 #define SPEED 71 //速度控制 //define keyenable 1 sbit keyenable=P0^0; //方向使能 sbit keyx=P0^1;
[单片机]
51<font color='red'>单片机</font>点阵8X8贪吃蛇设计(仿真 + 程序)
51单片机的二氧化碳、温湿度检测系统
基于51单片机的二氧化碳、温湿度检测系统设计。采用LCD1602显示,CO2传感器使用MH-Z19B,温湿度传感器使用DHT11 制作出来的实物图如下: Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件) 单片机源程序如下: /********************************** (C) COPYRIGHT ******************************* * File Name : main.C * Author : * License : MIT * Version : V1.0 * Date
[单片机]
51<font color='red'>单片机</font>的二氧化碳、温湿度检测系统
常规放大电路和差分放大电路原理分析
0、小叙闲言 有一个两相四线的步进电机,需测量其A、B两相的电流大小,电机线圈的电阻为0.6Ω,电感为2.2mH。 打算在A、B相各串接一个0.1Ω的采样电阻,然后通过放大电路,送到单片机采样(STM32,12位AD采样),放大的电压值是最大应为3v。 电路如下。 我在这里讨论其中的采样放大电路。 很多东西平时在书本上学到烂熟,但真正在实战时,还是碰到了不少问题。 纸上得来终觉浅,绝知此事要躬行。 因此,在这里总结一下,供自己学习之用,或许也可给大家一点点帮助。 图1 步进电机系统结构图 1、常规放大电路 这里暂时不讨论放大电路的工作原理,直接使用放大器的虚短(短路)和虚断(断路)性质来分析这一类电路,之所以在前面加个虚字,是
[单片机]
常规放大电路和差分放大电路原理分析
基于单片机的智能太阳能路灯设计
太阳能路灯的应用具有重要的现实意义,尤其是靠小规模火力发电或季节性水力发电的地区,更应大力发展太阳能电力。太阳能路灯以其先进、稳定、智能、成熟的控制技术及显著的节能特性、简便的维护方式等特点得到推广。随着太阳能照明灯具产品的普及,很多应用项目存在质量和售后服务问题。因此,需及时分析原因、规范市场,使太阳能路灯市场健康有序地发展。太阳能是地球上最为直接、普遍、清洁的能源,其作为一种可再生能源,每天达到地球表面的辐射能约2.5亿万桶石油。 1 硬件电路设计 选择DS1302计时器、AT24C02存储器、4位数码显示器、过充过放电路、STC12C2051单片机等组成智能控制系统。根据各部分电路的功能不同,整体电路可分为以下几个部分:太阳
[单片机]
基于<font color='red'>单片机</font>的智能太阳能路灯设计
stm32的微秒延时程序
我的stm32系统时钟为72MHZ,用软件延时方法实现微秒级的延时,既空循环: 延时函数为: #define delayUs(x) { unsigned int _dcnt; \ _dcnt=(x*16); \ while(_dcnt-- 0) \ { continue; }\ } x---------为延时时间(单位为us) 其中_dcnt=(x*16); 中的16,是可以改的,改为8的时候延时间时间为x*0.5。
[单片机]
STM32如何确定执行哪个中断函数
如下面所示: NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //NRF24L01 中断响应 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级 0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级为1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能 NVIC_Init(&NVIC_InitStructure); 则对应的中断函数就是 STM3210x_
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved