STM32L0 读取唯一序列号UID& _/ p; r0 z1 w; u; ^" E
直接寻址+ p6 @7 h4 L& ~8 z3 ^9 q4 `- J1 O
STM32L0的UID首地址为0x1FF80050,采用如下方式可以读取3个字共96位的UID。 M$ z k3 U2 q8 P2 t! m F3 q
0 |) `# S$ K5 T- }- #define UID_BASE 0x1FF800504 {$ F- A7 p! r
- uint32_t UID[3];( d1 t7 L: D$ F# z8 v; I
- UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));3 s# w- l* B9 U
- UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));* g; g0 g$ V9 b3 `/ a* B7 s: {
- UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
复制代码 ( G x9 _" a/ f
! T3 y; R: n+ w- L测试发现两片不同的STM32L031芯片,读出的UID是相同的!!1 P1 z# `6 E1 N$ D& ^9 L) C
+ x& G$ x8 \2 bHAL库读取7 q' u! |' j) z# i2 J1 E. P6 V
直接采用HAL读取UID的库函数进行读取,HAL库支持如下的读取:
' Y9 w3 F7 P( K) }' ?9 i- uint32_t HAL_GetHalVersion(void);
& |' R5 G0 [, \5 W: h8 k - uint32_t HAL_GetREVID(void);
( x( k6 S7 b: r) O0 T% `$ r/ X - uint32_t HAL_GetDEVID(void);
: @& d' ~+ ~; y+ a* V - uint32_t HAL_GetUIDw0(void);
! l5 C/ c" a; \ - uint32_t HAL_GetUIDw1(void); v; `( B7 ^* B0 `0 H! l
- uint32_t HAL_GetUIDw2(void);
复制代码 因此,读取代码如下:: q5 ?6 j+ b" ?' _
- uint32_t UID[3];
$ R) t3 ~3 {# L9 _" s+ y+ T - UID[0] = HAL_GetUIDw0();2 J9 I/ X3 K% e. t
- UID[1] = HAL_GetUIDw1();% W/ n1 x7 O1 e% X7 u0 j
- UID[2] = HAL_GetUIDw2();
复制代码 测试发现两片不同的STM32L031芯片,读出的UID是不同的!!
4 O9 ~* p9 d! l- l( u$ K% v' c
9 A$ s ]6 m7 x& X! Q* e查找原因
" G+ o; ^: l. l; d) N8 `对HAL_GetUIDw0(),HAL_GetUIDw1(), HAL_GetUIDw2()进行分析,发现:9 ^( f3 D8 j" l4 |: H( P& j4 o+ x
9 P B i# c, a7 L( Q
- uint32_t HAL_GetUIDw0(void)
q* A9 W1 ^$ F5 O3 k# r p5 b8 S; `& } - {' K, w. j* E: l
- return(READ_REG(*((uint32_t *)UID_BASE)));. I2 W- w& N: e% d! r
- }
0 E, |7 ?$ ?8 p+ j3 C: N' n/ j Y - uint32_t HAL_GetUIDw1(void)
& }. z5 v. i8 I9 q" v+ e - {4 J1 Q5 b; R2 i( K( ^& \' ~0 o/ W( T
- return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));
* u7 [# O$ R7 }+ H* w8 _- `* t0 z - }
. \ s4 M$ Y: H) P - uint32_t HAL_GetUIDw2(void)$ v% C s, o: n. `1 l; {/ x7 y
- {
$ u5 ]9 v+ {6 K& ~2 `( o& Y - return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));
/ ?9 O' r; B. A( f* r/ Q - }
复制代码
" c+ ^$ ]- d, y. I5 k问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:
" U' x7 U6 b& J2 T- UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
5 D$ z1 R( f) ~/ h. g" c - UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));" }+ E A( n7 H+ c* Z1 J( a# ?
- UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 14)));
复制代码
0 |" @! D# u4 y! ]( a3 g: ?# |3 O则读取UID正确.; u& V3 O% K' ?0 ]( i* h1 f
^4 ^# A7 j h q6 d+ m' Q( J
3 a2 e( Q" _) I9 Q. R
|