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

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

[复制链接]
STMCU小助手 发布时间:2021-11-17 23:02
STM32L0 读取唯一序列号UID( S; S6 x* H; F: b+ E. C
直接寻址) _! N6 c2 ?  ~' _1 I) w
STM32L0的UID首地址为0x1FF80050,采用如下方式可以读取3个字共96位的UID。
/ n- ?# T7 J0 f5 p8 S5 P# Y' i* a, a6 I+ c2 f% J
  1.   #define UID_BASE 0x1FF80050
    / }0 w; B$ U; [7 S+ t7 @! A& P
  2.   uint32_t UID[3];& [! e9 @& V# k% W
  3.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));3 ]4 C8 G  x% u$ R$ E' D
  4.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));
    9 X) ^5 X0 y+ A6 s
  5.   UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
复制代码
" v2 R% t& s% b( \" y1 `% [
+ g# c8 E3 M2 u$ A9 {" x
测试发现两片不同的STM32L031芯片,读出的UID是相同的!!7 }# w- l" n4 o& \9 D8 U. s
7 n" U7 U# S! J. l7 d9 r, T5 e
HAL库读取
0 k7 B$ u( u5 _( [2 }3 S( l直接采用HAL读取UID的库函数进行读取,HAL库支持如下的读取:
! z- \! [0 s  A# ]* l
  1. uint32_t HAL_GetHalVersion(void);
    0 I" A8 u' f& q+ P( }! [) A
  2. uint32_t HAL_GetREVID(void);. _3 Z1 J* S  r% J# }
  3. uint32_t HAL_GetDEVID(void);
    + C) T& r3 M7 z8 ?9 B+ A6 W) i1 Z
  4. uint32_t HAL_GetUIDw0(void);: R. u5 ^" j8 }9 l0 g
  5. uint32_t HAL_GetUIDw1(void);
    % x- Y9 ]( s2 l& `5 _0 `: v4 m
  6. uint32_t HAL_GetUIDw2(void);
复制代码
因此,读取代码如下:( a) d  B9 S- I* P8 |" w
  1.   uint32_t UID[3];
    " H  k4 h$ M/ m
  2.   UID[0] = HAL_GetUIDw0();
    1 C% B# u; O1 I* U
  3.   UID[1] = HAL_GetUIDw1();
    2 c' ^$ b2 `. |) G7 B. I: m
  4.   UID[2] = HAL_GetUIDw2();
复制代码
测试发现两片不同的STM32L031芯片,读出的UID是不同的!!) R. i2 [3 m4 }/ F/ l9 R
- l5 W& |0 ^# p' I3 @/ Y; H6 O0 U
查找原因2 k6 S, L+ F/ J& f+ Q$ ?$ m+ y: |
对HAL_GetUIDw0(),HAL_GetUIDw1(), HAL_GetUIDw2()进行分析,发现:
. d, N9 q+ E: Y3 m$ i' m; k
# Y! Z+ R+ Q, x+ b% p) R- t0 E* ?
  1. uint32_t HAL_GetUIDw0(void)- h8 r) c! R8 Z# ]$ J
  2. {
    # T4 a6 r1 c! ^
  3.   return(READ_REG(*((uint32_t *)UID_BASE)));$ p7 o, }7 A/ O
  4. }
    2 L+ t+ u8 I) u! Z
  5. uint32_t HAL_GetUIDw1(void)
    9 ?* y* `) Y; M" w
  6. {$ O6 P# E, Z2 |; ^% C; K
  7.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));
    - Y5 e9 I, l; ?7 ?
  8. }  V& u2 Z8 L9 Y% d% w  D
  9. uint32_t HAL_GetUIDw2(void)
    ) n3 F/ K2 {0 @( H
  10. {
    9 l1 w& s! S5 U! M0 q' B- `$ N
  11.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));
    $ p* i' p0 C1 E) _
  12. }
复制代码
* T! B# H/ v% T  u, h
问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:: O' }: F& X7 b) t
  1.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
    5 _# Y4 A$ r! ~! `) r
  2.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));+ [  G  Q  {) P' G% r
  3.   UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 14)));
复制代码
  S9 p5 E* [1 t( I1 J5 e3 m, q
则读取UID正确.
* a" [( Y& x6 S# h8 o; i! U8 B! x! o9 y
. w6 W$ \( f7 _, m7 b- |$ m$ E. [9 x& i" E5 N, o
收藏 评论0 发布时间:2021-11-17 23:02

举报

0个回答

所属标签

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