STM32L0 读取唯一序列号UID
3 k4 s9 {9 n; x( u直接寻址0 T% v3 k# B/ a4 G7 X& |/ P3 _3 U
STM32L0的UID首地址为0x1FF80050,采用如下方式可以读取3个字共96位的UID。
6 m4 m h+ |& ?1 @4 R, x
9 b: X5 p8 n0 y) f6 m" k# f( k; c- #define UID_BASE 0x1FF80050
# S( }8 {* ]0 z+ b4 l% E - uint32_t UID[3];( {) I4 D# i% t: r* e
- UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
& a6 ]' R/ b* n9 P- u - UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));. K& Y- _2 K; I e# f" c4 t
- UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
复制代码 7 g# }% @/ _& p" Z8 T0 _
* e) b: w# K: y# a* d' c* ]+ k! j测试发现两片不同的STM32L031芯片,读出的UID是相同的!!
/ S3 l( c' _) j5 X, Y9 i6 R3 ^6 Q9 B" b) H7 [6 w
HAL库读取4 \6 x7 I/ A" F5 @- L
直接采用HAL读取UID的库函数进行读取,HAL库支持如下的读取:
# j: y( B. Y2 j: L5 g- uint32_t HAL_GetHalVersion(void);
; V% x# J3 | } - uint32_t HAL_GetREVID(void);4 p" r8 _7 ]% @
- uint32_t HAL_GetDEVID(void);
, I5 r; g5 V! T4 d - uint32_t HAL_GetUIDw0(void);
# f& D) i; a9 F8 { - uint32_t HAL_GetUIDw1(void);! s1 o( t( Y" f5 M0 D
- uint32_t HAL_GetUIDw2(void);
复制代码 因此,读取代码如下:" `8 [* Z! A/ F: O+ E* [0 W- H
- uint32_t UID[3];# D$ Q& B; l* u) m; m ^+ ~
- UID[0] = HAL_GetUIDw0();
- h5 |% M: s7 R0 j/ ~* }" l - UID[1] = HAL_GetUIDw1();0 m U" T% U# m( v
- UID[2] = HAL_GetUIDw2();
复制代码 测试发现两片不同的STM32L031芯片,读出的UID是不同的!!
W# r' Y' @3 V
1 P, e3 }4 b/ ~! [查找原因& F$ S% K- w! h5 ~. ^# u" I- G
对HAL_GetUIDw0(),HAL_GetUIDw1(), HAL_GetUIDw2()进行分析,发现:
7 d w/ [* n, I S. E
. G4 s( z+ e* c- uint32_t HAL_GetUIDw0(void)
4 S/ w+ q. }5 O2 t; I - {
2 Y8 {' g7 C8 u n - return(READ_REG(*((uint32_t *)UID_BASE)));
e' I: r' i0 i) ~- \; B - }" c& W$ y# w8 z6 s# V
- uint32_t HAL_GetUIDw1(void): G, j" x" u; Y. v/ h7 u
- {
6 k1 o6 ?9 ~! C, B - return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));! G& Q: q+ C5 W0 ~: m# D
- }
3 [4 u% b) F- E+ X$ i5 ], V0 E) C - uint32_t HAL_GetUIDw2(void), f9 @. E% ]. t' y) o @* |4 O
- {8 |* P* y& A( }
- return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));9 [3 ]. m) B, y: K& i/ U4 v
- }
复制代码 3 l& i% m% |1 E% W9 R8 I5 ^
问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:: g& L6 }7 ~6 H' _* H4 w) j
- UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));$ L! }) `5 I5 C$ e( b6 r) u
- UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));
5 V4 W/ O: y! U. V! C e/ U. l$ x - UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 14)));
复制代码
; m% i l: }$ X则读取UID正确.
! F$ Q; w( E( \9 }& j2 U/ [- z! x: @* M% N7 f' g- `: G
6 }# _4 A0 x% \, w5 {
|