[应用相关] STM32、AT32获取唯一UID

[复制链接]
8|0
Haizangwang 发表于 2026-9-2 16:05 | 显示全部楼层 |阅读模式
531016a97d8ce3c076.png

1. 唯一 ID 的原理
STM32 / AT32 获取唯一 ID,本质上都是:芯片出厂时厂家在系统存储区写入一组只读 UID 数据,用户程序通过固定地址读取,然后按业务需要截取、压缩或拆分存放。

UID 一般包含:晶圆编号、晶圆坐标、批次信息、厂家内部编号

2. STM32 获取方法
STM32 提供 96bit 唯一 ID,也就是 12 字节。地址不同型号不固定。

#define UID_BASE              0x1FFFF7E8U    /*!< Unique device ID register base address */

927326a97d8c813f67.png

读取方式:

uint32_t uid0 = *(uint32_t *)(STM32_UID_BASE + 0x00);
uint32_t uid1 = *(uint32_t *)(STM32_UID_BASE + 0x04);
uint32_t uid2 = *(uint32_t *)(STM32_UID_BASE + 0x08);


也可以按字节读:

const uint8_t *uid = (const uint8_t *)STM32_UID_BASE;


3. AT32 获取方法
AT32 也有 96bit UID,基地址是:

0x1FFFF7E8


可以看到,和stm32是兼容的。

读取方式 先定位:

const uint8_t *p = (const uint8_t *)0x1FFFF7E8;


读取96位方式:

void AT32_GetUID96_Word(uint32_t uid[3])
{
    const uint32_t *p = (const uint32_t *)0x1FFFF7E8;

    uid[0] = p[0];
    uid[1] = p[1];
    uid[2] = p[2];
}


AT32 官方 FAQ 里给了一种把 96bit UID 压缩成 32bit 的方案:

取 UID[87:79]、UID[33:28]、UID[16:0]
组合成 32bit 设备识别码


处理方式:

uint32_t AT32_GetUID32(void)
{
    const uint8_t *p = (const uint8_t *)0x1FFFF7E8;

    uint32_t uid_16_0 =
        ((uint32_t)(p[2] & 0x01) << 16) |
        ((uint32_t)p[1] << 8) |
        ((uint32_t)p[0]);

    uint32_t uid_33_28 =
        ((uint32_t)(p[4] & 0x03) << 4) |
        ((uint32_t)(p[3] & 0xF0) >> 4);

    uint32_t uid_87_79 =
        ((uint32_t)p[10] << 1) |
        ((uint32_t)(p[9] & 0x80) >> 7);

    return (uid_87_79 << 23) |
           (uid_33_28 << 17) |
           uid_16_0;
}


————————————————
版权声明:本文为CSDN博主「Wassuh0324」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_75034595/article/details/163568363

您需要登录后才可以回帖 登录 | 注册

本版积分规则

230

主题

613

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0