1. 唯一 ID 的原理
STM32 / AT32 获取唯一 ID,本质上都是:芯片出厂时厂家在系统存储区写入一组只读 UID 数据,用户程序通过固定地址读取,然后按业务需要截取、压缩或拆分存放。
UID 一般包含:晶圆编号、晶圆坐标、批次信息、厂家内部编号
2. STM32 获取方法
STM32 提供 96bit 唯一 ID,也就是 12 字节。地址不同型号不固定。
#define UID_BASE 0x1FFFF7E8U /*!< Unique device ID register base address */
读取方式:
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
|
|