STM32F1与STM32CubeIDE快速入门-芯片序列号读取

芯片序列号读取

文章目录

1、芯片序列号介绍

每个 stm32 微控制器都配备了唯一的序列号,该序列号储存只读存储区。也就是说,它不能被擦除或重写,只能读取。有时需要为嵌入设备分配唯一标识,芯片的唯一序号号也是一个选择。

STM32的序列号是一个96位的数字,分别位于两个16位和两个32位的寄存器中。如下图所示:

在这里插入图片描述

读取序号时,需要从基地址*(第一个寄存器的地址)*开始按寄存器大小移位读取。基地址可以在STM32芯片数据手册,RM0008 中的“Unique device ID register (96 bits)”章节中找到(第1077页左右)。本文实例使用的芯片为STM32F103VETx,其基地址为:: 0x1FFF F7E8,偏移量为:0x00

2、芯片序列号读取

STM32CubeIDE创建工程、系统配置、调试配置,在这里不再做介绍,请参考:

1)基本定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/\*
\* device\_id.h
\*
\* Created on: May 1, 2022
\* Author: jenson
\*/

#ifndef \_\_DEVICE\_ID\_H\_\_
#define \_\_DEVICE\_ID\_H\_\_

#include <stdio.h>

void get\_device\_id(uint8\_t device_id[64]);

#endif /\* \_\_DEVICE\_ID\_H\_\_ \*/


2)芯片ID读取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/\*
\* device\_id.c
\*
\* Created on: May 1, 2022
\* Author: jenson
\*/


#include "device\_id.h"
#include <stdio.h>
#define UID\_BASE 0x1FFFF7E8

const uint16\_t \*idBase0 = (uint16\_t\*)(UID_BASE);
const uint16\_t \*idBase1 = (uint16\_t\*)(UID_BASE + 0x02);
const uint32\_t \*idBase2 = (uint32\_t\*)(UID_BASE + 0x04);
const uint32\_t \*idBase3 = (uint32\_t\*)(UID_BASE + 0x08);

void get\_device\_id(uint8\_t device_id[64]){
sprintf((char\*)device_id,"%x-%x-%lx-%lx",\*idBase0, \*idBase1, \*idBase2, \*idBase3);
}


3)主程序

main.c文件中添加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/\* Private includes ----------------------------------------------------------\*/
/\* USER CODE BEGIN Includes \*/
#include <stdio.h>
#include "device\_id/device\_id.h"
/\* USER CODE END Includes \*/

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\_USART1\_UART\_Init();
/\* USER CODE BEGIN 2 \*/
// 读取芯片序列号
get\_device\_id(device_id);
printf("Device UUID:%s\r\n", device_id);
/\* 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、STM32F1与STM32CubeIDE系列文章

3.1 STM32F1与STM32CubeIDE快速入门

3.2 STM32F1与STM32CubeIDE编程实例

文章来源: https://iotsmart.blog.csdn.net/article/details/124817556