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

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

[复制链接]
STMCU小助手 发布时间:2021-11-17 23:02
STM32L0 读取唯一序列号UID
3 k4 s9 {9 n; x( u直接寻址0 T% v3 k# B/ a4 G7 X& |/ P3 _3 U
STM32L0的UID首地址为0x1FF80050,采用如下方式可以读取3个字共96位的UID。
6 m4 m  h+ |& ?1 @4 R, x
9 b: X5 p8 n0 y) f6 m" k# f( k; c
  1.   #define UID_BASE 0x1FF80050
    # S( }8 {* ]0 z+ b4 l% E
  2.   uint32_t UID[3];( {) I4 D# i% t: r* e
  3.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
    & a6 ]' R/ b* n9 P- u
  4.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));. K& Y- _2 K; I  e# f" c4 t
  5.   UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
复制代码
7 g# }% @/ _& p" Z8 T0 _

* e) b: w# K: y# a* d' c* ]+ k! j测试发现两片不同的STM32L031芯片,读出的UID是相同的!!
/ S3 l( c' _) j5 X, Y9 i6 R3 ^6 Q9 B" b) H7 [6 w
HAL库读取4 \6 x7 I/ A" F5 @- L
直接采用HAL读取UID的库函数进行读取,HAL库支持如下的读取:
# j: y( B. Y2 j: L5 g
  1. uint32_t HAL_GetHalVersion(void);
    ; V% x# J3 |  }
  2. uint32_t HAL_GetREVID(void);4 p" r8 _7 ]% @
  3. uint32_t HAL_GetDEVID(void);
    , I5 r; g5 V! T4 d
  4. uint32_t HAL_GetUIDw0(void);
    # f& D) i; a9 F8 {
  5. uint32_t HAL_GetUIDw1(void);! s1 o( t( Y" f5 M0 D
  6. uint32_t HAL_GetUIDw2(void);
复制代码
因此,读取代码如下:" `8 [* Z! A/ F: O+ E* [0 W- H
  1.   uint32_t UID[3];# D$ Q& B; l* u) m; m  ^+ ~
  2.   UID[0] = HAL_GetUIDw0();
    - h5 |% M: s7 R0 j/ ~* }" l
  3.   UID[1] = HAL_GetUIDw1();0 m  U" T% U# m( v
  4.   UID[2] = HAL_GetUIDw2();
复制代码
测试发现两片不同的STM32L031芯片,读出的UID是不同的!!
  W# r' Y' @3 V
1 P, e3 }4 b/ ~! [查找原因& F$ S% K- w! h5 ~. ^# u" I- G
对HAL_GetUIDw0(),HAL_GetUIDw1(), HAL_GetUIDw2()进行分析,发现:
7 d  w/ [* n, I  S. E
. G4 s( z+ e* c
  1. uint32_t HAL_GetUIDw0(void)
    4 S/ w+ q. }5 O2 t; I
  2. {
    2 Y8 {' g7 C8 u  n
  3.   return(READ_REG(*((uint32_t *)UID_BASE)));
      e' I: r' i0 i) ~- \; B
  4. }" c& W$ y# w8 z6 s# V
  5. uint32_t HAL_GetUIDw1(void): G, j" x" u; Y. v/ h7 u
  6. {
    6 k1 o6 ?9 ~! C, B
  7.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));! G& Q: q+ C5 W0 ~: m# D
  8. }
    3 [4 u% b) F- E+ X$ i5 ], V0 E) C
  9. uint32_t HAL_GetUIDw2(void), f9 @. E% ]. t' y) o  @* |4 O
  10. {8 |* P* y& A( }
  11.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));9 [3 ]. m) B, y: K& i/ U4 v
  12. }
复制代码
3 l& i% m% |1 E% W9 R8 I5 ^
问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:: g& L6 }7 ~6 H' _* H4 w) j
  1.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));$ L! }) `5 I5 C$ e( b6 r) u
  2.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));
    5 V4 W/ O: y! U. V! C  e/ U. l$ x
  3.   UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 14)));
复制代码

; m% i  l: }$ X则读取UID正确.
! F$ Q; w( E( \9 }& j2 U/ [- z! x: @* M% N7 f' g- `: G
6 }# _4 A0 x% \, w5 {
收藏 评论0 发布时间:2021-11-17 23:02

举报

0个回答

所属标签

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