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

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

[复制链接]
STMCU小助手 发布时间:2021-11-17 23:02
STM32L0 读取唯一序列号UID6 c9 N) Q$ o' {. Y4 [
直接寻址  a) [# I5 ^' Z+ D1 T
STM32L0的UID首地址为0x1FF80050,采用如下方式可以读取3个字共96位的UID。
$ q* ]# E$ ?. Q& @) R: R# }8 J- L
" k& s, `* H: ~# I- w' J: S* E
  1.   #define UID_BASE 0x1FF80050' p  ^2 `3 C. K+ w5 b& w7 R
  2.   uint32_t UID[3];  {8 h0 W  K* i5 G8 B8 ]
  3.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));. Q; \! v4 j: D+ B) z. h) q! e/ U
  4.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));
    & C; r0 r1 D: ^5 B6 t
  5.   UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
复制代码

3 i0 J$ F$ [, D# o3 V3 A$ u: `$ F1 x  ^; }$ \1 N
测试发现两片不同的STM32L031芯片,读出的UID是相同的!!# `0 k/ k& B( V9 v9 y0 ]
  s  i8 `6 `( `- \
HAL库读取
  k3 P& ^, O& h直接采用HAL读取UID的库函数进行读取,HAL库支持如下的读取:
5 g/ b: R7 F* U* l, f+ J
  1. uint32_t HAL_GetHalVersion(void);* |: x( ^6 g6 B* G' c. L2 g
  2. uint32_t HAL_GetREVID(void);: U8 o4 {$ x$ I% T$ O
  3. uint32_t HAL_GetDEVID(void);
    4 K& z  P$ n, ^) H4 f! z5 E
  4. uint32_t HAL_GetUIDw0(void);9 ?/ F. Z* m0 {! `% z
  5. uint32_t HAL_GetUIDw1(void);; N( U8 [9 g/ I  w  I$ @# |
  6. uint32_t HAL_GetUIDw2(void);
复制代码
因此,读取代码如下:
; L' @7 Q' s2 A% K2 R# K
  1.   uint32_t UID[3];; J5 W1 W) Y+ ?" x0 `
  2.   UID[0] = HAL_GetUIDw0();
    ! y+ \& l2 c( R. [0 l
  3.   UID[1] = HAL_GetUIDw1();# W1 U: T& g. _; h; ^; z% {
  4.   UID[2] = HAL_GetUIDw2();
复制代码
测试发现两片不同的STM32L031芯片,读出的UID是不同的!!& P4 n# N0 N+ P  ?7 A
' n: J  T/ x. f7 q- z( i0 e
查找原因
5 S/ |  J' |7 X对HAL_GetUIDw0(),HAL_GetUIDw1(), HAL_GetUIDw2()进行分析,发现:
5 F4 m! E$ `5 v! Q7 ^! E5 V
5 q' u! u- v! h5 O, A2 ]
  1. uint32_t HAL_GetUIDw0(void)
    , @4 ^& v6 Z& J4 R: ^& r3 [
  2. {
    / [7 I; l& Q7 X4 C2 K
  3.   return(READ_REG(*((uint32_t *)UID_BASE)));# K, b6 c8 I2 w. u( v6 e
  4. }2 r( L3 o3 u4 A7 H* j: e
  5. uint32_t HAL_GetUIDw1(void)
    6 ^' [3 L% x7 I
  6. {+ X/ y% M) {, v' k, A2 [+ k
  7.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));# {; W1 ~1 {3 v
  8. }
    5 _0 n* [! `/ P8 A  R2 c& E
  9. uint32_t HAL_GetUIDw2(void)
    + F4 G- }% U4 B  @, A& c# f
  10. {
    ! D+ u* n% E$ R7 |# p
  11.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));
    & `& m% F0 k+ V6 J2 R
  12. }
复制代码
6 |0 l0 A# e$ d1 i- _5 V- l! ?& t  B0 E
问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:3 c) t6 \. W  m) m$ a
  1.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
    9 T* _( A, ^% c9 e: G8 ^9 j; w
  2.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));, o- V9 v6 X. w7 Z4 Y7 [
  3.   UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 14)));
复制代码

+ @* U% ?$ C0 L- f5 s, D则读取UID正确.
/ M  R. w7 S# l$ H- A6 Y" b4 J: W( O3 S) H
6 G8 s5 V& @" U( d* N1 h
收藏 评论0 发布时间:2021-11-17 23:02

举报

0个回答

所属标签

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