STM32L0 读取唯一序列号UID
7 W3 ~/ v) l7 g o9 a6 h9 q/ S+ e' }" ^直接寻址
' N0 @7 p& w9 ^# NSTM32L0的UID首地址为0x1FF80050,采用如下方式可以读取3个字共96位的UID。
5 l" ^% I2 X; y2 Q% Q! e
1 N$ ?7 d( f9 }) B7 E- M6 S- #define UID_BASE 0x1FF80050
- r8 W( ~: T! I( H( \1 i - uint32_t UID[3];- @; y) j3 g0 r3 j/ @
- UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
1 r, I c5 p. l7 X# i5 n5 R/ t - UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));
! M$ D9 k3 b3 x+ g - UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
复制代码 . X; R" F7 X+ t7 r9 b. W9 {
' r% T9 C/ `& r- K+ A1 s! L
测试发现两片不同的STM32L031芯片,读出的UID是相同的!!
/ q" M) i+ L" K( [
+ k; L% h) V/ AHAL库读取3 S5 `: O' V" c, i1 G
直接采用HAL读取UID的库函数进行读取,HAL库支持如下的读取:* g, f& A; j5 W( E9 F" F
- uint32_t HAL_GetHalVersion(void);/ C( K- p( G7 n, ^; X4 O
- uint32_t HAL_GetREVID(void);. `1 ^& K7 T0 I# I
- uint32_t HAL_GetDEVID(void);! d7 a& d4 U0 u' Q0 s
- uint32_t HAL_GetUIDw0(void);
$ K- w/ d% R4 d" X$ b0 Y - uint32_t HAL_GetUIDw1(void);, s% m" e. H& o& y
- uint32_t HAL_GetUIDw2(void);
复制代码 因此,读取代码如下:9 b' V6 ?# x" C
- uint32_t UID[3];4 P/ e: l/ O' E' b I) Y
- UID[0] = HAL_GetUIDw0();6 J" `, K; J5 u" E
- UID[1] = HAL_GetUIDw1();
* Y- p2 t: X5 d - UID[2] = HAL_GetUIDw2();
复制代码 测试发现两片不同的STM32L031芯片,读出的UID是不同的!!) ?* d. L. w/ D
, t+ C- a, ]# C5 N查找原因/ @7 f, S/ U# v, e+ \) B& T
对HAL_GetUIDw0(),HAL_GetUIDw1(), HAL_GetUIDw2()进行分析,发现:6 p) _5 e" ^3 X9 Q( k! D
# Y! A+ {+ a: N3 T) _+ A [& A
- uint32_t HAL_GetUIDw0(void)
{0 i! {! g1 A/ y - {6 n2 h* U! j1 J! N; c$ a3 {: W8 S
- return(READ_REG(*((uint32_t *)UID_BASE)));
4 L6 F5 ~: j4 [5 p2 _ - }# Y9 i: p6 k; p+ R* D& g
- uint32_t HAL_GetUIDw1(void)
* B- C; Z; z4 B7 f - {
9 B9 X. N J0 f0 w- ?% a - return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U)))); h4 k) b1 y! V* g+ P! ^: t
- }( W# C4 }, {5 f6 m$ r+ q) ]! T
- uint32_t HAL_GetUIDw2(void)2 ^$ q5 [# n$ |
- {
, r- |1 z+ c _$ ? - return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));
2 p# l3 E D$ T! G - }
复制代码
# H( T$ x2 ]9 Y4 ?问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:
9 ^ Q% j* D( y- UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));9 I* a. r% m' t2 T* b
- UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));) v+ O+ C8 R$ b2 m7 f* \
- UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 14)));
复制代码
( c4 C/ n6 E+ M1 i, V& l6 G则读取UID正确.
7 D; h3 D, H# n6 Y% g8 V0 u
$ }" A9 K+ f1 i, l) v
. L6 \# ^" ]7 k2 ] |