广州市海珠区建设局五位一体网站,快速开发平台开发,wordpress云音乐插件,广州白云建方舱医院获取唯一设备标识符UID前言一、什么事UID二、实验过程1.CubeMx配置2.代码实现3.实验结果总结前言
这一章节介绍如何获取STM32芯片中的唯一的ID号的两种方法。 一、什么事UID
在许多项目中#xff0c;识别设备是必要的。从简单的设备描述到更复杂的设备#xff0c;如 USB 串…
获取唯一设备标识符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 *(idi));} 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的方法。