STM32L0 读取唯一序列号UID5 \, c0 D; O2 M7 @. |6 a) K; J
直接寻址# @6 [9 W6 Z, |3 d1 K
STM32L0的UID首地址为0x1FF80050,采用如下方式可以读取3个字共96位的UID。
& ~/ V/ |+ x' i3 k8 ?/ B! k) f, r4 D1 L t
- #define UID_BASE 0x1FF80050
& m8 G: W& k6 Q2 W. i - uint32_t UID[3];
1 Q }* T1 ~2 D3 E7 \; _& N - UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
, m- e3 S( ]' l7 ` - UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));4 d' D* r' e- `/ [5 T
- UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
复制代码
1 n4 N- \# _" |7 r3 K
( Z6 g5 G, [$ i( u0 i测试发现两片不同的STM32L031芯片,读出的UID是相同的!!; e4 f. u) T, \7 C( i" ]2 t; s5 q. {
/ @! L$ P) G- ~0 n; yHAL库读取
" O1 @' d7 P/ k1 s直接采用HAL读取UID的库函数进行读取,HAL库支持如下的读取:
9 m4 R7 c/ q/ ]) q) h3 g" `& N7 ^7 t) Z- uint32_t HAL_GetHalVersion(void);
5 |) [7 l# E6 Y: z/ ?# m - uint32_t HAL_GetREVID(void);
# |' r9 G- H5 Q - uint32_t HAL_GetDEVID(void);
# b! Y- t3 q8 u( w - uint32_t HAL_GetUIDw0(void);. j( P+ ~; s7 ]9 x" A
- uint32_t HAL_GetUIDw1(void);7 \9 ]; i/ [% k8 Y/ i5 _
- uint32_t HAL_GetUIDw2(void);
复制代码 因此,读取代码如下:
$ }2 b2 _* i+ |0 q- uint32_t UID[3];; V% c( v1 j7 I! u9 H+ m: _1 m
- UID[0] = HAL_GetUIDw0();1 Y7 B8 R5 `* ]3 E$ C }! g
- UID[1] = HAL_GetUIDw1();
% o; s; e$ f3 X2 ? - UID[2] = HAL_GetUIDw2();
复制代码 测试发现两片不同的STM32L031芯片,读出的UID是不同的!!
: {/ M) `) N9 J8 C5 w9 s7 f r: A3 w8 E# Z3 ~
查找原因
# e5 H4 H1 P$ G: ?0 r- B对HAL_GetUIDw0(),HAL_GetUIDw1(), HAL_GetUIDw2()进行分析,发现:
$ ~( A) J5 J' b+ c" E5 Y) E4 c* [
- uint32_t HAL_GetUIDw0(void)
$ H7 L5 H/ @( |, l - {
3 {, g* g. c* W0 o - return(READ_REG(*((uint32_t *)UID_BASE)));% E, X. m! N H( X+ f4 \
- }
8 _" Q: E E8 Y9 a4 a - uint32_t HAL_GetUIDw1(void); @& r4 |0 F: d6 ]) f
- {
4 {% z; \4 k/ y7 F/ Y7 y# x9 G - return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));
& Z1 }3 i, t; ?. C4 d9 G& i2 c - }
0 s9 X; E, F6 o6 Q - uint32_t HAL_GetUIDw2(void)
) o! o5 n" n2 j* F - {' u/ k/ F" A3 O( e+ T
- return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));5 i- D9 O6 U' w4 @
- }
复制代码 1 u$ y9 |0 {, [7 _: E0 x; q8 C6 R% J
问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:8 r* y( N: g- \; [! P+ \; h
- UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));0 A8 C& K: _8 v4 ~
- UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));
6 X& ~9 E% ^( a8 {+ ]5 ~5 p. I" ` - UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 14)));
复制代码
7 [5 q( u1 E7 M, V/ \9 i' i则读取UID正确.( ]% `: t! a- m- k }
$ M& ]. G1 B. I' `4 Q: h( g3 J6 ~8 t
' i# m& o) v/ b0 V$ E |