STM32L0 读取唯一序列号UID. u+ M% Q/ d9 R
直接寻址
, J, K) { |( }! Z. `STM32L0的UID首地址为0x1FF80050,采用如下方式可以读取3个字共96位的UID。. ]' J9 _5 P' ~! `
& g! g: t" U! M$ [- o3 c' N: y- #define UID_BASE 0x1FF80050( ~, c- d( X, z5 `: I
- uint32_t UID[3];
7 {* z+ Q0 `$ n' H - UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));/ [8 S( O; B& f
- UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));
/ j8 O7 {, i$ {7 d9 W% A8 U4 z: j& B& s' R - UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
复制代码 * z6 y( }: t9 t( A- w5 V' w5 @9 P& G: E6 X
) ?" B( u* G- g* ^# r测试发现两片不同的STM32L031芯片,读出的UID是相同的!!
1 i, A7 ^) R9 a; |# l& D' W' p( ~% C4 b4 P0 R
HAL库读取
. W* h1 j; t: J7 b4 l& y N1 W/ K直接采用HAL读取UID的库函数进行读取,HAL库支持如下的读取:
0 c4 p" [8 {8 o9 F+ o* U; z' T- uint32_t HAL_GetHalVersion(void);$ Y! v/ G# f% M6 Y% s
- uint32_t HAL_GetREVID(void);
: i0 ~. ~: t5 b/ Y* }: u - uint32_t HAL_GetDEVID(void);
; f* m5 G P6 V* w - uint32_t HAL_GetUIDw0(void);8 _1 |! w2 o5 i/ i* z
- uint32_t HAL_GetUIDw1(void);
* ~$ _* m" _+ P/ o) l - uint32_t HAL_GetUIDw2(void);
复制代码 因此,读取代码如下:6 L2 `; }. L4 g
- uint32_t UID[3];
h8 Q' a7 u( s j% I - UID[0] = HAL_GetUIDw0();
x& u5 d$ l$ [+ V& N - UID[1] = HAL_GetUIDw1();
" @- J6 a& i' G/ G& p1 u$ \4 Z - UID[2] = HAL_GetUIDw2();
复制代码 测试发现两片不同的STM32L031芯片,读出的UID是不同的!!
+ A: \) b: O+ H$ S n: P2 B) M# v7 z1 R7 P1 f& Z- A; K' i
查找原因+ O5 }- O N+ B+ v# u/ c7 P
对HAL_GetUIDw0(),HAL_GetUIDw1(), HAL_GetUIDw2()进行分析,发现:- }7 g, q7 {# N
. B" C+ g! {! }% o; O' a/ x! e
- uint32_t HAL_GetUIDw0(void)
6 E! I7 t) H- W) j - {4 V: w5 _& ]% X% J" I
- return(READ_REG(*((uint32_t *)UID_BASE)));
9 c- j- }1 G( D+ q8 z y0 Q& ^) y/ j - }
) C7 m* B; k( \2 w1 v5 g5 f - uint32_t HAL_GetUIDw1(void)/ J, a" e$ d9 E- c, i
- {
6 M7 k7 X& i$ V1 g9 y/ m& p - return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));3 G/ ]- q8 [' C* U* s) n; N
- }
; t; v" V7 \$ k9 }; u& Q, H - uint32_t HAL_GetUIDw2(void)8 L( H. K; {- [' j, ]: d# c
- {5 W) R, M4 r3 u% v
- return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));- o4 r, \: C; v$ [
- }
复制代码
3 h" T7 m4 I) b) V" O+ w问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:
* ?. t9 a$ E9 ?. f% _; _- UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
0 f9 x4 q7 K. Q. O - UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));3 x0 I% H( n- L' c
- UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 14)));
复制代码 / R+ w+ c0 e' M& j
则读取UID正确.1 c' d) o9 R+ n) Q1 M
' d A, Y! q4 {1 [
0 w& O1 y: j0 v; d- X0 C! ^1 A |