获取唯一设备标识符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的方法。