STM32L0 读取唯一序列号UID
9 [8 i _2 ?$ v0 V8 Y! o: |- }直接寻址9 h: `5 P7 ?0 {
STM32L0的UID首地址为0x1FF80050,采用如下方式可以读取3个字共96位的UID。
, M# ?9 P, E+ B8 y0 ~2 r9 C
* n, |+ x7 V& l1 R1 a7 h- A7 R2 _- #define UID_BASE 0x1FF80050
8 J1 d# l! d. _: q% L - uint32_t UID[3];* h* a e, p8 p1 M; {( D
- UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
% Z2 d6 A1 S7 C4 E - UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));8 q& g) s( S. j4 ? }
- UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
复制代码 . @! E% z1 k+ X" b$ w
- E# X" U H4 ?6 u5 q
测试发现两片不同的STM32L031芯片,读出的UID是相同的!!7 [, B* ~8 e2 l
$ Z Z: K2 s* G8 L1 [+ j {
HAL库读取, P! y- X3 r; s0 Y5 t# O
直接采用HAL读取UID的库函数进行读取,HAL库支持如下的读取:, k' X. u- n7 J4 C# I P, {
- uint32_t HAL_GetHalVersion(void);
) X8 D7 B+ L( E" C - uint32_t HAL_GetREVID(void);
, Z' B' c# W8 U5 A) i - uint32_t HAL_GetDEVID(void);
6 Z7 h1 Z' ?7 | - uint32_t HAL_GetUIDw0(void);. N) N' F/ U+ K1 R% B
- uint32_t HAL_GetUIDw1(void);
6 }3 u! N9 ^# n$ m) |" Z, f0 E - uint32_t HAL_GetUIDw2(void);
复制代码 因此,读取代码如下:
" A# S3 M1 W0 r$ q( J) {7 f- B- {- uint32_t UID[3];
1 S" F2 y+ d2 t8 U - UID[0] = HAL_GetUIDw0();8 L3 H: c! ^ c* Q3 r$ l' m4 j
- UID[1] = HAL_GetUIDw1();
. P. a$ ?+ i1 C0 P" z& @3 } - UID[2] = HAL_GetUIDw2();
复制代码 测试发现两片不同的STM32L031芯片,读出的UID是不同的!!9 O% M9 t! a. U$ `2 y
% ^8 n/ r1 L7 t4 B( `/ c' E" ~- v
查找原因! h" I$ X$ a5 N- F) o
对HAL_GetUIDw0(),HAL_GetUIDw1(), HAL_GetUIDw2()进行分析,发现:
( G9 r6 S- ^" a: Y
( P5 A" Q. R7 K# n' j r& \) R6 ]- uint32_t HAL_GetUIDw0(void)
) X3 C4 E/ U: \6 ?) l - {
: E2 b( p4 `" R - return(READ_REG(*((uint32_t *)UID_BASE)));
: Y5 u0 T, n& o9 w - }
V0 ]" w1 ~1 m- T/ y7 T5 ] - uint32_t HAL_GetUIDw1(void)) E1 G, B$ L6 A$ O: a
- {
' [" I% v% k# X q - return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));
3 m# F" L0 c3 S/ j4 C. v0 P - }
8 u# e% J/ b- |/ `! |6 m - uint32_t HAL_GetUIDw2(void)
- [; j, \. V1 ~2 D4 \+ u! c - {
$ `8 I: ^% @9 t/ o4 F4 R - return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U)))); H0 O- c; F( I. n/ q
- }
复制代码
5 S h* M; ]0 R2 _# P问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:1 G+ r( w/ K5 O1 d( @9 k
- UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
* V. O4 ~1 [- w - UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));* H3 T3 [, w- I+ V; r" G5 C
- UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 14)));
复制代码 ) r: O; l1 K. [1 X
则读取UID正确.
9 ~; W3 E. C+ N4 f- N$ x0 ^7 J: l/ G8 \0 S( v/ \) R
) r6 G* Z4 Z$ B. A' {8 [ |