STM32L0 读取唯一序列号UID( S; S6 x* H; F: b+ E. C
直接寻址) _! N6 c2 ? ~' _1 I) w
STM32L0的UID首地址为0x1FF80050,采用如下方式可以读取3个字共96位的UID。
/ n- ?# T7 J0 f5 p8 S5 P# Y' i* a, a6 I+ c2 f% J
- #define UID_BASE 0x1FF80050
/ }0 w; B$ U; [7 S+ t7 @! A& P - uint32_t UID[3];& [! e9 @& V# k% W
- UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));3 ]4 C8 G x% u$ R$ E' D
- UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));
9 X) ^5 X0 y+ A6 s - UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
复制代码 " v2 R% t& s% b( \" y1 `% [
+ g# c8 E3 M2 u$ A9 {" x
测试发现两片不同的STM32L031芯片,读出的UID是相同的!!7 }# w- l" n4 o& \9 D8 U. s
7 n" U7 U# S! J. l7 d9 r, T5 e
HAL库读取
0 k7 B$ u( u5 _( [2 }3 S( l直接采用HAL读取UID的库函数进行读取,HAL库支持如下的读取:
! z- \! [0 s A# ]* l- uint32_t HAL_GetHalVersion(void);
0 I" A8 u' f& q+ P( }! [) A - uint32_t HAL_GetREVID(void);. _3 Z1 J* S r% J# }
- uint32_t HAL_GetDEVID(void);
+ C) T& r3 M7 z8 ?9 B+ A6 W) i1 Z - uint32_t HAL_GetUIDw0(void);: R. u5 ^" j8 }9 l0 g
- uint32_t HAL_GetUIDw1(void);
% x- Y9 ]( s2 l& `5 _0 `: v4 m - uint32_t HAL_GetUIDw2(void);
复制代码 因此,读取代码如下:( a) d B9 S- I* P8 |" w
- uint32_t UID[3];
" H k4 h$ M/ m - UID[0] = HAL_GetUIDw0();
1 C% B# u; O1 I* U - UID[1] = HAL_GetUIDw1();
2 c' ^$ b2 `. |) G7 B. I: m - UID[2] = HAL_GetUIDw2();
复制代码 测试发现两片不同的STM32L031芯片,读出的UID是不同的!!) R. i2 [3 m4 }/ F/ l9 R
- l5 W& |0 ^# p' I3 @/ Y; H6 O0 U
查找原因2 k6 S, L+ F/ J& f+ Q$ ?$ m+ y: |
对HAL_GetUIDw0(),HAL_GetUIDw1(), HAL_GetUIDw2()进行分析,发现:
. d, N9 q+ E: Y3 m$ i' m; k
# Y! Z+ R+ Q, x+ b% p) R- t0 E* ?- uint32_t HAL_GetUIDw0(void)- h8 r) c! R8 Z# ]$ J
- {
# T4 a6 r1 c! ^ - return(READ_REG(*((uint32_t *)UID_BASE)));$ p7 o, }7 A/ O
- }
2 L+ t+ u8 I) u! Z - uint32_t HAL_GetUIDw1(void)
9 ?* y* `) Y; M" w - {$ O6 P# E, Z2 |; ^% C; K
- return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));
- Y5 e9 I, l; ?7 ? - } V& u2 Z8 L9 Y% d% w D
- uint32_t HAL_GetUIDw2(void)
) n3 F/ K2 {0 @( H - {
9 l1 w& s! S5 U! M0 q' B- `$ N - return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));
$ p* i' p0 C1 E) _ - }
复制代码 * T! B# H/ v% T u, h
问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:: O' }: F& X7 b) t
- UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
5 _# Y4 A$ r! ~! `) r - UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));+ [ G Q {) P' G% r
- UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 14)));
复制代码 S9 p5 E* [1 t( I1 J5 e3 m, q
则读取UID正确.
* a" [( Y& x6 S# h8 o; i! U8 B! x! o9 y
. w6 W$ \( f7 _, m7 b- |$ m$ E. [9 x& i" E5 N, o
|