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

技术笔记 | 基于STM32CubeMX开发U盘访问应用

[复制链接]
eefishing 发布时间:2019-6-21 12:46
一些应用中,涉及到对存储设备的数据访问,例如USD卡、U盘。具备USB OTG控制器的STM32,可以实现对U盘访问的支持。本文介绍STM32对于U盘访问的硬件/软件实现。介绍如何利用STM32CubeMX,一步一步实现STM32访问U盘。仅需简单的几个步骤, 实现U盘访问的应用开发。
MSC类简介
MSC (Mass Storage Class) 是USB规范提供的一种USB大容量存储设备类,允许一个USB接口的设备与USB主机相连接,以便在两者之间传输文件。USB MSC传输协议分为CBI (Control / Bulk / Interrupt) 和 BOT (Bulk-only Transfer)。BOT协议在不影响功能的情况下省去了对Interrupt端点的需求,被存储设备广泛支持。STM32提供的USB库支持USB MSC BOT协议。
MSC设备包含很多种,例如U盘、读卡器、移动硬盘等。STM32通过内含的USB OTG控制器(支持主机模式)和USB主机库,实现对MSC类的支持,进而实现对U盘访问的支持。本文中不涉及到USB MSC (Mass Storage Class) 的详细介绍 ,更多MSC类介绍,请参考《USB进阶培训_Part1_USB类的介绍》。
MSC在STM32上的实现
01
硬件支持
不同的STM32系列,对USB的支持情况如下。对于STM32F105/107、STM32F2、STM32F4、STM32F7和STM32H7系列,部分型号支持USB OTG,能够实现USB 主机和从机。U盘作为USB MSC设备,需要STM32作为USB MSC主机,实现两者间的访问。(注:系列中不是所有型号都支持OTG,以具体型号手册为准。)
1.jpg
STM32 OTG硬件电路图如下所示。CN3为USB连接器。
2.jpg
对于STM32 OTG,配置为仅主机模式时,不需使用OTG_ID,可将其引脚用于其他功能。并且在不使用SRP (Session Request Protocol) 和HNP (Host Negotiation Protocol) 时,可不连接VBUS至PA9。电路简化如下图。
3.jpg
更多关于STM32 USB硬件设计,请参考《AN4879 USB hardware and PCB guidelines using STM32 MCUs》。
02
软件支持
STM32拥有丰富的软件资源,推荐如下两个软件包:
  • STM32Cube软件包(包含USB/OTG库,支持MSC协议)
  • STM32CubeMX辅助开发工具(辅助开发自定义板上应用)

    , {4 Q! u$ U0 |4 x3 s8 }$ p! |2 v
上述软件都是免费对外开发,可在意法半导体官网www.st.com下载。
U盘访问实现例
一步一步呈现访问U盘的STM32开发过程,实现对U盘的读写等操作。在下面的详解步骤中,会介绍一些主机库和应用机制的内容。如果希望快速开发,可以直接按照步骤开发,略过讲解性的内容。
4.jpg
01
前期准备

& i1 H. \/ t! }+ v6 q
出于遵循完全一致的实验步骤考虑,实例基于ST发布的STM32F469I-DISCO板。除此之外,开发者也可以根据自己的目标板的具体情况,参考后面介绍的实例进行配置。
STM32板
STM32F469I-DISCO链接(2):
http://www.st.com/en/evaluation-tools/32f469idiscovery.html

" |; f  ], K! }9 R
USB线
2 * USB线
Type A ←→ Mini B
Type A  ←→  Micro B
( d4 N: g7 `+ k4 H
STM32CubeMX
链接:
http://www.st.com/en/development-tools/stm32cubemx.html
说明:本文实现例中采用版本v4.28.0

7 T, n6 X# l, y; f- ^7 d
Cube软件包
STM32CubeF4(1)
说明:在安装STM32CubeMX后,在其“菜单栏\Help\Install New Libraries”中安装STM32CubeF4.
本文实现例中采用的是V1.21.0
% ^4 R) }& I7 Q1 N+ D9 b
IDE
IAR (EWARM)
链接:
http://www.iar.com/
说明1:例中以IAR为例。
除IAR外,CubeMX还支持MDK、TrueStudio和SW4STM32等。
文本实现例中采用IAR v8.30.1
4 @8 g  r) x0 D0 @: a
注1:STM32F469I-DISCO板的原理图、用户手册等资源可通过链接获取。
注2:STM32CubeF4可以按照介绍方式获取,或者直接在官网下载,然后通过STM32CubeMX从本地导入软件包功能完成导入。
02
应用实现
一、开发流程
结合STM32CubeMX的软件开发流程如下图。
5.jpg
# m4 y( d5 f3 d: Q( A
二、开发步骤详解
接下来一步一步呈现实现过程。
1.打开STM32CubeMX,点击File\New Project,选择STM32F469NI(STM32F469I-DISCO板上微控制器型号)。
2.外设和中间件的选择。首先结合STM32F469I-DISCO板的原理图,了解功能实现必备的接口的使用情况,如下表所示。
6.jpg
注1.  在不考虑SRP和HNP时,访问U盘,只需要STM32的USB OTG的USB数据正负线即可。
根据硬件情况,选择调试接口、外部时钟、USB OTG FS和USB中间件,如下图所示。
7.jpg
在引脚分布图,PB2引脚上单击鼠标左键,选择 ‘GPIO_Output’,如下图所示。

1 d/ K0 T, o$ {! o+ w5 K
8.jpg
3. 配置时钟,使USB时钟为48MHz,如下图。其中,步骤2中外部高速晶振值要和硬件上匹配。由于USB时钟精度要求高,STM32F469内部时钟无法达到要求,必须选用外部高速时钟,如步骤3所示。对于HCLK(处理器时钟,步骤6配置),根据性能需要进行设置,或者简单的设置为最大值。
9.jpg
4. USB和关联的引脚配置。主要对VBUS使能引脚进行配置及关联。
在USB_HOST界面,配置Drive_VBUS_FS关联引脚为PB2(与硬件连接对应)。VBUS电源开关器件为STMPS2151STR,高电平使能。所以配置如下,在初始化后为低电平(图中步骤7~10)。其他保持默认。
11.jpg
5.设置工程,如下图所示(点击菜单栏\Project\Settings打开)。选择对应的IDE和希望基于的STM32Cube软件包位置。实例简单,堆栈占用小,堆栈配置保持默认即可。除EWARM外,STM32CubeMX还支持MDK-ARM、TrueStudio、SW4STM32等。
& c" ~' x+ c4 u' M4 K7 a, z
12.jpg
6. 点击菜单栏\Project\Generate Code生成工程。
工程生成后,会出现提示框,点击"Open Project"打开工程。工程架构和文件结构如下图(右侧为USB主机应用架构)。生成工程包含全部层的实现,开发者在生成工程的基础上,可直接调用写读等API,实现对U盘的访问。

; u! P' V5 J) p$ Z4 o
13.jpg
注: USB主机库和各文件功能介绍,请参考《UM1720 STM32Cube USB host library》。
7. 添加U盘访问实现。
STM32CubeMX生成的工程,调用STM32Cube USB主机库。在库中,软核将USB事件传输至用户层,并执行回调用户函数。方便在用户层的回调函数中添加应用实现。用户回调事件如下表。
14.jpg
USB软核状态机如下图所示。
15.jpg
在HOST_CLASS状态中,软核会通知应用类初始化完成。对U盘的访问,应放置在应用层接收到类初始化完成事件后,即HOST_USER_CLASS_ACTIVE事件后,否则无法正常工作。
在工程中添加/修改对U盘的写读访问操作和相关源码,如下表所示。
16.jpg
注1:省略号为了表示还有其他没有改动部分的源码,不用添加进源码中。展现的源码为了更好的表现出对应工程中位置,包含一些生成工程时原有的源码。
注2:MX_DriverVbusFS()中,需要根据实际情况进行配置。实验板上采用的电源开关STMPS2151STR高电平有效。在一些系列STM32的生成工程中,MX_DriverVbusFS函数原型已经生成,此时无需再添加这个函数的声明,但要确认函数中引脚设置对应关系(形参为1时表示要激活)。

) q& I: S! a, B- q4 h1 h, l# p
8.编译生成的应用固件。
利用IDE进行编译、链接、下载到目标板,实现U盘信息获取和读写操作。

4 R4 S5 l. u) g4 m3 O6 ]: Y" z0 j& @
检验验证
连接U盘至STM32F469I-DISCO板的USB_User连接口。IAR进入在线调试模式,利用在线调试,查看获取到的U盘信息和写读缓存中的数据情况。
运行完毕后,连接U盘至PC,利用PC上安装的Active@ Disk Editor(外部链接)查看U盘对应扇区数据(10扇区对应起始位置为5120),从而验证U盘信息获取和写读功能正常。如下图所示。
17.jpg
总结
STM32CubeMX加速了STM32的开发过程。即使类似USB这种复杂的外设使用,也可以如上述实例,只需要几个步骤即可以实现USB应用。并且提供了除MSC类之外,HID、UAC、CDC等类支持。

% h  u. J' j5 w5 `6 P  x, I9 u
收藏 3 评论4 发布时间:2019-6-21 12:46

举报

4个回答
五哥1 回答时间:2019-6-21 19:21:36
谢谢分享
s_f_tan 回答时间:2019-6-21 21:41:16
谢谢,但是还没有弄清内部关系
radio2radio 回答时间:2019-6-21 22:26:35
楼主没有说清楚如何开发【高速USB2.0】的接口。
5 ~6 e/ S/ q5 f8 R$ n: R9 E1 s
. y8 K" i5 g5 Q7 U% J; PSTM32的IC没有USB-HS的硬件,只提供了DMA的接口,真的要实现2.0高速,还要外加一个IC。
3111272 回答时间:2019-6-24 12:44:02
本帖最后由 3111272 于 2019-6-24 12:49 编辑 + N7 N9 X% E8 w8 E

. h+ R: w% `9 ]$ p1 w谢谢楼主的分享。' F0 W% O8 u! e7 s. s  [2 Y. B; |
美中有一点小遗憾就是有几个图放大了看不是很清楚。
* p( ?5 E; S% w5 L: R: q楼主文中提到了USB的时钟是48M,我现在学习H7中,发现H7的时钟树中有一个专门给USB提供时钟的内部时钟,是使用这个更好,还是通过其他时钟线来进行分频得到。 微信截图_20190624124038.png
: A* |' m$ }8 ^9 G' D5 `4 }  s* ~2 e3 x: Z# z  ?# D1 q- W
另外就是,不需要在Middlewares中进行配置吗?& L- o* g. A& B& U4 m# Y

所属标签

相似分享

官网相关资源

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