请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
STMCU小助手 发布时间:2021-11-17 23:02
STM32L0 读取唯一序列号UID
1 \0 U" }/ U1 r直接寻址
  x+ {/ b# A" o( y' B' {8 PSTM32L0的UID首地址为0x1FF80050,采用如下方式可以读取3个字共96位的UID。
( {/ N  b; b/ i* f/ ^* j' R2 {% f8 r8 R* F# j  m6 ]: j
  1.   #define UID_BASE 0x1FF80050
    ( t  _6 ?* I. V1 i' k
  2.   uint32_t UID[3];) X4 X' n  i/ N" P  _9 u! |. y* q
  3.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));: r) f& S7 {' ?1 a8 Q4 |" g
  4.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));
    5 N+ o8 J/ h7 K( }
  5.   UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
复制代码
" f" {: x, D9 {
( n1 ?& o+ ~+ U
测试发现两片不同的STM32L031芯片,读出的UID是相同的!!  v& Q; O, ?6 A# n  j4 F% ]( ]$ J$ A

7 B& E* f! `: I! v% C) ?! @HAL库读取( w7 w* n) u2 h& j7 {* I
直接采用HAL读取UID的库函数进行读取,HAL库支持如下的读取:, n& |# a. s5 v9 R* {, t
  1. uint32_t HAL_GetHalVersion(void);6 ~, ]+ O# O  V$ P
  2. uint32_t HAL_GetREVID(void);. @& C$ N5 Q) v
  3. uint32_t HAL_GetDEVID(void);: p0 s8 P6 ^3 R2 [- o9 _: q+ E
  4. uint32_t HAL_GetUIDw0(void);% U( h/ E1 A: R' B& I
  5. uint32_t HAL_GetUIDw1(void);' X0 n. {5 A5 N$ |; E
  6. uint32_t HAL_GetUIDw2(void);
复制代码
因此,读取代码如下:/ l7 X- ^, n5 q
  1.   uint32_t UID[3];
    $ F, g( {8 m4 H5 D  t- A
  2.   UID[0] = HAL_GetUIDw0();4 n9 Y9 ]! f& p. c$ \
  3.   UID[1] = HAL_GetUIDw1();! |$ D% I  D1 n+ ~( ~8 b5 S- [+ @/ a
  4.   UID[2] = HAL_GetUIDw2();
复制代码
测试发现两片不同的STM32L031芯片,读出的UID是不同的!!' U: U) T" e4 K% v% [
( ]- F/ F3 _  D; N
查找原因
2 u+ E1 ]" {# K6 ^; i6 p. y对HAL_GetUIDw0(),HAL_GetUIDw1(), HAL_GetUIDw2()进行分析,发现:
* u9 X1 a0 i% t, T. B2 a9 q- H! L5 y3 c# ^
  1. uint32_t HAL_GetUIDw0(void)
    / P7 {! K+ @0 H& z6 N
  2. {- R  e5 U& B+ v+ |
  3.   return(READ_REG(*((uint32_t *)UID_BASE)));
    ( _* H4 r' U) _+ _, |+ l% C
  4. }4 a/ _: V' [8 D5 F' d" v, U1 a" [
  5. uint32_t HAL_GetUIDw1(void). }) m8 i0 R9 j3 h' a5 s: f
  6. {
    , a( `# ~7 k1 s+ y+ y& L( s8 F
  7.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));
    2 f1 n5 U/ V+ ]
  8. }8 F) e& f6 d7 s# G/ V& L
  9. uint32_t HAL_GetUIDw2(void)
    ( j1 p% n5 v5 u' W( h9 I
  10. {) o; M1 P! m+ Q; f4 L% N
  11.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));' R" r" K( T  I" _  g6 Y4 b3 X
  12. }
复制代码
: r0 P2 {5 M' X; S; [& D9 W* ?
问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:
! m6 U" y/ s) [. c, q* O0 Q
  1.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
    $ _3 u/ A$ ?. h. i2 i, ^
  2.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));
    ' N; v% @6 S4 `3 e7 G; r
  3.   UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 14)));
复制代码
/ c! R, v9 h4 o
则读取UID正确.
0 `' c, ?9 ~3 e0 J' X4 l8 l
# J" i" I- q1 W9 R+ Q7 F1 H9 K/ _( j& d! A* Y
收藏 评论0 发布时间:2021-11-17 23:02

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版