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

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

[复制链接]
STMCU小助手 发布时间:2021-11-17 23:02
STM32L0 读取唯一序列号UID& _/ p; r0 z1 w; u; ^" E
直接寻址+ p6 @7 h4 L& ~8 z3 ^9 q4 `- J1 O
STM32L0的UID首地址为0x1FF80050,采用如下方式可以读取3个字共96位的UID。  M$ z  k3 U2 q8 P2 t! m  F3 q

0 |) `# S$ K5 T- }
  1.   #define UID_BASE 0x1FF800504 {$ F- A7 p! r
  2.   uint32_t UID[3];( d1 t7 L: D$ F# z8 v; I
  3.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));3 s# w- l* B9 U
  4.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));* g; g0 g$ V9 b3 `/ a* B7 s: {
  5.   UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
复制代码
( G  x9 _" a/ f

! T3 y; R: n+ w- L测试发现两片不同的STM32L031芯片,读出的UID是相同的!!1 P1 z# `6 E1 N$ D& ^9 L) C

+ x& G$ x8 \2 bHAL库读取7 q' u! |' j) z# i2 J1 E. P6 V
直接采用HAL读取UID的库函数进行读取,HAL库支持如下的读取:
' Y9 w3 F7 P( K) }' ?9 i
  1. uint32_t HAL_GetHalVersion(void);
    & |' R5 G0 [, \5 W: h8 k
  2. uint32_t HAL_GetREVID(void);
    ( x( k6 S7 b: r) O0 T% `$ r/ X
  3. uint32_t HAL_GetDEVID(void);
    : @& d' ~+ ~; y+ a* V
  4. uint32_t HAL_GetUIDw0(void);
    ! l5 C/ c" a; \
  5. uint32_t HAL_GetUIDw1(void);  v; `( B7 ^* B0 `0 H! l
  6. uint32_t HAL_GetUIDw2(void);
复制代码
因此,读取代码如下:: q5 ?6 j+ b" ?' _
  1.   uint32_t UID[3];
    $ R) t3 ~3 {# L9 _" s+ y+ T
  2.   UID[0] = HAL_GetUIDw0();2 J9 I/ X3 K% e. t
  3.   UID[1] = HAL_GetUIDw1();% W/ n1 x7 O1 e% X7 u0 j
  4.   UID[2] = HAL_GetUIDw2();
复制代码
测试发现两片不同的STM32L031芯片,读出的UID是不同的!!
4 O9 ~* p9 d! l- l( u$ K% v' c
9 A$ s  ]6 m7 x& X! Q* e查找原因
" G+ o; ^: l. l; d) N8 `对HAL_GetUIDw0(),HAL_GetUIDw1(), HAL_GetUIDw2()进行分析,发现:9 ^( f3 D8 j" l4 |: H( P& j4 o+ x
9 P  B  i# c, a7 L( Q
  1. uint32_t HAL_GetUIDw0(void)
      q* A9 W1 ^$ F5 O3 k# r  p5 b8 S; `& }
  2. {' K, w. j* E: l
  3.   return(READ_REG(*((uint32_t *)UID_BASE)));. I2 W- w& N: e% d! r
  4. }
    0 E, |7 ?$ ?8 p+ j3 C: N' n/ j  Y
  5. uint32_t HAL_GetUIDw1(void)
    & }. z5 v. i8 I9 q" v+ e
  6. {4 J1 Q5 b; R2 i( K( ^& \' ~0 o/ W( T
  7.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));
    * u7 [# O$ R7 }+ H* w8 _- `* t0 z
  8. }
    . \  s4 M$ Y: H) P
  9. uint32_t HAL_GetUIDw2(void)$ v% C  s, o: n. `1 l; {/ x7 y
  10. {
    $ u5 ]9 v+ {6 K& ~2 `( o& Y
  11.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));
    / ?9 O' r; B. A( f* r/ Q
  12. }
复制代码

" c+ ^$ ]- d, y. I5 k问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:
" U' x7 U6 b& J2 T
  1.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
    5 D$ z1 R( f) ~/ h. g" c
  2.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));" }+ E  A( n7 H+ c* Z1 J( a# ?
  3.   UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 14)));
复制代码

0 |" @! D# u4 y! ]( a3 g: ?# |3 O则读取UID正确.; u& V3 O% K' ?0 ]( i* h1 f
  ^4 ^# A7 j  h  q6 d+ m' Q( J
3 a2 e( Q" _) I9 Q. R
收藏 评论0 发布时间:2021-11-17 23:02

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版