[AT32F437] 器件信息特征值UID获取

[复制链接]
469|4
和谐智者 发表于 2025-9-28 10:37 | 显示全部楼层 |阅读模式
本帖最后由 和谐智者 于 2025-9-28 10:41 编辑

发这个帖子的主要目的是在别的版块有网友发帖称读取UID犯难了!抱怨了几句!
因为手中仅有雅特力的开发板,所以查看了一下雅特力的官方固件库——我也没有找到UID的API函数。不过,UID的数据是直接保存在Flash上,亦可以直接读取,就像读取数据那样。比如可以直接使用Keil的MEMORY窗口:
uid_memory_windows.jpg
换句话说,就是通过指针指向地址直接读取,之前有网友是这样设计的:
  1. /* UID */
  2. CPU_Sn0 = *(__IO uint32_t *)(0x1FFFF7E8);
  3. CPU_Sn1 = *(__IO uint32_t *)(0x1FFFF7E8 + 4);
  4. CPU_Sn2 = *(__IO uint32_t *)(0x1FFFF7E8 + 8);
我这里根据存储位置新建了结构体如下:
  1. typedef struct mcu_id_s
  2. {
  3.   uint32_t flash_size;
  4.   uint32_t reserved;
  5.   uint32_t uid[3];
  6. } mcu_id_t;

  7. const mcu_id_t *mcu_id = (mcu_id_t *)0x1FFFF7E0;

通过上面的代码,可以直接得到flash_size与uid[3]。使用的时候图个方便了
我又往下查了一下版主发的FAQ,可以利用[97:79][33:28][16:0]来组成 一个32bit的唯一识别码。当然,也可以直接将mcu_id_t结构体通过CRC32计算散列掉。
总体 而言,有无固件API调用 意义不大。用到这个参数了,说明项目本身不小了!工程师的水平应该槵hold住这个知识点了!

参考链接:
  • 《413的UID 码来识别 地址是多少》 https://bbs.21ic.com/forum.html?mod=viewthread&tid=3129282
  • 《FAQ0053-将UID缩短到32bit解决方法》https://www.arterytek.com/download/FAQ/FAQ0053_%E5%B0%86UID%E7%BC%A9%E7%9F%AD%E5%88%B032bit%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95_V2.0.0.pdf









观星者宁静 发表于 2025-9-29 20:16 | 显示全部楼层
这个东西不难。
不过,楼主最后那个96bit缩减32bi有点实用了
观星者宁静 发表于 2025-9-30 11:21 | 显示全部楼层
楼主大佬,
把96位序列号散列来生成唯一32bit数
转瞬回声 发表于 2025-9-30 17:27 | 显示全部楼层
这上功能特性还没有使用过呢!
夜幕叙事曲 发表于 2025-10-4 09:39 | 显示全部楼层
楼主的这个数据结构设计的不错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

25

帖子

0

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