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 }- #define UID_BASE 0x1FF80050, w/ Q' C) {3 w: {( }# o
- uint32_t UID[3];
# }" V$ N+ f# V# `& r - UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));3 F$ T4 R( n# j0 z4 }
- UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));5 w- C" O: f b5 }8 J' j( Z; f
- 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- uint32_t HAL_GetHalVersion(void);
4 u: v5 v+ ~/ Q" M) u" \/ [ - uint32_t HAL_GetREVID(void);+ K9 m0 Q: }; F" x$ q* {5 d9 Q
- uint32_t HAL_GetDEVID(void);
7 X S2 z1 Y( h2 C& k - uint32_t HAL_GetUIDw0(void);: l) D: v2 d l }: z, d
- uint32_t HAL_GetUIDw1(void);
1 i5 }( _8 U8 ]2 ` - uint32_t HAL_GetUIDw2(void);
复制代码 因此,读取代码如下:
7 ]" m H6 D; J6 L- uint32_t UID[3];
. ~, W* Q& |8 y' ~ - UID[0] = HAL_GetUIDw0();. ^, h/ d* [* T/ h; ^
- UID[1] = HAL_GetUIDw1();- J3 E+ Y1 u" K* x
- 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- uint32_t HAL_GetUIDw0(void)% e/ E: c$ t$ f5 S! W2 J& j+ V
- {
- M7 V/ F' B. Z4 D1 l0 } - return(READ_REG(*((uint32_t *)UID_BASE)));3 y* T( V# g2 y8 M- @' W* x- a, n2 S
- }+ Z! N8 N3 b8 Z/ p( d0 X
- uint32_t HAL_GetUIDw1(void)
# {; r9 }; K O" V& c - {! b d* w- ~ L1 @
- return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));2 z5 r$ ~; U$ e5 e; `, ]2 ~
- }! g# f3 R- G5 q
- uint32_t HAL_GetUIDw2(void)4 J3 N- A6 s& b# j4 J( t- W3 g
- {
) M" F8 e; g" l - return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));* |) A( }( ]& b5 }7 V3 M
- }
复制代码
+ Q t3 ]* ~3 V1 b* ^7 N问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:
" n8 _2 n$ A+ `( _- UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));7 F/ w" U1 f$ ^- s$ Z
- UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));1 R8 Y3 b! @4 h/ b! R+ t- j
- 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
|