STM32开发(13)----获取唯一设备标识符UID
获取唯一设备标识符UID
- 前言
- 一、什么事UID
- 二、实验过程
- 1.CubeMx配置
- 2.代码实现
- 3.实验结果
- 总结
前言
这一章节介绍如何获取STM32芯片中的唯一的ID号的两种方法。
一、什么事UID
在许多项目中,识别设备是必要的。从简单的设备描述到更复杂的设备,如 USB 串行命名、安全密钥、加密密钥等。有许多方法可以在微控制器中实现唯一ID。从简单的硬编码到固件中,单独刷新信息闪存到设备首次运行时随机生成。当谈到STM32 MCU时,还有另一种更简单,更清晰的可能性。在制造过程中,96位ID被编码到微控制器上。
所谓的唯一 ID 由 3 个部分组成:
- 晶圆上的 X 和 Y 坐标以 BCD 格式表示
- 批号
- 晶圆编号
对于 UID 访问,您只需在指定地址读取内存。请记住,不同的MCU线在内存中具有此数据扇区的不同位置。在这篇文章的最后,我将总结其中的大部分。
由于STM32是32位处理器,我们必须执行三次32位偏移的读出,以获得完整的92位ID。当然,我们只能使用其中的一部分。
例如,STM32F0处理器的起始地址是0x1FFFF7AC。因此,要读取完整的 UID,我们必须读取以下地址:
#define ID1 (*(unsigned long *)0x1FFFF7AC)
#define ID2 (*(unsigned long *)0x1FFFF7B0)
#define ID3 (*(unsigned long *)0x1FFFF7B4)
我们还可以将起始地址定义为数组的开头:
unsigned long *id = (unsigned long *)0x1FFFF7AC;
id[0]
id[1]
id[2]
由于STM32中的无符号长整型是一个32位变量,因此按索引访问数组会导致索引*32位偏移与起始地址。
您可以在下面找到大多数STM32微控制器的唯一ID起始地址。
二、实验过程
这里Cubex配置非必须,主要是为了打印出UID,所以可以使用前面实验的代码
1.CubeMx配置
选择芯片stm32f103c6t6,新建工程
设置时钟源,最小系统外部晶振8Mhz,作为外部高速HSE时钟源。由于没有外接外部低速晶振,这里低速时钟源选择旁路时钟源。
配置时钟树,这里使用官方推荐的配置
CubeMX配置如下:
USART1的参数配置如下,波特率115200,传输数据长度为8 Bit,奇偶检验无,停止位1.其他参数默认
SYS选项卡中Debug选项选择串口(这个选项可以设置,不会有影响)
Code Generator中设置只拷贝使用到的库,分离.c和.h文件
设置好项目名称和路径,点击GENERATE CODE即可,生成后使用keil5 IDE打开。
2.代码实现
两种获取方式如下:
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 *///方法一uint32_t uid[3];uid[0] = (uint32_t)(READ_REG(*((uint32_t *)UID_BASE)));uid[1] = (uint32_t)(READ_REG(*((uint32_t *)(UID_BASE + 4U))));uid[2] = (uint32_t)(READ_REG(*((uint32_t *)(UID_BASE + 8U))));for(int8_t i = 0; i < 3; i++) {printf("%x \r\n", uid[i]);} printf("===========================================\r\n"); //方法二uint32_t *id = (uint32_t *)0x1FFFF7E8;for(int8_t i = 0; i < 3; i++) {printf("%x \r\n", *(uint8_t *)(id+i));} printf("\r\n"); /* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
3.实验结果
这里打印的结果大家可能不同,这是正常的,相同才不正常
46528358
46528358
总结
本章简单介绍了获取STM32唯一设备标识符UID的方法。
相关文章:

STM32开发(13)----获取唯一设备标识符UID
获取唯一设备标识符UID前言一、什么事UID二、实验过程1.CubeMx配置2.代码实现3.实验结果总结前言 这一章节介绍如何获取STM32芯片中的唯一的ID号的两种方法。 一、什么事UID 在许多项目中,识别设备是必要的。从简单的设备描述到更复杂的设备,如 USB 串…...
华为OD机试 - 最优调度策略(Python) | 机试题+算法思路+考点+代码解析 【2023】
最优调度策略 题目 在通信系统中有一个常见的问题是对用户进行不同策略的调度 会得到不同系统消耗的性能 假设由 N 个待串行用户,每个用户可以使用 A/B/C 三种不同的调度策略 不同的策略会消耗不同的系统资源 请你根据如下规则进行用户调度 并返回总的消耗资源数 规则是:相…...

前端零基础入门-002-集成开发环境
本篇目标 了解市面上常用的前端集成开发环境(ide)掌握 HBuiberX 的使用:下载安装,新建项目、网页、运行网页。 内容摘要 本篇介绍了市面上流行的几款前端集成开发环境(ide),并介绍了 Hbuilde…...
su和sudo的区别
linux中 su和sudo的区别 su和sudo是两个常用的切换到root超级用户命令。功能上类似,但使用上还是有不少差异。 su命令 su是切换到root用户的命令,主要用法如下: su:不带参数直接输入su将切换到root用户,需要输入root…...
【ChatGPT】使用ChatGPT进行51单片机程序编程体验
背景 最近ChatGPT大火,笔者尝试使用它进行了51单片机编程尝试。ChatGPT是一种由OpenAI训练的大型语言模型,具有强大的自然语言处理能力和生成代码的能力。 使用ChatGPT进行51单片机编程,笔者发现它可以帮助开发人员快速生成符合要求的代码&a…...

Docker之路(1.Docker概述、组成以及特点)
1.docker为什么会出现? 一款产品或者项目来说,一般有三个环境,日常/测试环境、预发环境、正式/线上环境 这么多环境,对其环境的配置是十分麻烦的,每一个机器都要部署环境,有的会有集群Redis、Hadoop等&…...
非对称加密算法在android的应用
前言android 系统安全内容总结 4、非对称加密算法应用 主要特性包括secure boot、AVB、OTA包签名、apk签名、apex、ko签名; 除此外上层应用keystore服务、涉及TEEOS非对称算法的功能安全会用到。属于功能安全本章节暂不描述。 4.1、secboot+avb secboot+avb属于安全启动参照…...

51单片机——定时器中断实验,小白讲解,相互学习
定时器介绍 1,CPU时序的有关知识 震荡周期:为单片机提供定时信号的震荡源的周期(晶振周期或外加震荡周期)。状态周期:2个震荡周期为1个状态周期,用S表示。震荡周期又称S周期或时钟周期。机器周期ÿ…...

什么是循环依赖,spring是如何去解决循环依赖问题的?什么是三级缓存?【spring】
文章目录什么是循环依赖?什么是三级缓存?执行流程什么是循环依赖? 在我们的开发中,会不可避免的遇到Bean之间循环依赖的,所谓循环依赖,就是两个或者两个以上的Bean互相持有对方,这样在程序运行…...
Cron表达式
网上搜一下就有在线生成网站,很方便。 比如:Cron表达式生成器 用途 定时调度任务,比如说服务器、云函数中定时执行脚本函数。 Cron 表达式构成 Cron 表达式是字符串,一般由 6 - 7 个字段构成,空格分隔。每个字段代…...

JavaScript 作用域
作用域是可访问变量的集合。在JavaScript中,能够定义全局作用域或者局部作用域。在 JavaScript 中, 对象和函数同样也是变量。在 JavaScript 中, 作用域为可访问变量,对象,函数的集合。JavaScript 函数作用域: 作用域在函数内修改。JavaScrip…...

Hive内部表与外部表的区别具体说明
目录 1.在/opt/atguigu/目录下,新建两个txt文件 2.在hadoop的web端递归创建一个目录,存储这两个文件 3.查看web端的文件 一、内部表: 1.创建一个内部表,并指定内部表的存储位置 2.查看内部表,内部表中没有数据 …...

Java流程控制
目录 前言 一、用户交互Scanner及其进阶使用 输入的数据为字符串类型 输入的数据为整型或者浮点型 练习 二、顺序结构 三、选择结构 if单选泽结构 if双选择结构 if多选择结构 嵌套的if结构 switch多选择结构 四、循环结构 while循环 Do...while循环 For循环 练习 利用for循环…...

I.MX6ULL_Linux_系统篇(17) uboot分析-启动linux
bootz 启动 Linux 内核 images 全局变量 不管是 bootz 还是 bootm 命令,在启动 Linux 内核的时候都会用到一个重要的全局变量:images, images 在文件 cmd/bootm.c 中有如下定义: images 是 bootm_headers_t 类型的全局变量&…...

C/C++每日一练(20230221)
目录 1. 格雷编码 2. 矩阵问题 3. 搜索旋转排序数组 II 1. 格雷编码 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。即使有多个不同答案&#…...

用Python采集热门城市景点数据并简单制作数据可视化图
前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 模块使用: 爬虫部分: requests parsel csv 数据分析部分: pandas pyecharts 如何安装模块: win R 输入 cmd 输入安装命令: pip install 模块名 回车 pycharm里面安装 terminal 输入安装命令…...

论文阅读:pixelNeRF: Neural Radiance Fields from One or Few Images
中文标题:从一或少量图像中构建神经辐射场 提出问题 NeRF效果虽然惊艳,但是其需要大量环绕图像以及长时间的训练。 创新点 与原始的NeRF网络不使用任何图像特征不同,pixelNeRF将与每个像素对齐的空间图像特征作为输入。也可以集合更多输入…...

C++项目——高并发内存池(1)--介绍及定长内存池
1.什么是内存池 1.1 池化技术 将程序中需要经常使用的核心资源先申请出来,放在一个池内,由程序自己管理,这样可以提高资源的使用效率,也可以保证本程序占有的资源数量。 比如之前博文实现的线程池,就是预先的申请出…...

网络有线无线配置
一、需求 在无线接入区内,当Lsw1的上联口出现故障时,需要通过AP1-LSw1-LSw2-LSw3的路径访问公网server3。这是因为AP1通过无线网连接到LSw1,而LSw1与LSw3之间的链路出现故障,无法直接访问公网server3。因此,流量需要通…...

阅读笔记——Feature-Point Matching for Aerial and Ground Images方法
阅读笔记——Feature-Point Matching for Aerial and Ground Images 1.应用背景 在三维重建应用中,常用的是航空影像,但在城市环境中,面对大量的高层建筑物,航空影像往往不能很好的重建出完整的三维模型。因为航空影像视角约束以…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...