当前位置: 首页 > news >正文

STM32开发(13)----获取唯一设备标识符UID

获取唯一设备标识符UID

  • 前言
  • 一、什么事UID
  • 二、实验过程
    • 1.CubeMx配置
    • 2.代码实现
    • 3.实验结果
  • 总结


前言

这一章节介绍如何获取STM32芯片中的唯一的ID号的两种方法。


一、什么事UID

在许多项目中,识别设备是必要的。从简单的设备描述到更复杂的设备,如 USB 串行命名、安全密钥、加密密钥等。有许多方法可以在微控制器中实现唯一ID。从简单的硬编码到固件中,单独刷新信息闪存到设备首次运行时随机生成。当谈到STM32 MCU时,还有另一种更简单,更清晰的可能性。在制造过程中,96位ID被编码到微控制器上。

所谓的唯一 ID 由 3 个部分组成:

  1. 晶圆上的 X 和 Y 坐标以 BCD 格式表示
  2. 批号
  3. 晶圆编号

对于 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 在许多项目中&#xff0c;识别设备是必要的。从简单的设备描述到更复杂的设备&#xff0c;如 USB 串…...

华为OD机试 - 最优调度策略(Python) | 机试题+算法思路+考点+代码解析 【2023】

最优调度策略 题目 在通信系统中有一个常见的问题是对用户进行不同策略的调度 会得到不同系统消耗的性能 假设由 N 个待串行用户,每个用户可以使用 A/B/C 三种不同的调度策略 不同的策略会消耗不同的系统资源 请你根据如下规则进行用户调度 并返回总的消耗资源数 规则是:相…...

前端零基础入门-002-集成开发环境

本篇目标 了解市面上常用的前端集成开发环境&#xff08;ide&#xff09;掌握 HBuiberX 的使用&#xff1a;下载安装&#xff0c;新建项目、网页、运行网页。 内容摘要 本篇介绍了市面上流行的几款前端集成开发环境&#xff08;ide&#xff09;&#xff0c;并介绍了 Hbuilde…...

su和sudo的区别

linux中 su和sudo的区别 su和sudo是两个常用的切换到root超级用户命令。功能上类似&#xff0c;但使用上还是有不少差异。 su命令 su是切换到root用户的命令&#xff0c;主要用法如下&#xff1a; su&#xff1a;不带参数直接输入su将切换到root用户&#xff0c;需要输入root…...

【ChatGPT】使用ChatGPT进行51单片机程序编程体验

背景 最近ChatGPT大火&#xff0c;笔者尝试使用它进行了51单片机编程尝试。ChatGPT是一种由OpenAI训练的大型语言模型&#xff0c;具有强大的自然语言处理能力和生成代码的能力。 使用ChatGPT进行51单片机编程&#xff0c;笔者发现它可以帮助开发人员快速生成符合要求的代码&a…...

Docker之路(1.Docker概述、组成以及特点)

1.docker为什么会出现&#xff1f; 一款产品或者项目来说&#xff0c;一般有三个环境&#xff0c;日常/测试环境、预发环境、正式/线上环境 这么多环境&#xff0c;对其环境的配置是十分麻烦的&#xff0c;每一个机器都要部署环境&#xff0c;有的会有集群Redis、Hadoop等&…...

非对称加密算法在android的应用

前言android 系统安全内容总结 4、非对称加密算法应用 主要特性包括secure boot、AVB、OTA包签名、apk签名、apex、ko签名; 除此外上层应用keystore服务、涉及TEEOS非对称算法的功能安全会用到。属于功能安全本章节暂不描述。 4.1、secboot+avb secboot+avb属于安全启动参照…...

51单片机——定时器中断实验,小白讲解,相互学习

定时器介绍 1&#xff0c;CPU时序的有关知识 震荡周期&#xff1a;为单片机提供定时信号的震荡源的周期&#xff08;晶振周期或外加震荡周期&#xff09;。状态周期&#xff1a;2个震荡周期为1个状态周期&#xff0c;用S表示。震荡周期又称S周期或时钟周期。机器周期&#xff…...

什么是循环依赖,spring是如何去解决循环依赖问题的?什么是三级缓存?【spring】

文章目录什么是循环依赖&#xff1f;什么是三级缓存&#xff1f;执行流程什么是循环依赖&#xff1f; 在我们的开发中&#xff0c;会不可避免的遇到Bean之间循环依赖的&#xff0c;所谓循环依赖&#xff0c;就是两个或者两个以上的Bean互相持有对方&#xff0c;这样在程序运行…...

Cron表达式

网上搜一下就有在线生成网站&#xff0c;很方便。 比如&#xff1a;Cron表达式生成器 用途 定时调度任务&#xff0c;比如说服务器、云函数中定时执行脚本函数。 Cron 表达式构成 Cron 表达式是字符串&#xff0c;一般由 6 - 7 个字段构成&#xff0c;空格分隔。每个字段代…...

JavaScript 作用域

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

Hive内部表与外部表的区别具体说明

目录 1.在/opt/atguigu/目录下&#xff0c;新建两个txt文件 2.在hadoop的web端递归创建一个目录&#xff0c;存储这两个文件 3.查看web端的文件 一、内部表&#xff1a; 1.创建一个内部表&#xff0c;并指定内部表的存储位置 2.查看内部表&#xff0c;内部表中没有数据 …...

Java流程控制

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

I.MX6ULL_Linux_系统篇(17) uboot分析-启动linux

bootz 启动 Linux 内核 images 全局变量 不管是 bootz 还是 bootm 命令&#xff0c;在启动 Linux 内核的时候都会用到一个重要的全局变量&#xff1a;images&#xff0c; images 在文件 cmd/bootm.c 中有如下定义&#xff1a; images 是 bootm_headers_t 类型的全局变量&…...

C/C++每日一练(20230221)

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

用Python采集热门城市景点数据并简单制作数据可视化图

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 模块使用&#xff1a; 爬虫部分: requests parsel csv 数据分析部分: pandas pyecharts 如何安装模块: win R 输入 cmd 输入安装命令&#xff1a; pip install 模块名 回车 pycharm里面安装 terminal 输入安装命令…...

论文阅读:pixelNeRF: Neural Radiance Fields from One or Few Images

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

C++项目——高并发内存池(1)--介绍及定长内存池

1.什么是内存池 1.1 池化技术 将程序中需要经常使用的核心资源先申请出来&#xff0c;放在一个池内&#xff0c;由程序自己管理&#xff0c;这样可以提高资源的使用效率&#xff0c;也可以保证本程序占有的资源数量。 比如之前博文实现的线程池&#xff0c;就是预先的申请出…...

网络有线无线配置

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

阅读笔记——Feature-Point Matching for Aerial and Ground Images方法

阅读笔记——Feature-Point Matching for Aerial and Ground Images 1.应用背景 在三维重建应用中&#xff0c;常用的是航空影像&#xff0c;但在城市环境中&#xff0c;面对大量的高层建筑物&#xff0c;航空影像往往不能很好的重建出完整的三维模型。因为航空影像视角约束以…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

TCP/IP 网络编程 | 服务端 客户端的封装

设计模式 文章目录 设计模式一、socket.h 接口&#xff08;interface&#xff09;二、socket.cpp 实现&#xff08;implementation&#xff09;三、server.cpp 使用封装&#xff08;main 函数&#xff09;四、client.cpp 使用封装&#xff08;main 函数&#xff09;五、退出方法…...

从实验室到产业:IndexTTS 在六大核心场景的落地实践

一、内容创作&#xff1a;重构数字内容生产范式 在短视频创作领域&#xff0c;IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色&#xff0c;生成的 “各位吴彦祖们大家好” 语音相似度达 97%&#xff0c;单条视频播放量突破百万…...

Python环境安装与虚拟环境配置详解

本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南&#xff0c;适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者&#xff0c;都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...

Java多线程实现之Runnable接口深度解析

Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...

Selenium 查找页面元素的方式

Selenium 查找页面元素的方式 Selenium 提供了多种方法来查找网页中的元素&#xff0c;以下是主要的定位方式&#xff1a; 基本定位方式 通过ID定位 driver.find_element(By.ID, "element_id")通过Name定位 driver.find_element(By.NAME, "element_name"…...

Netty自定义协议解析

目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...

【动态规划】B4336 [中山市赛 2023] 永别|普及+

B4336 [中山市赛 2023] 永别 题目描述 你做了一个梦&#xff0c;梦里有一个字符串&#xff0c;这个字符串无论正着读还是倒着读都是一样的&#xff0c;例如&#xff1a; a b c b a \tt abcba abcba 就符合这个条件。 但是你醒来时不记得梦中的字符串是什么&#xff0c;只记得…...

结合PDE反应扩散方程与物理信息神经网络(PINN)进行稀疏数据预测的技术方案

以下是一个结合PDE反应扩散方程与物理信息神经网络(PINN)进行稀疏数据预测的技术方案,包含完整数学推导、PyTorch/TensorFlow双框架实现代码及对比实验分析。 基于PINN的反应扩散方程稀疏数据预测与大规模数据泛化能力研究 1. 问题定义与数学模型 1.1 反应扩散方程 考虑标…...