你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32L0 读取唯一序列号UID

[复制链接]
STMCU小助手 发布时间:2021-11-17 23:02
STM32L0 读取唯一序列号UID
直接寻址
STM32L0的UID首地址为0x1FF80050,采用如下方式可以读取3个字共96位的UID。

  1.   #define UID_BASE 0x1FF80050
  2.   uint32_t UID[3];
  3.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
  4.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));
  5.   UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
复制代码


测试发现两片不同的STM32L031芯片,读出的UID是相同的!!

HAL库读取
直接采用HAL读取UID的库函数进行读取,HAL库支持如下的读取:
  1. uint32_t HAL_GetHalVersion(void);
  2. uint32_t HAL_GetREVID(void);
  3. uint32_t HAL_GetDEVID(void);
  4. uint32_t HAL_GetUIDw0(void);
  5. uint32_t HAL_GetUIDw1(void);
  6. uint32_t HAL_GetUIDw2(void);
复制代码
因此,读取代码如下:
  1.   uint32_t UID[3];
  2.   UID[0] = HAL_GetUIDw0();
  3.   UID[1] = HAL_GetUIDw1();
  4.   UID[2] = HAL_GetUIDw2();
复制代码
测试发现两片不同的STM32L031芯片,读出的UID是不同的!!

查找原因
对HAL_GetUIDw0(),HAL_GetUIDw1(), HAL_GetUIDw2()进行分析,发现:

  1. uint32_t HAL_GetUIDw0(void)
  2. {
  3.   return(READ_REG(*((uint32_t *)UID_BASE)));
  4. }
  5. uint32_t HAL_GetUIDw1(void)
  6. {
  7.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));
  8. }
  9. uint32_t HAL_GetUIDw2(void)
  10. {
  11.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));
  12. }
复制代码

问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:
  1.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
  2.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));
  3.   UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 14)));
复制代码

则读取UID正确.


收藏 评论0 发布时间:2021-11-17 23:02

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版