STM32F103唯一ID读取方法详解
1. 概述
STM32F103系列微控制器内部包含一个96位的唯一设备标识符(Unique Device ID),该ID在芯片制造时烧录,不可修改。它可以用于设备认证、序列号生成、加密密钥派生等。读取方式简单,只需访问指定内存地址。
2. 寄存器地址
根据STM32F103参考手册,唯一ID存储在以下地址:
- 地址0x1FFFF7E8:高32位(ID[95:64])
- 地址0x1FFFF7EC:中32位(ID[63:32])
- 地址0x1FFFF7F0:低32位(ID[31:0])
这些地址属于系统存储区域,可直接读取。
3. 读取方法
3.1 直接指针访问
uint32_t id_l = *(uint32_t*)0x1FFFF7E8; // 高32位
uint32_t id_m = *(uint32_t*)0x1FFFF7EC; // 中32位
uint32_t id_h = *(uint32_t*)0x1FFFF7F0; // 低32位注意:STM32F103的ID顺序可能因不同型号而异,但通常高地址对应高比特。
3.2 使用标准外设库
若使用STM32标准外设库,可调用GetUniqueID()函数(需确认固件版本):
uint32_t id[3];
GetUniqueID(id); // id[0]为高32位,id[1]为中32位,id[2]为低32位或直接读取宏定义:*(uint32_t*)0x1FFFF7E8等。
3.3 使用LL库
LL库中可定义:
#define UID_BASE 0x1FFFF7E8
uint32_t uid[3] = {
(*(uint32_t*)UID_BASE),
(*(uint32_t*)(UID_BASE+4)),
(*(uint32_t*)(UID_BASE+8))
};4. 注意事项
- 读取ID时,需确保芯片已解锁(默认已解锁)。
- 某些型号(如STM32F103C8T6)ID地址正确,但小容量型号可能有差异,请查阅具体数据手册。
- ID为只读,不可修改。
- 用于加密时,注意ID长度96位,可结合算法生成更长的密钥。
5. 示例代码
以下是一个完整的读取并打印ID的示例:
#include <stdio.h>
int main(void) {
uint32_t id0 = *(uint32_t*)0x1FFFF7E8;
uint32_t id1 = *(uint32_t*)0x1FFFF7EC;
uint32_t id2 = *(uint32_t*)0x1FFFF7F0;
printf("Unique ID: %08X %08X %08X\n", id0, id1, id2);
return 0;
}6. 总结
读取STM32F103的唯一ID非常简单,只需访问固定地址即可。该ID可用于生产管理、安全认证等场景。建议在应用中缓存ID值以提高效率。