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

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

[复制链接]
STMCU小助手 发布时间:2021-11-17 23:02
STM32L0 读取唯一序列号UID
7 W3 ~/ v) l7 g  o9 a6 h9 q/ S+ e' }" ^直接寻址
' N0 @7 p& w9 ^# NSTM32L0的UID首地址为0x1FF80050,采用如下方式可以读取3个字共96位的UID。
5 l" ^% I2 X; y2 Q% Q! e
1 N$ ?7 d( f9 }) B7 E- M6 S
  1.   #define UID_BASE 0x1FF80050
    - r8 W( ~: T! I( H( \1 i
  2.   uint32_t UID[3];- @; y) j3 g0 r3 j/ @
  3.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
    1 r, I  c5 p. l7 X# i5 n5 R/ t
  4.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));
    ! M$ D9 k3 b3 x+ g
  5.   UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
复制代码
. X; R" F7 X+ t7 r9 b. W9 {
' r% T9 C/ `& r- K+ A1 s! L
测试发现两片不同的STM32L031芯片,读出的UID是相同的!!
/ q" M) i+ L" K( [
+ k; L% h) V/ AHAL库读取3 S5 `: O' V" c, i1 G
直接采用HAL读取UID的库函数进行读取,HAL库支持如下的读取:* g, f& A; j5 W( E9 F" F
  1. uint32_t HAL_GetHalVersion(void);/ C( K- p( G7 n, ^; X4 O
  2. uint32_t HAL_GetREVID(void);. `1 ^& K7 T0 I# I
  3. uint32_t HAL_GetDEVID(void);! d7 a& d4 U0 u' Q0 s
  4. uint32_t HAL_GetUIDw0(void);
    $ K- w/ d% R4 d" X$ b0 Y
  5. uint32_t HAL_GetUIDw1(void);, s% m" e. H& o& y
  6. uint32_t HAL_GetUIDw2(void);
复制代码
因此,读取代码如下:9 b' V6 ?# x" C
  1.   uint32_t UID[3];4 P/ e: l/ O' E' b  I) Y
  2.   UID[0] = HAL_GetUIDw0();6 J" `, K; J5 u" E
  3.   UID[1] = HAL_GetUIDw1();
    * Y- p2 t: X5 d
  4.   UID[2] = HAL_GetUIDw2();
复制代码
测试发现两片不同的STM32L031芯片,读出的UID是不同的!!) ?* d. L. w/ D

, t+ C- a, ]# C5 N查找原因/ @7 f, S/ U# v, e+ \) B& T
对HAL_GetUIDw0(),HAL_GetUIDw1(), HAL_GetUIDw2()进行分析,发现:6 p) _5 e" ^3 X9 Q( k! D
# Y! A+ {+ a: N3 T) _+ A  [& A
  1. uint32_t HAL_GetUIDw0(void)
      {0 i! {! g1 A/ y
  2. {6 n2 h* U! j1 J! N; c$ a3 {: W8 S
  3.   return(READ_REG(*((uint32_t *)UID_BASE)));
    4 L6 F5 ~: j4 [5 p2 _
  4. }# Y9 i: p6 k; p+ R* D& g
  5. uint32_t HAL_GetUIDw1(void)
    * B- C; Z; z4 B7 f
  6. {
    9 B9 X. N  J0 f0 w- ?% a
  7.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));  h4 k) b1 y! V* g+ P! ^: t
  8. }( W# C4 }, {5 f6 m$ r+ q) ]! T
  9. uint32_t HAL_GetUIDw2(void)2 ^$ q5 [# n$ |
  10. {
    , r- |1 z+ c  _$ ?
  11.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));
    2 p# l3 E  D$ T! G
  12. }
复制代码

# H( T$ x2 ]9 Y4 ?问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:
9 ^  Q% j* D( y
  1.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));9 I* a. r% m' t2 T* b
  2.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));) v+ O+ C8 R$ b2 m7 f* \
  3.   UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 14)));
复制代码

( c4 C/ n6 E+ M1 i, V& l6 G则读取UID正确.
7 D; h3 D, H# n6 Y% g8 V0 u
$ }" A9 K+ f1 i, l) v
. L6 \# ^" ]7 k2 ]
收藏 评论0 发布时间:2021-11-17 23:02

举报

0个回答

所属标签

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