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

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

[复制链接]
STMCU小助手 发布时间:2021-11-17 23:02
STM32L0 读取唯一序列号UID
5 r  X0 [: M" z( c3 `直接寻址9 V- Q8 V& j: Q& i, ?1 n
STM32L0的UID首地址为0x1FF80050,采用如下方式可以读取3个字共96位的UID。& O+ z$ p: z6 U

5 I5 n8 ^, p9 D6 m
  1.   #define UID_BASE 0x1FF80050  b, e$ }- A9 N. |
  2.   uint32_t UID[3];
      x' q9 S) Z, N9 c5 t
  3.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));, m6 H1 _* q5 m8 k% ^
  4.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));$ G- F" x7 G5 q) j8 Z- v4 Q
  5.   UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
复制代码

2 Y. U! N. U1 l# i7 ]
+ @* ^  @% l- d/ Z' _测试发现两片不同的STM32L031芯片,读出的UID是相同的!!! K4 e9 q% @# C1 ^, G) F

4 G/ p  q& d8 X3 G) |HAL库读取. k6 h0 l$ `% g# G
直接采用HAL读取UID的库函数进行读取,HAL库支持如下的读取:0 W% n# `8 N# h$ `; z, H' Q
  1. uint32_t HAL_GetHalVersion(void);1 E4 T3 c6 Z4 D1 {5 Y+ b
  2. uint32_t HAL_GetREVID(void);5 p' `, C& Q7 L! J" c* U; o
  3. uint32_t HAL_GetDEVID(void);5 E7 @. s1 ?/ _9 ^1 Q
  4. uint32_t HAL_GetUIDw0(void);
    4 `6 u+ H& F8 z1 Y1 s1 Y
  5. uint32_t HAL_GetUIDw1(void);! s4 Y% O! k3 l' T- [6 T
  6. uint32_t HAL_GetUIDw2(void);
复制代码
因此,读取代码如下:
' Q  y4 F! ~3 v
  1.   uint32_t UID[3];" x- j& U3 B3 A- I6 _6 w3 g
  2.   UID[0] = HAL_GetUIDw0();
    % o7 \8 _+ I3 f9 e
  3.   UID[1] = HAL_GetUIDw1();+ |& L( o, U9 i# u. Q
  4.   UID[2] = HAL_GetUIDw2();
复制代码
测试发现两片不同的STM32L031芯片,读出的UID是不同的!!
% F5 }7 O- a# I: K/ t3 F- k, |5 J! F
查找原因' p) J" e, W% Z0 l  L2 `  X
对HAL_GetUIDw0(),HAL_GetUIDw1(), HAL_GetUIDw2()进行分析,发现:
0 S- ?( i8 C5 d3 h% f/ Q
! C2 n) l" v* T7 ^
  1. uint32_t HAL_GetUIDw0(void)
    $ s, y7 o% z  F8 p0 ~0 L
  2. {6 N8 Q9 W5 n0 V
  3.   return(READ_REG(*((uint32_t *)UID_BASE)));. ~1 j9 {' n) e
  4. }2 Z" g$ O* X, @+ v) t: q' m/ |/ K& }
  5. uint32_t HAL_GetUIDw1(void)7 j& A% a5 k7 M  q  ]$ p! G
  6. {
    3 Y* Y& ~. ]$ X5 O0 o9 [! `$ d: ~) y
  7.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));
    0 ^! i7 k$ z- e5 Y8 d
  8. }
    ) r  ^( B* m- m2 |- ~
  9. uint32_t HAL_GetUIDw2(void)
    # j' }  {# v% u7 _
  10. {
    - O0 g- V3 B3 M( E( R  b  u
  11.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));3 u6 h$ k2 x9 x" M9 V* M
  12. }
复制代码

& Z  l% s: |! X7 e% c$ Y问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:
$ O( E/ i$ I* h/ V0 ^. [+ L" l
  1.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));9 {- Y) K6 k6 q0 Q# f$ _
  2.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));% i; O4 B# b- @/ I8 z  O  h
  3.   UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 14)));
复制代码
$ A9 `. O$ L5 z
则读取UID正确.; u. b3 w  u) }/ \* C- H

* n2 K5 t* \5 N3 K8 t6 s: H5 R5 _7 `% `6 R1 \+ s0 V
收藏 评论0 发布时间:2021-11-17 23:02

举报

0个回答

所属标签

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