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

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

[复制链接]
STMCU小助手 发布时间:2022-2-22 19:35
前言
, Y8 V) U) u' h1 n一些应用中,涉及到对存储设备的数据访问,例如 uSD 卡、U 盘。具备 USB OTG 控制器的 STM32,可以实现对 U 盘访问的支持。本文介绍 STM32 对于 U 盘访问的硬件/软件实现。介绍如何利用 STM32CubeMX,一步一步实现 STM32 访问U 盘。仅需要简单的几个步骤, 实现 U 盘访问的应用开发。
# A/ t4 ]0 g) H1 ]1 C$ H# ~
( }) G( r' l3 J, Z/ p5 _) ]! }一 MSC 类简介
3 s4 l' e9 i* m# T( t7 rMSC (Mass Storage Class) 是 USB 规范提供的一种 USB 大容量存储设备类,允许一个 USB 接口的设备与 USB 主机相连接,以便在两者之间传输文件。USB MSC 传输协议分为 CBI (Control / Bulk / Interrupt) 和 BOT (Bulk-only Transfer)。BOT协议在不影响功能的情况下省去了对 Interrupt 端点的需求,被存储设备广泛支持。STM32 提供的 USB 库支持 USB MSCBOT 协议。' Z$ |  g2 M# ]# z  l% V# _
MSC 设备包含很多种,例如 U 盘、读卡器、移动硬盘等。STM32 通过内含的 USB OTG 控制器(支持主机模式)和USB 主机库,实现对 MSC 类的支持,进而实现对 U 盘访问的支持。本文中不涉及到 USB MSC (Mass Storage Class) 的详细介绍 ,更多 MSC 类介绍,请参考《USB 进阶培训_Part1_USB 类的介绍》。# v  R  L" A3 h, f$ q: q0 t6 v
( `) M1 S, ~3 u& C7 F5 h6 @

% K2 u; A7 O4 I4 \" b- O二 MSC 在 STM32 上的实现- N9 G. D' q& E1 G
2.1 硬件支持
! T; _' F1 B. W9 h
不同的 STM32 系列,对 USB 的支持情况如下。对于 STM32F105/107、STM32F2、STM32F4、STM32F7 和STM32H7 系列,部分型号支持 USB OTG,能够实现 USB 主机和从机。U 盘作为 USB MSC 设备,需要 STM32 作为 USBMSC 主机,实现两者间的访问。(注:系列中不是所有型号都支持 OTG,以具体型号手册为准。)
0 S; @& @/ G6 G' I9 H3 ^/ P8 Q8 I6 Y5 L+ e5 x
2E9A40[I]~AZOEHY7VN){VQ.png
. g1 E* ~, Z1 r- g- D/ k: J1 ^) B0 h1 i$ V* P( ~
STM32 OTG 硬件电路图如下所示。CN3 为 USB 连接器。- u7 l9 L7 e  K- j, B/ o

0 v; e( p) Q' ~- a9 t, l# p BCTUEFMIIZHV%G5H4DOORLG.png & L- k& [/ J, I" C( B, q8 N9 d0 j9 Z0 s
! |- \: ^. c7 W; X& h# B
对于 STM32 OTG,配置为仅主机模式时,不需使用 OTG_ID,可将其引脚用于其他功能。并且在不使用 SRP (Session Request Protocol) 和 HNP (Host Negotiation Protocol) 时,可不连接 VBUS 至 PA9。电路简化如下图。; {7 x- l2 c9 Y# Y1 r& M0 @" o" m% Y

+ I; h6 d6 N; x# N  y* B1 { _GII](9LXD79`[7Y6A1(U}C.png
; n& k: A6 h; E  Z, P
3 ]3 c$ }8 \/ `% |) c# f) {1 g5 ]更多关于 STM32 USB 硬件设计,请参考《AN4879 USB hardware and PCB guidelines using STM32 MCUs》。
8 F  O/ g: A' A" O' S3 V0 b. u6 K: X9 {

" J% j/ L7 _3 e* X) ]2 n5 i  W" y2.2 软件支持
: n9 S9 J' l0 q& c8 S* U: o  D. `" N& PSTM32 拥有丰富的软件资源,推荐如下两个软件包:
8 W. l2 i6 g+ y* q    STM32Cube 软件包(包含 USB/OTG 库,支持 MSC 协议)9 y7 q7 M& d' [- y+ T! N
    STM32CubeMX 辅助开发工具(辅助开发自定义板上应用)8 i- B9 n  B& B1 C6 T8 D0 R
上述软件都是免费对外开发,可在意法半导体官网 www.st.com 下载。
% n- U" }/ F+ h. S
5 [0 C7 B; L2 a; `0 T2 s9 d* }) G( r2 S" p$ }+ a) l3 F! V
三 U 盘访问实现例

+ C! n% D3 I( M5 l5 D! m一步一步呈现访问 U 盘的 STM32 开发过程,实现对 U 盘的读写等操作。在下面的步骤详解中,会介绍一些主机库和应用机制的内容。如果希望快速开发,可以直接按照步骤开发,略过讲解性的内容。
8 O7 R! y% W) g1 R( i
. j9 L4 F' z* Z" `# A* L [8ZDT0EG_KYS)DS[3DXHSFJ.png 2 d. y, o2 f8 k  U# a" O

! R* l* }) A3 Q+ U, x) T3.1 前期准备
9 Y7 @! Q4 ^% l+ y! x5 a; U+ X; ?1 X出于遵循完全一致的实验步骤考虑,实例基于 ST 发布的 STM32F469I-DISCO 板。除此之外,开发者也可以根据自己的目标板的具体情况,参考后面介绍的实例进行配置。5 C0 l* W# |6 E& i
注 1:STM32F469I-DISCO 板的原理图、用户手册等资源可通过链接获取。% j+ y1 F$ P8 W# d8 `) I+ }
注 2:STM32CubeF4 可以按照介绍方式获取,或者直接在官网下载,然后通过 STM32CubeMX 的本地导入软件包功能
: a4 ]0 [+ _$ x完成导入。
& q& |. t% d) x# r* b+ `2 o& x& D, ~' F: \8 ]) M
3.2 应用实现
4 O& P+ J1 i; P4 M8 c7 n3.2.1 开发流程
9 _) Y  v# l) i& P: J5 O9 Y
结合 STM32CubeMX 的软件开发流程如下图。" d! y' Q" W5 h* f! {
. d1 \* w! }5 \9 X0 a, ^8 X
87943M[%$GGBY{9122N{%[H.png * @* s1 t9 G8 }2 V

  H" i4 y* v$ d: E) v3 h3 s5 U3.2.2 开发步骤详解0 N/ i# F% k( A, r. T
接下来一步一步呈现实现过程。
$ k, u6 ^4 h- w5 i1. 打开 STM32CubeMX,点击 File\New Project,选择 STM32F469NI(STM32F469I-DISCO 上微控制器型号)。# U0 J) {$ y% s, \
2. 外设和中间件的选择。首先结合 STM32F469I-DISCO 板的原理图,了解功能实现必备的接口的使用情况,如下表所示。9 @% C' M3 s2 G& _
: K! D9 D4 _8 S' z
4`3U(`MWG@M4VJ8K0@VT67H.png ' H: D7 U- e. U+ A, O: H

: M0 ~, \' {7 t# G9 H   注1. 在不考虑 SRP 和 HNP 时,访问 U 盘,只需要 STM32 的 USB OTG 的 USB 数据正负线即可。根据硬件情况,选择调试接口、外部时钟、USB OTG FS 和 USB 中间件,如下图所示。
- [3 ^$ S" K# ^4 k: D" G. X) p
5 g) p  d# s4 |- e/ \ 3362@B{612I%YWJ15D2I1.png
3 d3 A0 X3 c0 r' z" n$ W; i1 Y! C  f' m5 X/ T
   在引脚分布图,PB2 引脚上单击鼠标左键,选择 ‘GPIO_Output’,如下图所示。
, {& t5 _" {  \
7 a" B' `- L" H( ? 7IWZ@H2WJPF8`]YN2CK.png ( J) E+ D' F; s5 |

# G& a- M: D3 h2 l" p) e4 {3. 配置时钟,使 USB 时钟为 48MHz,如下图。其中,步骤 2 中外部高速晶振值要和硬件上匹配。由于 USB 时钟精度要求高,STM32F469 内部时钟无法达到要求,必须选用外部高速时钟,如步骤 3 所示。对于 HCLK(处理器时钟,步骤 6 配置),根据性能需要进行设置,或者简单的设置为最大值。# N; ?7 U9 x) N. ^0 S- p, w

+ D  j- `# Z! j' L; R( n TPSKKGJWJ7G45A`6}JO_VMS.png ( j4 T5 h$ N2 K! p2 t0 I

9 E8 g+ N# _; _0 O+ D9 v% p2 p4. USB 和关联的引脚配置。主要对 VBUS 使能引脚进行配置及关联。
0 r6 n. c9 e. V# I' C   在 USB_HOST 界面,配置 Drive_VBUS_FS 关联引脚为 PB2(与硬件连接对应)。VBUS 电源开关器件为STMPS2151STR,高电平使能。所以配置如下,在初始化后为低电平(图中步骤 7~10)。其他保持默认。9 A- S% n5 }& a+ |5 C: e
0 d( ?% {- r5 ?) [% X& v% q8 ?
ZZZ`]T]8QI6PZP@EF0R`Y{M.png : |! c  U& B9 N$ o% f
- t; ~5 x1 ?! f' c) Z% B* y
5. 设置工程,如下图所示(点击菜单栏\Project\Settings 打开)。选择对应的 IDE 和希望基于的 STM32Cube 软件包位置。实例简单,堆栈占用小,堆栈配置保持默认即可。除 EWARM 外,STM32CubeMX 还支持 MDK-ARM、TrueStudio、SW4STM32 等。' M1 O) T$ P/ x( d

" l3 o+ M, G7 t  ]. ?; {; n Q6{0(U$_I{5L6Q6R`7I$}0X.png
5 b, W' M! ^, c; Y* F' p/ w2 l7 v
6. 点击菜单栏\Project\Generate Code 生成工程。5 l+ e- m. g6 T$ y6 r4 o# r
   工程生成后,会出现提示框,点击 ‘Open Project’打开工程。工程架构和文件结构如下图(右侧为 USB 主机应用架构)。生成工程包含全部层的实现,开发者在生成工程的基础上,可直接调用写读等 API,实现对 U 盘的访问。
$ v- u0 s2 V, \; [) s7 ^  H6 W. X" z7 U) R! P# T
N{Y%RTWO3`R{Y3}92KSE5.png
( \; b2 U8 `0 j& P6 e8 g3 d; d7 ^( A! X
   注: USB 主机库和各文件功能介绍,请参考《UM1720 STM32Cube USB host library》。! `8 F2 m& `5 ?! O2 ?) C& [$ ~
7. 添加 U 盘访问实现。
. R# Q2 V5 n$ _$ X   STM32CubeMX 生成的工程,调用 STM32Cube USB 主机库。在库中,软核将 USB 事件传输至用户层,并执行回调用户函数。方便在用户层的回调函数中添加应用实现。用户回调事件如下表。" K# T! B1 n6 {- k3 ]
+ x; [5 }+ n" l( C
_7}QMRUFS])YVLO6WKO0_85.png ' `* ^2 i2 P3 I: h# W  g
$ c6 e# \3 ?& g6 e
   USB 软核状态机如下图所示。
/ u3 F3 ~# P: j# Z2 ?: t! z5 W3 W& l. E8 }3 H& p1 j
6}VU4A`P)4B@@@Z9Z]ZAPQO.png 8 I9 t" D+ @  ]# _1 e$ N) U
7 U- H9 f4 \# ?) q8 ~% H9 R
   在 HOST_CLASS 状态中,软核会通知应用类初始化完成。对 U 盘的访问,应放置在应用层接收到类初始化完成事件后,即 HOST_USER_CLASS_ACTIVE 事件后,否则无法正常工作。
- M) z' X5 @9 ~   在工程中添加/修改对 U 盘的写读访问操作和相关源码,如下表所示。
2 }, {. @; C( t. }' q, T8 y  ; R; X" J. V% k4 i8 ?
Q4~6YNWS]3%EM[42[Y5VLHV.png ; C! X1 s+ C( j
CRBDS47{[9CPKS%~5A~9LNV.png
# \6 b* }; ?1 K( e' [$ F 99P@R2MR]X%{@~DSNEH]SGM.png 4 O) o1 c, i  O# U, N4 s
& g* |5 y1 r# i

& m3 c. _+ V& U7 z注1. 省略号为了表示还有其他没有改动部分的源码,不用添加进源码中。展现的源码为了更好的表现出对应工程中位置,包含一些生成工程时原有的源码。- U8 c( p2 a8 f. Y0 I% X% P
注2. MX_DriverVbusFS()中,需要根据实际情况进行配置。实验板上采用的电源开关 STMPS2151STR 高电平有效。在一些系列 STM32 的生成工程中,MX_DriverVbusFS 函数原型已经生成,此时无需再添加这个函数的声明,但要确认函数中引脚设置对应关系(形参为 1 时表示要激活)。
$ Y1 p. {; |. ~% e8. 编译生成的应用固件。- }6 b# `# S, w& ~) H
利用 IDE 进行编译、链接、下载到目标板,实现 U 盘信息获取和读写操作。. N$ F( u. G& h6 E) I8 s2 X1 A4 U
0 Q& p) c" z3 a$ q5 K
* w, }% I  y0 ~8 N! q. M" C
四 测试&验证
1 _& s1 B9 i* X9 `) h连接 U 盘至 STM32F469I-DISCO 板的 USB_User 连接口。IAR 进入在线调试模式,利用在线调试,查看获取到的 U 盘信息和写读缓存中的数据情况。
. ^$ _0 t0 e0 c; Y5 v运行完毕后,连接 U 盘至 PC,利用 PC 上安装的 Active@ Disk Editor(外部链接)查看 U 盘对应扇区数据(10 扇区对应起始位置为 5120),从而验证 U 盘信息获取和写读功能正常。如下图所示。
. {6 H- |, `" H: R( d4 O+ i( U* W0 M* U
]M1NT)IF)7Z9BDB168TKE0E.png 6 u$ v3 M- l9 O' j5 t6 A2 K! u, G7 l
" _) h! G5 W7 ~' y' t2 s  f
9 u  G) A- e- G7 k0 h) D# u
五 小结( f- r1 g$ d' e7 g( J
STM32CubeMX 加速了 STM32 的开发过程。即使类似 USB 这种复杂的外设使用,也可以如上述实现例,只需要几个步骤即可以实现 USB 应用。并且提供了除 MSC 类之外,HID、UAC、CDC 等类支持6 c" j: o0 B2 o: t2 W" ]; ~
& k6 n2 H  g* m

& h8 P4 E: j& r& u9 {9 m# g  b8 k. K+ O
8 h: w# [* W4 }3 P  x7 J/ u4 p
$ J% g" {. f# ]
. k$ O5 \, y7 W0 ]" m9 n: F. }

( O4 B4 D0 O$ ~6 x- H  a# A0 y
% a0 E2 b4 ]1 v/ N3 x) X
$ Y1 i4 P  p' ^! j# H% s& n7 y' G: ]% Z; x& B7 a: Q

4 f% l1 f  r, M# e! {
, Z( O+ o+ J$ N  c( ^" O: |' {- s; U/ F: Y8 y  T! O$ A

/ E- N  w! @" s4 C! Q( v" p8 y' j1 A6 g6 [+ c

/ T9 @+ o+ F* P8 M) E( d  X  `5 d. Y* T; _

! U$ P/ x& I+ U( i* A9 ^) @; V7 c2 d7 C1 M7 T4 ~
# ~* R5 J3 P9 P7 h# R
/ p1 |4 q" f* V& H

( G+ J, L8 ^+ k" Z
收藏 评论0 发布时间:2022-2-22 19:35

举报

0个回答

所属标签

相似分享

官网相关资源

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