STM32L0 读取唯一序列号UID
5 r X0 [: M" z( c3 `直接寻址9 V- Q8 V& j: Q& i, ?1 n
STM32L0的UID首地址为0x1FF80050,采用如下方式可以读取3个字共96位的UID。& O+ z$ p: z6 U
5 I5 n8 ^, p9 D6 m- #define UID_BASE 0x1FF80050 b, e$ }- A9 N. |
- uint32_t UID[3];
x' q9 S) Z, N9 c5 t - UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));, m6 H1 _* q5 m8 k% ^
- UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));$ G- F" x7 G5 q) j8 Z- v4 Q
- UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
复制代码
2 Y. U! N. U1 l# i7 ]
+ @* ^ @% l- d/ Z' _测试发现两片不同的STM32L031芯片,读出的UID是相同的!!! K4 e9 q% @# C1 ^, G) F
4 G/ p q& d8 X3 G) |HAL库读取. k6 h0 l$ `% g# G
直接采用HAL读取UID的库函数进行读取,HAL库支持如下的读取:0 W% n# `8 N# h$ `; z, H' Q
- uint32_t HAL_GetHalVersion(void);1 E4 T3 c6 Z4 D1 {5 Y+ b
- uint32_t HAL_GetREVID(void);5 p' `, C& Q7 L! J" c* U; o
- uint32_t HAL_GetDEVID(void);5 E7 @. s1 ?/ _9 ^1 Q
- uint32_t HAL_GetUIDw0(void);
4 `6 u+ H& F8 z1 Y1 s1 Y - uint32_t HAL_GetUIDw1(void);! s4 Y% O! k3 l' T- [6 T
- uint32_t HAL_GetUIDw2(void);
复制代码 因此,读取代码如下:
' Q y4 F! ~3 v- uint32_t UID[3];" x- j& U3 B3 A- I6 _6 w3 g
- UID[0] = HAL_GetUIDw0();
% o7 \8 _+ I3 f9 e - UID[1] = HAL_GetUIDw1();+ |& L( o, U9 i# u. Q
- UID[2] = HAL_GetUIDw2();
复制代码 测试发现两片不同的STM32L031芯片,读出的UID是不同的!!
% F5 }7 O- a# I: K/ t3 F- k, |5 J! F
查找原因' p) J" e, W% Z0 l L2 ` X
对HAL_GetUIDw0(),HAL_GetUIDw1(), HAL_GetUIDw2()进行分析,发现:
0 S- ?( i8 C5 d3 h% f/ Q
! C2 n) l" v* T7 ^- uint32_t HAL_GetUIDw0(void)
$ s, y7 o% z F8 p0 ~0 L - {6 N8 Q9 W5 n0 V
- return(READ_REG(*((uint32_t *)UID_BASE)));. ~1 j9 {' n) e
- }2 Z" g$ O* X, @+ v) t: q' m/ |/ K& }
- uint32_t HAL_GetUIDw1(void)7 j& A% a5 k7 M q ]$ p! G
- {
3 Y* Y& ~. ]$ X5 O0 o9 [! `$ d: ~) y - return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));
0 ^! i7 k$ z- e5 Y8 d - }
) r ^( B* m- m2 |- ~ - uint32_t HAL_GetUIDw2(void)
# j' } {# v% u7 _ - {
- O0 g- V3 B3 M( E( R b u - return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));3 u6 h$ k2 x9 x" M9 V* M
- }
复制代码
& Z l% s: |! X7 e% c$ Y问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:
$ O( E/ i$ I* h/ V0 ^. [+ L" l- UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));9 {- Y) K6 k6 q0 Q# f$ _
- UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));% i; O4 B# b- @/ I8 z O h
- UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 14)));
复制代码 $ A9 `. O$ L5 z
则读取UID正确.; u. b3 w u) }/ \* C- H
* n2 K5 t* \5 N3 K8 t6 s: H5 R5 _7 `% `6 R1 \+ s0 V
|