你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32L0 读取唯一序列号UID

[复制链接]
STMCU小助手 发布时间:2021-11-17 23:02
STM32L0 读取唯一序列号UID. u+ M% Q/ d9 R
直接寻址
, J, K) {  |( }! Z. `STM32L0的UID首地址为0x1FF80050,采用如下方式可以读取3个字共96位的UID。. ]' J9 _5 P' ~! `

& g! g: t" U! M$ [- o3 c' N: y
  1.   #define UID_BASE 0x1FF80050( ~, c- d( X, z5 `: I
  2.   uint32_t UID[3];
    7 {* z+ Q0 `$ n' H
  3.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));/ [8 S( O; B& f
  4.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));
    / j8 O7 {, i$ {7 d9 W% A8 U4 z: j& B& s' R
  5.   UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
复制代码
* z6 y( }: t9 t( A- w5 V' w5 @9 P& G: E6 X

) ?" B( u* G- g* ^# r测试发现两片不同的STM32L031芯片,读出的UID是相同的!!
1 i, A7 ^) R9 a; |# l& D' W' p( ~% C4 b4 P0 R
HAL库读取
. W* h1 j; t: J7 b4 l& y  N1 W/ K直接采用HAL读取UID的库函数进行读取,HAL库支持如下的读取:
0 c4 p" [8 {8 o9 F+ o* U; z' T
  1. uint32_t HAL_GetHalVersion(void);$ Y! v/ G# f% M6 Y% s
  2. uint32_t HAL_GetREVID(void);
    : i0 ~. ~: t5 b/ Y* }: u
  3. uint32_t HAL_GetDEVID(void);
    ; f* m5 G  P6 V* w
  4. uint32_t HAL_GetUIDw0(void);8 _1 |! w2 o5 i/ i* z
  5. uint32_t HAL_GetUIDw1(void);
    * ~$ _* m" _+ P/ o) l
  6. uint32_t HAL_GetUIDw2(void);
复制代码
因此,读取代码如下:6 L2 `; }. L4 g
  1.   uint32_t UID[3];
      h8 Q' a7 u( s  j% I
  2.   UID[0] = HAL_GetUIDw0();
      x& u5 d$ l$ [+ V& N
  3.   UID[1] = HAL_GetUIDw1();
    " @- J6 a& i' G/ G& p1 u$ \4 Z
  4.   UID[2] = HAL_GetUIDw2();
复制代码
测试发现两片不同的STM32L031芯片,读出的UID是不同的!!
+ A: \) b: O+ H$ S  n: P2 B) M# v7 z1 R7 P1 f& Z- A; K' i
查找原因+ O5 }- O  N+ B+ v# u/ c7 P
对HAL_GetUIDw0(),HAL_GetUIDw1(), HAL_GetUIDw2()进行分析,发现:- }7 g, q7 {# N
. B" C+ g! {! }% o; O' a/ x! e
  1. uint32_t HAL_GetUIDw0(void)
    6 E! I7 t) H- W) j
  2. {4 V: w5 _& ]% X% J" I
  3.   return(READ_REG(*((uint32_t *)UID_BASE)));
    9 c- j- }1 G( D+ q8 z  y0 Q& ^) y/ j
  4. }
    ) C7 m* B; k( \2 w1 v5 g5 f
  5. uint32_t HAL_GetUIDw1(void)/ J, a" e$ d9 E- c, i
  6. {
    6 M7 k7 X& i$ V1 g9 y/ m& p
  7.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));3 G/ ]- q8 [' C* U* s) n; N
  8. }
    ; t; v" V7 \$ k9 }; u& Q, H
  9. uint32_t HAL_GetUIDw2(void)8 L( H. K; {- [' j, ]: d# c
  10. {5 W) R, M4 r3 u% v
  11.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));- o4 r, \: C; v$ [
  12. }
复制代码

3 h" T7 m4 I) b) V" O+ w问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:
* ?. t9 a$ E9 ?. f% _; _
  1.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
    0 f9 x4 q7 K. Q. O
  2.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));3 x0 I% H( n- L' c
  3.   UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 14)));
复制代码
/ R+ w+ c0 e' M& j
则读取UID正确.1 c' d) o9 R+ n) Q1 M

' d  A, Y! q4 {1 [
0 w& O1 y: j0 v; d- X0 C! ^1 A
收藏 评论0 发布时间:2021-11-17 23:02

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版