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值以提高效率。