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

【经验分享】基于 STM32CubeMX 开发 U 盘访问应用

[复制链接]
STMCU小助手 发布时间:2022-2-22 19:35
前言
  \5 P7 C1 k$ {. n2 v3 l7 V% v一些应用中,涉及到对存储设备的数据访问,例如 uSD 卡、U 盘。具备 USB OTG 控制器的 STM32,可以实现对 U 盘访问的支持。本文介绍 STM32 对于 U 盘访问的硬件/软件实现。介绍如何利用 STM32CubeMX,一步一步实现 STM32 访问U 盘。仅需要简单的几个步骤, 实现 U 盘访问的应用开发。
! q$ z  ^+ S, P" W$ m, {# F; X( C! T
一 MSC 类简介% F. H$ {1 z3 }+ [
MSC (Mass Storage Class) 是 USB 规范提供的一种 USB 大容量存储设备类,允许一个 USB 接口的设备与 USB 主机相连接,以便在两者之间传输文件。USB MSC 传输协议分为 CBI (Control / Bulk / Interrupt) 和 BOT (Bulk-only Transfer)。BOT协议在不影响功能的情况下省去了对 Interrupt 端点的需求,被存储设备广泛支持。STM32 提供的 USB 库支持 USB MSCBOT 协议。, m: y4 K8 u# t: a; d* I/ ^
MSC 设备包含很多种,例如 U 盘、读卡器、移动硬盘等。STM32 通过内含的 USB OTG 控制器(支持主机模式)和USB 主机库,实现对 MSC 类的支持,进而实现对 U 盘访问的支持。本文中不涉及到 USB MSC (Mass Storage Class) 的详细介绍 ,更多 MSC 类介绍,请参考《USB 进阶培训_Part1_USB 类的介绍》。3 w0 [4 O  J; L& q( K

" Z' e+ L$ _& E1 E
. N( P  c% [; f, p# m/ S8 E二 MSC 在 STM32 上的实现
/ p9 o3 O3 I$ O2.1 硬件支持

$ ^, u1 D/ s! x- }# s* Y: k不同的 STM32 系列,对 USB 的支持情况如下。对于 STM32F105/107、STM32F2、STM32F4、STM32F7 和STM32H7 系列,部分型号支持 USB OTG,能够实现 USB 主机和从机。U 盘作为 USB MSC 设备,需要 STM32 作为 USBMSC 主机,实现两者间的访问。(注:系列中不是所有型号都支持 OTG,以具体型号手册为准。)
' N1 l- K) H) I
1 G' A: w. R6 H& g: _/ d& e 2E9A40[I]~AZOEHY7VN){VQ.png
. N  U8 H3 w( p* `* h2 T  H* B8 C: ]2 c2 i- f+ Z
STM32 OTG 硬件电路图如下所示。CN3 为 USB 连接器。: |5 B  P# y2 C1 ~. _' u1 A
: J+ u5 s+ C9 G) Z
BCTUEFMIIZHV%G5H4DOORLG.png
: O% K7 F" A0 t! }, O! f6 G  K; m. H! c% M
对于 STM32 OTG,配置为仅主机模式时,不需使用 OTG_ID,可将其引脚用于其他功能。并且在不使用 SRP (Session Request Protocol) 和 HNP (Host Negotiation Protocol) 时,可不连接 VBUS 至 PA9。电路简化如下图。
0 v& k5 D2 a3 ^  ?
* n/ o( w: B2 ?! _8 h" F7 _$ O _GII](9LXD79`[7Y6A1(U}C.png 7 j6 _1 I' q$ m$ J

& E, L5 X* p$ W  d$ s% r& T$ Z' ~更多关于 STM32 USB 硬件设计,请参考《AN4879 USB hardware and PCB guidelines using STM32 MCUs》。/ F7 d0 M4 X* U' D8 c6 i4 N
2 C  J$ F) O: J! }' ]: y- q( \
, l4 d/ P5 h) z+ m% V3 f  G. \* H
2.2 软件支持8 b. B6 E' D: S5 e# @. B
STM32 拥有丰富的软件资源,推荐如下两个软件包:
& k( z* c' a+ n* D) n    STM32Cube 软件包(包含 USB/OTG 库,支持 MSC 协议)
- _, B4 u8 ]* U; _/ ]6 h' }    STM32CubeMX 辅助开发工具(辅助开发自定义板上应用). G* _9 H3 ^- E( V, j- \
上述软件都是免费对外开发,可在意法半导体官网 www.st.com 下载。2 L8 M5 t5 E9 y2 S" }9 N- B; e6 \
+ x4 ]! |; L5 J

, Q' u5 [* p# a, ]三 U 盘访问实现例

% v: J/ C) ~1 }2 K, f+ u) z一步一步呈现访问 U 盘的 STM32 开发过程,实现对 U 盘的读写等操作。在下面的步骤详解中,会介绍一些主机库和应用机制的内容。如果希望快速开发,可以直接按照步骤开发,略过讲解性的内容。
0 P3 S0 J+ f2 X% Z$ ?4 h/ S5 @$ Z. Z4 F$ }$ ?( n+ a
[8ZDT0EG_KYS)DS[3DXHSFJ.png
! x$ q4 v% }  O( w
* {7 J" d5 h) r2 m4 F, y3.1 前期准备4 A+ g& F6 {% h$ w2 X
出于遵循完全一致的实验步骤考虑,实例基于 ST 发布的 STM32F469I-DISCO 板。除此之外,开发者也可以根据自己的目标板的具体情况,参考后面介绍的实例进行配置。
7 N* R$ p* [, {4 g- i5 Q注 1:STM32F469I-DISCO 板的原理图、用户手册等资源可通过链接获取。9 T! J7 S& I; S0 _
注 2:STM32CubeF4 可以按照介绍方式获取,或者直接在官网下载,然后通过 STM32CubeMX 的本地导入软件包功能
3 ?% k) h: ^& |4 R) T完成导入。
) D% V" i% [) i7 e  u1 J; P3 \# J
, e4 J2 k8 i" b" a8 k3.2 应用实现
# _+ E' {0 w3 n6 w% `3.2.1 开发流程

8 `2 ^' c' p/ W: F9 y5 P结合 STM32CubeMX 的软件开发流程如下图。
5 y1 n2 l: g7 t5 \1 g6 z) |: E0 n. a! p" R
87943M[%$GGBY{9122N{%[H.png
* F3 \/ ~5 c" {6 A; Y# B1 f
+ L8 H% `. t5 z4 y3.2.2 开发步骤详解: m& J' Z( g" f- Z/ m7 G
接下来一步一步呈现实现过程。
) u6 p4 g1 p$ r) E6 L5 B5 f1. 打开 STM32CubeMX,点击 File\New Project,选择 STM32F469NI(STM32F469I-DISCO 上微控制器型号)。; P, `4 K: S, v8 o1 x4 E6 Y
2. 外设和中间件的选择。首先结合 STM32F469I-DISCO 板的原理图,了解功能实现必备的接口的使用情况,如下表所示。
2 x! c: q: E1 U! P
$ g+ Y! u! U2 B! k0 D+ Z: e 4`3U(`MWG@M4VJ8K0@VT67H.png / |9 v  ]6 o- o+ |$ s8 q5 Q
1 i" A  a9 Q* r% b: `' y
   注1. 在不考虑 SRP 和 HNP 时,访问 U 盘,只需要 STM32 的 USB OTG 的 USB 数据正负线即可。根据硬件情况,选择调试接口、外部时钟、USB OTG FS 和 USB 中间件,如下图所示。
8 A; A" ~9 p, A# E" @1 H& s: c6 P# n$ j# A% E* J/ O
3362@B{612I%YWJ15D2I1.png
9 B- W; z5 r# ^1 A1 S1 V  k& x% L* k6 Y5 F! }4 j( @8 N
   在引脚分布图,PB2 引脚上单击鼠标左键,选择 ‘GPIO_Output’,如下图所示。3 o4 [4 w3 \# n6 a/ L
+ S7 }5 H8 ?, Z$ K4 p0 i
7IWZ@H2WJPF8`]YN2CK.png 9 F) O( n. U) X- N

; Z1 ]6 g* `6 ?* v& q3. 配置时钟,使 USB 时钟为 48MHz,如下图。其中,步骤 2 中外部高速晶振值要和硬件上匹配。由于 USB 时钟精度要求高,STM32F469 内部时钟无法达到要求,必须选用外部高速时钟,如步骤 3 所示。对于 HCLK(处理器时钟,步骤 6 配置),根据性能需要进行设置,或者简单的设置为最大值。- ?4 ^' ]' D) C- r
5 S3 X" C. V7 O& Q! y2 w9 C
TPSKKGJWJ7G45A`6}JO_VMS.png
4 p1 [, E) s% ?& |: `* u1 B. t. v6 U; x, V$ M/ \/ c* _; L
4. USB 和关联的引脚配置。主要对 VBUS 使能引脚进行配置及关联。
: d$ Z6 T0 U( Z! Z& u/ w, h   在 USB_HOST 界面,配置 Drive_VBUS_FS 关联引脚为 PB2(与硬件连接对应)。VBUS 电源开关器件为STMPS2151STR,高电平使能。所以配置如下,在初始化后为低电平(图中步骤 7~10)。其他保持默认。
: a' ~# e  r+ {* V; |3 R8 E5 U
- a' ^- X3 ?/ o2 x3 M ZZZ`]T]8QI6PZP@EF0R`Y{M.png ' t/ f* C* U/ q/ g
$ |' q. ]. t, |; U' g/ n
5. 设置工程,如下图所示(点击菜单栏\Project\Settings 打开)。选择对应的 IDE 和希望基于的 STM32Cube 软件包位置。实例简单,堆栈占用小,堆栈配置保持默认即可。除 EWARM 外,STM32CubeMX 还支持 MDK-ARM、TrueStudio、SW4STM32 等。
& T- \+ T/ j$ E9 \1 z1 m: s0 ]: c2 x/ I& A) H1 x  F7 c
Q6{0(U$_I{5L6Q6R`7I$}0X.png ' d# H. q% W6 H3 s

" f" P5 d7 j4 k7 m+ }* T6. 点击菜单栏\Project\Generate Code 生成工程。
) K8 p- \9 G" P8 ]) Z   工程生成后,会出现提示框,点击 ‘Open Project’打开工程。工程架构和文件结构如下图(右侧为 USB 主机应用架构)。生成工程包含全部层的实现,开发者在生成工程的基础上,可直接调用写读等 API,实现对 U 盘的访问。
' l) N* H. b3 l$ s
" S7 G! J6 ?5 h1 i! p N{Y%RTWO3`R{Y3}92KSE5.png 9 M  {$ T8 W# p2 H8 t" u/ w5 t

! f" i+ X: u2 q1 S/ S: p   注: USB 主机库和各文件功能介绍,请参考《UM1720 STM32Cube USB host library》。( v* ~% a1 K8 x8 s& u
7. 添加 U 盘访问实现。
1 F# o& Y7 |0 N/ }7 f   STM32CubeMX 生成的工程,调用 STM32Cube USB 主机库。在库中,软核将 USB 事件传输至用户层,并执行回调用户函数。方便在用户层的回调函数中添加应用实现。用户回调事件如下表。
8 G5 q8 I! X! ]5 E+ d' r7 X& Q4 [! n# N9 ^" ]# v( s9 }
_7}QMRUFS])YVLO6WKO0_85.png
. D& b; L  H* @9 A( X8 O5 b
3 z- u6 K0 p3 L7 r6 J   USB 软核状态机如下图所示。
  j0 z; b, x) ^/ m) F9 t! R; O6 d8 q) g, @
6}VU4A`P)4B@@@Z9Z]ZAPQO.png
/ Y4 D& N. T7 E0 e4 M# H3 G: ]" b; L  k% e0 O$ \
   在 HOST_CLASS 状态中,软核会通知应用类初始化完成。对 U 盘的访问,应放置在应用层接收到类初始化完成事件后,即 HOST_USER_CLASS_ACTIVE 事件后,否则无法正常工作。& o7 |! [: ~/ [: A+ a6 E0 b. M% {
   在工程中添加/修改对 U 盘的写读访问操作和相关源码,如下表所示。7 ^& \- R5 {, b! w
  
9 y* Z' I& R+ `  |" O' V$ g0 L Q4~6YNWS]3%EM[42[Y5VLHV.png : M. A3 j- B/ {. \6 x( E- [* S
CRBDS47{[9CPKS%~5A~9LNV.png
! P3 K$ w2 F$ `) J8 p! f 99P@R2MR]X%{@~DSNEH]SGM.png
4 @- |8 i' {" a7 ], w
6 K. n3 y8 b* K- }1 m
1 p2 W* `1 r! j! r' f注1. 省略号为了表示还有其他没有改动部分的源码,不用添加进源码中。展现的源码为了更好的表现出对应工程中位置,包含一些生成工程时原有的源码。' i- @; C3 [  ~$ @6 }
注2. MX_DriverVbusFS()中,需要根据实际情况进行配置。实验板上采用的电源开关 STMPS2151STR 高电平有效。在一些系列 STM32 的生成工程中,MX_DriverVbusFS 函数原型已经生成,此时无需再添加这个函数的声明,但要确认函数中引脚设置对应关系(形参为 1 时表示要激活)。1 ?/ Y% @: F- ^( @
8. 编译生成的应用固件。
" E# S+ G) d. _利用 IDE 进行编译、链接、下载到目标板,实现 U 盘信息获取和读写操作。1 @4 w! T+ m' O& E

) G/ V; W/ X: T& o7 k9 ]( P+ x+ Q. Z0 G& b5 w% e8 N! V9 j
四 测试&验证
. W0 e0 W3 W7 E) A- t连接 U 盘至 STM32F469I-DISCO 板的 USB_User 连接口。IAR 进入在线调试模式,利用在线调试,查看获取到的 U 盘信息和写读缓存中的数据情况。$ C, h/ y$ i, Y  v# W9 ^3 f1 h! k
运行完毕后,连接 U 盘至 PC,利用 PC 上安装的 Active@ Disk Editor(外部链接)查看 U 盘对应扇区数据(10 扇区对应起始位置为 5120),从而验证 U 盘信息获取和写读功能正常。如下图所示。
; `6 `$ N" y& e
! o. _5 m8 K! R8 u# t0 g ]M1NT)IF)7Z9BDB168TKE0E.png , k* z- E+ v0 Y

: Y5 K+ r7 O; M' s) h$ G: |/ p! m( y  T# m  H0 L4 Y+ I
五 小结
* z6 r* p; y$ g6 GSTM32CubeMX 加速了 STM32 的开发过程。即使类似 USB 这种复杂的外设使用,也可以如上述实现例,只需要几个步骤即可以实现 USB 应用。并且提供了除 MSC 类之外,HID、UAC、CDC 等类支持; c1 x* x; E' n$ `0 w0 Y
/ a4 i6 p( i0 X! u
. S% Z" ]  F( l0 s; |. n

- X) Y) P5 e# z# }
) j  z5 u0 U6 x; [6 p" h
( V& U9 U' w) _: n2 g. U4 i2 O$ v5 i$ S+ a: B% e5 k! p
7 g5 m7 V6 o! b8 M. _8 G! Y
% o+ v% z2 W0 f

( r- S1 b2 t: A/ o* j' H, t& c6 {8 [- n

) D+ }* i. E' Q' Z  h2 M6 [* m; i3 @8 Q3 ^+ L1 m; I* X

0 Z( V' v% R4 M. L
6 O2 Z  P5 E; n$ }" l9 |" J" A  {) S# H% r$ Z' L  V; L
' W% i0 B5 q( a8 v( V
! X- u# ?$ V% D. D4 E) o- m

: K1 q- W7 r# u
& M' _% w) ?4 A4 X# E2 Q- m( a6 I4 V5 N8 b  V0 Q
* k+ u. Q7 C) [3 r, M. u* ?$ K

' J  z. U$ L+ q* g. j7 k
收藏 评论0 发布时间:2022-2-22 19:35

举报

0个回答

所属标签

相似分享

官网相关资源

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