本帖最后由 dffzh 于 2025-9-28 11:09 编辑
MCU的UID(Unique Device ID)是制造商在生产过程中烧录到芯片内部的唯一设备标识符,一般包括制造商ID、产品系列、制造日期等信息,主要用于设备识别、安全验证等场景。 UID一般包括96位(12字节)或者128位(16字节),可以通过程序从其存储地址里面读取出来,接下来就介绍一下读取方法,并通过雅特力的AT32F403A芯片来实际操作一次看下读取的结果。 首先我们要读取UID信息,首先得知道它的存储地址,一般在芯片的用户手册里会进行如何,比如在AT32F403A的用户手册里面搜索关键字UID,就可以查到: 通过以上信息就可以知道,该MCU的UID存储的起始地址就是0x1FFFF7E8。 不同MCU在用户手册里面对UID的命名可能会有区别,可以尝试以下关键字进行搜索: UID、Unique DeviceID、Serial Number、DeviceIdentifier。
在确认起始的存储地址后,接下来就是编写代码进行读取,示例代码如下: - // 定义UID的地址(请根据具体型号修改!)
- #define UID_BASE_ADDRESS (0x1FFFF7E8UL)
- // 将地址转换为32位指针
- uint32_t *uid_addr = (uint32_t*)UID_BASE_ADDRESS;
- // 读取UID(96位,即3个32位字)
- uint32_t uid_part1 = uid_addr[0]; // 最低地址的字
- uint32_t uid_part2 = uid_addr[1];
- uint32_t uid_part3 = uid_addr[2]; // 最高地址的字
- // 打印UID(通过串口等)
- printf("UID: %08X-%08X-%08X\r\n", uid_part3, uid_part2, uid_part1);
在板子上仿真运行后,通过串口打印信息即可看到这颗MCU的UID信息: 再在另一块板子上仿真运行后,通过实时监控数据查看UID: 可以看出,每颗MCU的UID信息是不一样的,其中相同部分数据的具体含义有兴趣的可以再研究一下,应该是厂商信息什么的。
|