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

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

[复制链接]
STMCU小助手 发布时间:2021-11-17 23:02
STM32L0 读取唯一序列号UID5 \, c0 D; O2 M7 @. |6 a) K; J
直接寻址# @6 [9 W6 Z, |3 d1 K
STM32L0的UID首地址为0x1FF80050,采用如下方式可以读取3个字共96位的UID。
& ~/ V/ |+ x' i3 k8 ?/ B! k) f, r4 D1 L  t
  1.   #define UID_BASE 0x1FF80050
    & m8 G: W& k6 Q2 W. i
  2.   uint32_t UID[3];
    1 Q  }* T1 ~2 D3 E7 \; _& N
  3.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
    , m- e3 S( ]' l7 `
  4.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));4 d' D* r' e- `/ [5 T
  5.   UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
复制代码

1 n4 N- \# _" |7 r3 K
( Z6 g5 G, [$ i( u0 i测试发现两片不同的STM32L031芯片,读出的UID是相同的!!; e4 f. u) T, \7 C( i" ]2 t; s5 q. {

/ @! L$ P) G- ~0 n; yHAL库读取
" O1 @' d7 P/ k1 s直接采用HAL读取UID的库函数进行读取,HAL库支持如下的读取:
9 m4 R7 c/ q/ ]) q) h3 g" `& N7 ^7 t) Z
  1. uint32_t HAL_GetHalVersion(void);
    5 |) [7 l# E6 Y: z/ ?# m
  2. uint32_t HAL_GetREVID(void);
    # |' r9 G- H5 Q
  3. uint32_t HAL_GetDEVID(void);
    # b! Y- t3 q8 u( w
  4. uint32_t HAL_GetUIDw0(void);. j( P+ ~; s7 ]9 x" A
  5. uint32_t HAL_GetUIDw1(void);7 \9 ]; i/ [% k8 Y/ i5 _
  6. uint32_t HAL_GetUIDw2(void);
复制代码
因此,读取代码如下:
$ }2 b2 _* i+ |0 q
  1.   uint32_t UID[3];; V% c( v1 j7 I! u9 H+ m: _1 m
  2.   UID[0] = HAL_GetUIDw0();1 Y7 B8 R5 `* ]3 E$ C  }! g
  3.   UID[1] = HAL_GetUIDw1();
    % o; s; e$ f3 X2 ?
  4.   UID[2] = HAL_GetUIDw2();
复制代码
测试发现两片不同的STM32L031芯片,读出的UID是不同的!!
: {/ M) `) N9 J8 C5 w9 s7 f  r: A3 w8 E# Z3 ~
查找原因
# e5 H4 H1 P$ G: ?0 r- B对HAL_GetUIDw0(),HAL_GetUIDw1(), HAL_GetUIDw2()进行分析,发现:
$ ~( A) J5 J' b+ c" E5 Y) E4 c* [
  1. uint32_t HAL_GetUIDw0(void)
    $ H7 L5 H/ @( |, l
  2. {
    3 {, g* g. c* W0 o
  3.   return(READ_REG(*((uint32_t *)UID_BASE)));% E, X. m! N  H( X+ f4 \
  4. }
    8 _" Q: E  E8 Y9 a4 a
  5. uint32_t HAL_GetUIDw1(void); @& r4 |0 F: d6 ]) f
  6. {
    4 {% z; \4 k/ y7 F/ Y7 y# x9 G
  7.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));
    & Z1 }3 i, t; ?. C4 d9 G& i2 c
  8. }
    0 s9 X; E, F6 o6 Q
  9. uint32_t HAL_GetUIDw2(void)
    ) o! o5 n" n2 j* F
  10. {' u/ k/ F" A3 O( e+ T
  11.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));5 i- D9 O6 U' w4 @
  12. }
复制代码
1 u$ y9 |0 {, [7 _: E0 x; q8 C6 R% J
问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:8 r* y( N: g- \; [! P+ \; h
  1.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));0 A8 C& K: _8 v4 ~
  2.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));
    6 X& ~9 E% ^( a8 {+ ]5 ~5 p. I" `
  3.   UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 14)));
复制代码

7 [5 q( u1 E7 M, V/ \9 i' i则读取UID正确.( ]% `: t! a- m- k  }
$ M& ]. G1 B. I' `4 Q: h( g3 J6 ~8 t

' i# m& o) v/ b0 V$ E
赞 收藏 评论0 发布时间:2021-11-17 23:02

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版