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

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

[复制链接]
STMCU小助手 发布时间:2021-11-17 23:02
STM32L0 读取唯一序列号UID
+ E& W: |, `, Y$ h! s  T直接寻址
1 S. w) j, Z! f( f. ?4 d( ]STM32L0的UID首地址为0x1FF80050,采用如下方式可以读取3个字共96位的UID。
3 w# t' p* O* H  d
7 _: C$ M, I2 N9 O  j$ a3 }
  1.   #define UID_BASE 0x1FF80050, w/ Q' C) {3 w: {( }# o
  2.   uint32_t UID[3];
    # }" V$ N+ f# V# `& r
  3.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));3 F$ T4 R( n# j0 z4 }
  4.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));5 w- C" O: f  b5 }8 J' j( Z; f
  5.   UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
复制代码
& p; f1 L7 F5 q5 X6 k6 |

# Z/ h6 ]2 m5 H& I& C9 x6 j1 t测试发现两片不同的STM32L031芯片,读出的UID是相同的!!0 S( v9 U- v6 J0 x

2 g7 N1 [& r( O: V; |HAL库读取
" \1 @; M! p: I# ]- t6 E直接采用HAL读取UID的库函数进行读取,HAL库支持如下的读取:
0 ~) t6 \9 P  _" G0 _4 u
  1. uint32_t HAL_GetHalVersion(void);
    4 u: v5 v+ ~/ Q" M) u" \/ [
  2. uint32_t HAL_GetREVID(void);+ K9 m0 Q: }; F" x$ q* {5 d9 Q
  3. uint32_t HAL_GetDEVID(void);
    7 X  S2 z1 Y( h2 C& k
  4. uint32_t HAL_GetUIDw0(void);: l) D: v2 d  l  }: z, d
  5. uint32_t HAL_GetUIDw1(void);
    1 i5 }( _8 U8 ]2 `
  6. uint32_t HAL_GetUIDw2(void);
复制代码
因此,读取代码如下:
7 ]" m  H6 D; J6 L
  1.   uint32_t UID[3];
    . ~, W* Q& |8 y' ~
  2.   UID[0] = HAL_GetUIDw0();. ^, h/ d* [* T/ h; ^
  3.   UID[1] = HAL_GetUIDw1();- J3 E+ Y1 u" K* x
  4.   UID[2] = HAL_GetUIDw2();
复制代码
测试发现两片不同的STM32L031芯片,读出的UID是不同的!!& a" G* i' m4 o$ e% q

" z# d' E+ r4 W+ y, ^& N2 V" T查找原因
6 A- \* c* N, L: J+ |对HAL_GetUIDw0(),HAL_GetUIDw1(), HAL_GetUIDw2()进行分析,发现:" A; E/ d2 v& S5 |* }

6 I9 N1 K1 ^0 x$ h; B
  1. uint32_t HAL_GetUIDw0(void)% e/ E: c$ t$ f5 S! W2 J& j+ V
  2. {
    - M7 V/ F' B. Z4 D1 l0 }
  3.   return(READ_REG(*((uint32_t *)UID_BASE)));3 y* T( V# g2 y8 M- @' W* x- a, n2 S
  4. }+ Z! N8 N3 b8 Z/ p( d0 X
  5. uint32_t HAL_GetUIDw1(void)
    # {; r9 }; K  O" V& c
  6. {! b  d* w- ~  L1 @
  7.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));2 z5 r$ ~; U$ e5 e; `, ]2 ~
  8. }! g# f3 R- G5 q
  9. uint32_t HAL_GetUIDw2(void)4 J3 N- A6 s& b# j4 J( t- W3 g
  10. {
    ) M" F8 e; g" l
  11.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));* |) A( }( ]& b5 }7 V3 M
  12. }
复制代码

+ Q  t3 ]* ~3 V1 b* ^7 N问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:
" n8 _2 n$ A+ `( _
  1.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));7 F/ w" U1 f$ ^- s$ Z
  2.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));1 R8 Y3 b! @4 h/ b! R+ t- j
  3.   UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 14)));
复制代码
' S! L. j& {- p3 W9 k0 y, {  U
则读取UID正确./ B! Y' v; I* g- M8 E7 i

+ k) j% q2 Y# S# E( `2 E! J4 v) y) S) \' [9 k& H( S
收藏 评论0 发布时间:2021-11-17 23:02

举报

0个回答

所属标签

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