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

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

[复制链接]
STMCU小助手 发布时间:2021-11-17 23:02
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 _
  1.   #define UID_BASE 0x1FF80050
    8 J1 d# l! d. _: q% L
  2.   uint32_t UID[3];* h* a  e, p8 p1 M; {( D
  3.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
    % Z2 d6 A1 S7 C4 E
  4.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));8 q& g) s( S. j4 ?  }
  5.   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, {
  1. uint32_t HAL_GetHalVersion(void);
    ) X8 D7 B+ L( E" C
  2. uint32_t HAL_GetREVID(void);
    , Z' B' c# W8 U5 A) i
  3. uint32_t HAL_GetDEVID(void);
    6 Z7 h1 Z' ?7 |
  4. uint32_t HAL_GetUIDw0(void);. N) N' F/ U+ K1 R% B
  5. uint32_t HAL_GetUIDw1(void);
    6 }3 u! N9 ^# n$ m) |" Z, f0 E
  6. uint32_t HAL_GetUIDw2(void);
复制代码
因此,读取代码如下:
" A# S3 M1 W0 r$ q( J) {7 f- B- {
  1.   uint32_t UID[3];
    1 S" F2 y+ d2 t8 U
  2.   UID[0] = HAL_GetUIDw0();8 L3 H: c! ^  c* Q3 r$ l' m4 j
  3.   UID[1] = HAL_GetUIDw1();
    . P. a$ ?+ i1 C0 P" z& @3 }
  4.   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 ]
  1. uint32_t HAL_GetUIDw0(void)
    ) X3 C4 E/ U: \6 ?) l
  2. {
    : E2 b( p4 `" R
  3.   return(READ_REG(*((uint32_t *)UID_BASE)));
    : Y5 u0 T, n& o9 w
  4. }
      V0 ]" w1 ~1 m- T/ y7 T5 ]
  5. uint32_t HAL_GetUIDw1(void)) E1 G, B$ L6 A$ O: a
  6. {
    ' [" I% v% k# X  q
  7.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));
    3 m# F" L0 c3 S/ j4 C. v0 P
  8. }
    8 u# e% J/ b- |/ `! |6 m
  9. uint32_t HAL_GetUIDw2(void)
    - [; j, \. V1 ~2 D4 \+ u! c
  10. {
    $ `8 I: ^% @9 t/ o4 F4 R
  11.   return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));  H0 O- c; F( I. n/ q
  12. }
复制代码

5 S  h* M; ]0 R2 _# P问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:1 G+ r( w/ K5 O1 d( @9 k
  1.   UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
    * V. O4 ~1 [- w
  2.   UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));* H3 T3 [, w- I+ V; r" G5 C
  3.   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 [
收藏 评论0 发布时间:2021-11-17 23:02

举报

0个回答

所属标签

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