STM32L0 读取唯一序列号UID
1 \0 U" }/ U1 r直接寻址
x+ {/ b# A" o( y' B' {8 PSTM32L0的UID首地址为0x1FF80050,采用如下方式可以读取3个字共96位的UID。
( {/ N b; b/ i* f/ ^* j' R2 {% f8 r8 R* F# j m6 ]: j
- #define UID_BASE 0x1FF80050
( t _6 ?* I. V1 i' k - uint32_t UID[3];) X4 X' n i/ N" P _9 u! |. y* q
- UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));: r) f& S7 {' ?1 a8 Q4 |" g
- UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));
5 N+ o8 J/ h7 K( } - UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
复制代码 " f" {: x, D9 {
( n1 ?& o+ ~+ U
测试发现两片不同的STM32L031芯片,读出的UID是相同的!! v& Q; O, ?6 A# n j4 F% ]( ]$ J$ A
7 B& E* f! `: I! v% C) ?! @HAL库读取( w7 w* n) u2 h& j7 {* I
直接采用HAL读取UID的库函数进行读取,HAL库支持如下的读取:, n& |# a. s5 v9 R* {, t
- uint32_t HAL_GetHalVersion(void);6 ~, ]+ O# O V$ P
- uint32_t HAL_GetREVID(void);. @& C$ N5 Q) v
- uint32_t HAL_GetDEVID(void);: p0 s8 P6 ^3 R2 [- o9 _: q+ E
- uint32_t HAL_GetUIDw0(void);% U( h/ E1 A: R' B& I
- uint32_t HAL_GetUIDw1(void);' X0 n. {5 A5 N$ |; E
- uint32_t HAL_GetUIDw2(void);
复制代码 因此,读取代码如下:/ l7 X- ^, n5 q
- uint32_t UID[3];
$ F, g( {8 m4 H5 D t- A - UID[0] = HAL_GetUIDw0();4 n9 Y9 ]! f& p. c$ \
- UID[1] = HAL_GetUIDw1();! |$ D% I D1 n+ ~( ~8 b5 S- [+ @/ a
- UID[2] = HAL_GetUIDw2();
复制代码 测试发现两片不同的STM32L031芯片,读出的UID是不同的!!' U: U) T" e4 K% v% [
( ]- F/ F3 _ D; N
查找原因
2 u+ E1 ]" {# K6 ^; i6 p. y对HAL_GetUIDw0(),HAL_GetUIDw1(), HAL_GetUIDw2()进行分析,发现:
* u9 X1 a0 i% t, T. B2 a9 q- H! L5 y3 c# ^
- uint32_t HAL_GetUIDw0(void)
/ P7 {! K+ @0 H& z6 N - {- R e5 U& B+ v+ |
- return(READ_REG(*((uint32_t *)UID_BASE)));
( _* H4 r' U) _+ _, |+ l% C - }4 a/ _: V' [8 D5 F' d" v, U1 a" [
- uint32_t HAL_GetUIDw1(void). }) m8 i0 R9 j3 h' a5 s: f
- {
, a( `# ~7 k1 s+ y+ y& L( s8 F - return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));
2 f1 n5 U/ V+ ] - }8 F) e& f6 d7 s# G/ V& L
- uint32_t HAL_GetUIDw2(void)
( j1 p% n5 v5 u' W( h9 I - {) o; M1 P! m+ Q; f4 L% N
- return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));' R" r" K( T I" _ g6 Y4 b3 X
- }
复制代码 : r0 P2 {5 M' X; S; [& D9 W* ?
问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:
! m6 U" y/ s) [. c, q* O0 Q- UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
$ _3 u/ A$ ?. h. i2 i, ^ - UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));
' N; v% @6 S4 `3 e7 G; r - UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 14)));
复制代码 / c! R, v9 h4 o
则读取UID正确.
0 `' c, ?9 ~3 e0 J' X4 l8 l
# J" i" I- q1 W9 R+ Q7 F1 H9 K/ _( j& d! A* Y
|