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