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

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

[复制链接]
STMCU小助手 发布时间:2022-2-22 19:35
前言
$ C/ V- L1 S1 k7 [+ w/ G( [6 z一些应用中,涉及到对存储设备的数据访问,例如 uSD 卡、U 盘。具备 USB OTG 控制器的 STM32,可以实现对 U 盘访问的支持。本文介绍 STM32 对于 U 盘访问的硬件/软件实现。介绍如何利用 STM32CubeMX,一步一步实现 STM32 访问U 盘。仅需要简单的几个步骤, 实现 U 盘访问的应用开发。6 o% P3 D5 [8 @9 X
5 I) j) v* ]8 i6 [& g
一 MSC 类简介
% d) k9 z$ }- U9 BMSC (Mass Storage Class) 是 USB 规范提供的一种 USB 大容量存储设备类,允许一个 USB 接口的设备与 USB 主机相连接,以便在两者之间传输文件。USB MSC 传输协议分为 CBI (Control / Bulk / Interrupt) 和 BOT (Bulk-only Transfer)。BOT协议在不影响功能的情况下省去了对 Interrupt 端点的需求,被存储设备广泛支持。STM32 提供的 USB 库支持 USB MSCBOT 协议。
; i) ?+ B- s" e/ J, y3 ~MSC 设备包含很多种,例如 U 盘、读卡器、移动硬盘等。STM32 通过内含的 USB OTG 控制器(支持主机模式)和USB 主机库,实现对 MSC 类的支持,进而实现对 U 盘访问的支持。本文中不涉及到 USB MSC (Mass Storage Class) 的详细介绍 ,更多 MSC 类介绍,请参考《USB 进阶培训_Part1_USB 类的介绍》。
" N: [9 _: H+ Q5 v2 g9 J4 \! n  y! U; E5 V& F; d$ ]

; p( @7 |) b4 m, }# c0 Z- h( F9 @二 MSC 在 STM32 上的实现
- S+ G) l) T4 r8 t6 B2.1 硬件支持

) ^1 Z. p* j; u4 r不同的 STM32 系列,对 USB 的支持情况如下。对于 STM32F105/107、STM32F2、STM32F4、STM32F7 和STM32H7 系列,部分型号支持 USB OTG,能够实现 USB 主机和从机。U 盘作为 USB MSC 设备,需要 STM32 作为 USBMSC 主机,实现两者间的访问。(注:系列中不是所有型号都支持 OTG,以具体型号手册为准。)/ T# l/ a1 z( f+ B
/ U* Y, f  m8 @0 _  q
2E9A40[I]~AZOEHY7VN){VQ.png , x) H# o% y+ M% C8 o, E0 n
, u" h" _* ]' A7 r( g& H: {1 @
STM32 OTG 硬件电路图如下所示。CN3 为 USB 连接器。9 p% @6 c# G7 t
& j, q# N+ h! P8 g1 D
BCTUEFMIIZHV%G5H4DOORLG.png
2 Q! V6 S$ `8 H$ o6 w( Y9 y2 O- F, `$ G2 t
对于 STM32 OTG,配置为仅主机模式时,不需使用 OTG_ID,可将其引脚用于其他功能。并且在不使用 SRP (Session Request Protocol) 和 HNP (Host Negotiation Protocol) 时,可不连接 VBUS 至 PA9。电路简化如下图。
0 j  z$ h$ d% `) v4 u6 E
- g- k; w( e% O" f# U( E _GII](9LXD79`[7Y6A1(U}C.png * q- s( [2 {6 x- h, K
& `% Q, G, k. B3 L$ L
更多关于 STM32 USB 硬件设计,请参考《AN4879 USB hardware and PCB guidelines using STM32 MCUs》。& O0 ~3 p5 ]* N. F7 R

* b; }; ]- |: M+ c' T
; e6 V8 g- B8 X3 W1 M) m4 U2.2 软件支持
1 \+ K8 B1 r5 c" s5 T" HSTM32 拥有丰富的软件资源,推荐如下两个软件包:
" X. U8 m# V% ~, b. ?% d    STM32Cube 软件包(包含 USB/OTG 库,支持 MSC 协议)
( N# O3 ]/ |( C    STM32CubeMX 辅助开发工具(辅助开发自定义板上应用)1 h  `$ P/ g+ G7 ^
上述软件都是免费对外开发,可在意法半导体官网 www.st.com 下载。
6 ]; @6 ?3 R& z0 v- l
$ C  |( o. @4 I) W) N2 P3 u5 m. p8 ~% W; E4 v5 n
三 U 盘访问实现例
5 j7 S) ^- N$ s) ^# ]+ \% o7 Q
一步一步呈现访问 U 盘的 STM32 开发过程,实现对 U 盘的读写等操作。在下面的步骤详解中,会介绍一些主机库和应用机制的内容。如果希望快速开发,可以直接按照步骤开发,略过讲解性的内容。; c( ~; N" f5 _- O7 G) W
# \: O2 g( M; `3 z. i& D7 U
[8ZDT0EG_KYS)DS[3DXHSFJ.png
" h$ O/ X& l- e% h
9 s, C4 _# Y3 |- h" `/ s3.1 前期准备6 g: P( ?& u: K$ O  @# X
出于遵循完全一致的实验步骤考虑,实例基于 ST 发布的 STM32F469I-DISCO 板。除此之外,开发者也可以根据自己的目标板的具体情况,参考后面介绍的实例进行配置。% m3 X( n  w6 I
注 1:STM32F469I-DISCO 板的原理图、用户手册等资源可通过链接获取。
# f! i2 p, p0 f1 Q1 x7 n注 2:STM32CubeF4 可以按照介绍方式获取,或者直接在官网下载,然后通过 STM32CubeMX 的本地导入软件包功能+ p& z+ D" j1 n8 W+ W. o# \
完成导入。
; G8 u0 `. A) p7 V- h  Y. B# r$ ~8 M3 I. q/ F5 l
3.2 应用实现
4 l+ R+ m, }, a- `9 o! O3.2.1 开发流程
: ^" e. Q: Q9 Q: H. `
结合 STM32CubeMX 的软件开发流程如下图。2 o$ q& G5 z! D+ y

! u; n% |1 \5 ?+ ~% }. p1 P! m  K( G1 } 87943M[%$GGBY{9122N{%[H.png 0 P7 [* e2 [/ B  M

+ p1 p; U) K; I  Y3.2.2 开发步骤详解2 p2 i8 D0 K; X& D" P
接下来一步一步呈现实现过程。8 u+ n9 E$ S4 T5 a5 |8 o
1. 打开 STM32CubeMX,点击 File\New Project,选择 STM32F469NI(STM32F469I-DISCO 上微控制器型号)。
/ s. q* Y( I& W, i1 `2. 外设和中间件的选择。首先结合 STM32F469I-DISCO 板的原理图,了解功能实现必备的接口的使用情况,如下表所示。; o% `0 e7 A+ \  l0 J% U! Z
3 f* J' ~9 a$ u5 V4 T4 e+ W- G( X
4`3U(`MWG@M4VJ8K0@VT67H.png 4 J7 |8 x1 e5 r5 d* p. C( N, C
& Y/ S5 a0 d( g, t/ L
   注1. 在不考虑 SRP 和 HNP 时,访问 U 盘,只需要 STM32 的 USB OTG 的 USB 数据正负线即可。根据硬件情况,选择调试接口、外部时钟、USB OTG FS 和 USB 中间件,如下图所示。3 S7 y6 F4 ~6 |/ O- o/ D  A" R
+ N% {- }, @" F  B% n* g5 p
3362@B{612I%YWJ15D2I1.png
0 w2 D- U* ]% Q# s5 J; W  H7 F! ?2 q7 B$ @
   在引脚分布图,PB2 引脚上单击鼠标左键,选择 ‘GPIO_Output’,如下图所示。' t* t$ X' z$ b" |+ p5 [) b
& u5 E. ~  J; n( U" O2 }# t3 t" q
7IWZ@H2WJPF8`]YN2CK.png
9 F0 b1 |. j# O; ~! A; x+ X# w$ Y7 a
3. 配置时钟,使 USB 时钟为 48MHz,如下图。其中,步骤 2 中外部高速晶振值要和硬件上匹配。由于 USB 时钟精度要求高,STM32F469 内部时钟无法达到要求,必须选用外部高速时钟,如步骤 3 所示。对于 HCLK(处理器时钟,步骤 6 配置),根据性能需要进行设置,或者简单的设置为最大值。- |) ~8 C9 T- B" u, ^* Q

) F- u" P0 A- Y2 c; p TPSKKGJWJ7G45A`6}JO_VMS.png " n; Q3 k+ A$ p8 G% L* u

3 |3 G# c3 q6 P3 a; j: ~5 v  A4. USB 和关联的引脚配置。主要对 VBUS 使能引脚进行配置及关联。$ \: e* W: z* @% y% \8 j
   在 USB_HOST 界面,配置 Drive_VBUS_FS 关联引脚为 PB2(与硬件连接对应)。VBUS 电源开关器件为STMPS2151STR,高电平使能。所以配置如下,在初始化后为低电平(图中步骤 7~10)。其他保持默认。
. F; }. H+ |0 t. q" |& z8 m$ x/ c3 t6 o, D- A
ZZZ`]T]8QI6PZP@EF0R`Y{M.png 2 I3 Q% J7 a5 k$ ]
. p9 f: r3 Y$ F, U" D( L5 q5 Q
5. 设置工程,如下图所示(点击菜单栏\Project\Settings 打开)。选择对应的 IDE 和希望基于的 STM32Cube 软件包位置。实例简单,堆栈占用小,堆栈配置保持默认即可。除 EWARM 外,STM32CubeMX 还支持 MDK-ARM、TrueStudio、SW4STM32 等。1 [  J, _" }$ b" w, ?& m

; s$ h  s3 A$ p+ d% F Q6{0(U$_I{5L6Q6R`7I$}0X.png
" q. S( Z$ n9 k8 I$ I. I9 W
2 _$ m$ T: ~" r' |6. 点击菜单栏\Project\Generate Code 生成工程。: a8 G, x: |) M$ e
   工程生成后,会出现提示框,点击 ‘Open Project’打开工程。工程架构和文件结构如下图(右侧为 USB 主机应用架构)。生成工程包含全部层的实现,开发者在生成工程的基础上,可直接调用写读等 API,实现对 U 盘的访问。  D5 |: |9 F6 b; Z

( j" D9 f8 X7 C. [ N{Y%RTWO3`R{Y3}92KSE5.png . k- k- D+ @; a: J6 D1 F
; Y! z/ q8 I2 [3 E
   注: USB 主机库和各文件功能介绍,请参考《UM1720 STM32Cube USB host library》。
/ u9 `6 _- A9 i9 h5 ?! D7. 添加 U 盘访问实现。
; ^) `( W2 `: ^2 L* \: i  s: X   STM32CubeMX 生成的工程,调用 STM32Cube USB 主机库。在库中,软核将 USB 事件传输至用户层,并执行回调用户函数。方便在用户层的回调函数中添加应用实现。用户回调事件如下表。4 r3 A  z. P8 K7 C) m+ P/ R9 L
1 X. Y/ h) o2 P. A% P1 {3 y% T
_7}QMRUFS])YVLO6WKO0_85.png   t( l; y& U/ Q1 O) [8 {7 p2 b

5 O! V8 e* N5 }: Z! x3 v9 S   USB 软核状态机如下图所示。
0 l$ a  j2 }# F4 D! _) ~5 Z
& l5 Q9 g2 |0 `5 C 6}VU4A`P)4B@@@Z9Z]ZAPQO.png
5 y# d, P" T" Q3 F$ q" {5 r4 L% ~  ?, C' w. H0 c
   在 HOST_CLASS 状态中,软核会通知应用类初始化完成。对 U 盘的访问,应放置在应用层接收到类初始化完成事件后,即 HOST_USER_CLASS_ACTIVE 事件后,否则无法正常工作。" Q% _1 t2 a* d" {0 p
   在工程中添加/修改对 U 盘的写读访问操作和相关源码,如下表所示。
0 _' J) O. a; T# B  |! {  
1 t3 n& L3 T  T Q4~6YNWS]3%EM[42[Y5VLHV.png
& c  ^( }  F; p CRBDS47{[9CPKS%~5A~9LNV.png ! U) Y& Q3 ]" ]1 [  F
99P@R2MR]X%{@~DSNEH]SGM.png 8 m% `+ V( z3 ]( w

9 S" d7 K" w# n6 m4 b* f6 y0 e. `- z8 G/ P7 `# Y
注1. 省略号为了表示还有其他没有改动部分的源码,不用添加进源码中。展现的源码为了更好的表现出对应工程中位置,包含一些生成工程时原有的源码。
% b& P  {& v- V  F% Y$ ^注2. MX_DriverVbusFS()中,需要根据实际情况进行配置。实验板上采用的电源开关 STMPS2151STR 高电平有效。在一些系列 STM32 的生成工程中,MX_DriverVbusFS 函数原型已经生成,此时无需再添加这个函数的声明,但要确认函数中引脚设置对应关系(形参为 1 时表示要激活)。
. \( d9 D: T! \4 F3 n5 s% H) I$ r' F# `8. 编译生成的应用固件。
% j% b, R7 H$ q4 [3 S" w' s2 x; P6 {利用 IDE 进行编译、链接、下载到目标板,实现 U 盘信息获取和读写操作。
2 ~, U( i4 u+ w, g3 t
: x4 g4 H; E8 K. o
3 R  i+ m5 h$ C8 |, @四 测试&验证* ~' n' E! h8 [* N, P7 G3 k
连接 U 盘至 STM32F469I-DISCO 板的 USB_User 连接口。IAR 进入在线调试模式,利用在线调试,查看获取到的 U 盘信息和写读缓存中的数据情况。
+ m# w& N% w; g& U' Q* r2 N; U运行完毕后,连接 U 盘至 PC,利用 PC 上安装的 Active@ Disk Editor(外部链接)查看 U 盘对应扇区数据(10 扇区对应起始位置为 5120),从而验证 U 盘信息获取和写读功能正常。如下图所示。
0 c: O& a8 b1 f6 v% D( I' f+ W; S3 ^% [5 f
]M1NT)IF)7Z9BDB168TKE0E.png
5 _- z9 |& M+ R7 m9 w# s* y% @6 I. Q3 h3 _8 L6 |: F# g
; j( r' D8 v7 y. r; e0 z* q( U5 \! T( z
五 小结/ ]7 |# }4 L5 w! G
STM32CubeMX 加速了 STM32 的开发过程。即使类似 USB 这种复杂的外设使用,也可以如上述实现例,只需要几个步骤即可以实现 USB 应用。并且提供了除 MSC 类之外,HID、UAC、CDC 等类支持# F+ N7 }) _& [3 a) M

# f! L  C9 U8 S8 ?+ c, B
' u, z* `, E2 o( O8 r: n6 p: |# x& _# N3 Z* `8 m, b4 m
' ~1 P" C7 \. v$ U5 ^
7 h# G' f8 a3 \' x2 a& s4 k

# z. N. s  X/ D- K( H$ \( O8 T# z/ _' ]0 C1 V# T9 I2 n# V

; [1 W! d# @- A/ [+ C3 `* a: P. x( |
3 Y' t9 W! v. i/ d% q
: P% I$ J( k. d3 E- w. ~! E' ~8 O- S$ V: W5 N* i
( K3 m$ f4 G, @, E& Y- k9 b) \% k; K

# s; Q% W' K% K2 W' ~4 \3 h- @. ^% o; K3 i- i! ?- l9 ?

$ q' C: S# X: m3 E
2 X! l/ S; ^# M' w1 e# }( B1 G" U9 S0 P

" P+ m9 `$ X2 G, Q" S: V: q7 I+ k2 S  Q" n" [
8 y, s9 [; _+ t

* b6 y6 o7 g. s# v* j
2 h  G/ P4 h7 ^: U* O, E) E+ U
赞 收藏 评论0 发布时间:2022-2-22 19:35

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版