STM32L0 读取唯一序列号UID6 c9 N) Q$ o' {. Y4 [
直接寻址 a) [# I5 ^' Z+ D1 T
STM32L0的UID首地址为0x1FF80050,采用如下方式可以读取3个字共96位的UID。
$ q* ]# E$ ?. Q& @) R: R# }8 J- L
" k& s, `* H: ~# I- w' J: S* E- #define UID_BASE 0x1FF80050' p ^2 `3 C. K+ w5 b& w7 R
- uint32_t UID[3]; {8 h0 W K* i5 G8 B8 ]
- UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));. Q; \! v4 j: D+ B) z. h) q! e/ U
- UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));
& C; r0 r1 D: ^5 B6 t - UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
复制代码
3 i0 J$ F$ [, D# o3 V3 A$ u: `$ F1 x ^; }$ \1 N
测试发现两片不同的STM32L031芯片,读出的UID是相同的!!# `0 k/ k& B( V9 v9 y0 ]
s i8 `6 `( `- \
HAL库读取
k3 P& ^, O& h直接采用HAL读取UID的库函数进行读取,HAL库支持如下的读取:
5 g/ b: R7 F* U* l, f+ J- uint32_t HAL_GetHalVersion(void);* |: x( ^6 g6 B* G' c. L2 g
- uint32_t HAL_GetREVID(void);: U8 o4 {$ x$ I% T$ O
- uint32_t HAL_GetDEVID(void);
4 K& z P$ n, ^) H4 f! z5 E - uint32_t HAL_GetUIDw0(void);9 ?/ F. Z* m0 {! `% z
- uint32_t HAL_GetUIDw1(void);; N( U8 [9 g/ I w I$ @# |
- uint32_t HAL_GetUIDw2(void);
复制代码 因此,读取代码如下:
; L' @7 Q' s2 A% K2 R# K- uint32_t UID[3];; J5 W1 W) Y+ ?" x0 `
- UID[0] = HAL_GetUIDw0();
! y+ \& l2 c( R. [0 l - UID[1] = HAL_GetUIDw1();# W1 U: T& g. _; h; ^; z% {
- UID[2] = HAL_GetUIDw2();
复制代码 测试发现两片不同的STM32L031芯片,读出的UID是不同的!!& P4 n# N0 N+ P ?7 A
' n: J T/ x. f7 q- z( i0 e
查找原因
5 S/ | J' |7 X对HAL_GetUIDw0(),HAL_GetUIDw1(), HAL_GetUIDw2()进行分析,发现:
5 F4 m! E$ `5 v! Q7 ^! E5 V
5 q' u! u- v! h5 O, A2 ]- uint32_t HAL_GetUIDw0(void)
, @4 ^& v6 Z& J4 R: ^& r3 [ - {
/ [7 I; l& Q7 X4 C2 K - return(READ_REG(*((uint32_t *)UID_BASE)));# K, b6 c8 I2 w. u( v6 e
- }2 r( L3 o3 u4 A7 H* j: e
- uint32_t HAL_GetUIDw1(void)
6 ^' [3 L% x7 I - {+ X/ y% M) {, v' k, A2 [+ k
- return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));# {; W1 ~1 {3 v
- }
5 _0 n* [! `/ P8 A R2 c& E - uint32_t HAL_GetUIDw2(void)
+ F4 G- }% U4 B @, A& c# f - {
! D+ u* n% E$ R7 |# p - return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));
& `& m% F0 k+ V6 J2 R - }
复制代码 6 |0 l0 A# e$ d1 i- _5 V- l! ?& t B0 E
问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:3 c) t6 \. W m) m$ a
- UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
9 T* _( A, ^% c9 e: G8 ^9 j; w - UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));, o- V9 v6 X. w7 Z4 Y7 [
- UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 14)));
复制代码
+ @* U% ?$ C0 L- f5 s, D则读取UID正确.
/ M R. w7 S# l$ H- A6 Y" b4 J: W( O3 S) H
6 G8 s5 V& @" U( d* N1 h
|