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

技术笔记 | 基于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辅助开发工具(辅助开发自定义板上应用)

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

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

USB线
2 * USB线
Type A ←→ Mini B
Type A  ←→  Micro B

STM32CubeMX
链接:
http://www.st.com/en/development-tools/stm32cubemx.html
说明:本文实现例中采用版本v4.28.0

Cube软件包
STM32CubeF4(1)
说明:在安装STM32CubeMX后,在其“菜单栏\Help\Install New Libraries”中安装STM32CubeF4.
本文实现例中采用的是V1.21.0

IDE
IAR (EWARM)
链接:
http://www.iar.com/
说明1:例中以IAR为例。
除IAR外,CubeMX还支持MDK、TrueStudio和SW4STM32等。
文本实现例中采用IAR v8.30.1

注1:STM32F469I-DISCO板的原理图、用户手册等资源可通过链接获取。
注2:STM32CubeF4可以按照介绍方式获取,或者直接在官网下载,然后通过STM32CubeMX从本地导入软件包功能完成导入。
02
应用实现
一、开发流程
结合STM32CubeMX的软件开发流程如下图。
5.jpg

二、开发步骤详解
接下来一步一步呈现实现过程。
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’,如下图所示。

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等。

12.jpg
6. 点击菜单栏\Project\Generate Code生成工程。
工程生成后,会出现提示框,点击"Open Project"打开工程。工程架构和文件结构如下图(右侧为USB主机应用架构)。生成工程包含全部层的实现,开发者在生成工程的基础上,可直接调用写读等API,实现对U盘的访问。

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时表示要激活)。

8.编译生成的应用固件。
利用IDE进行编译、链接、下载到目标板,实现U盘信息获取和读写操作。

检验验证
连接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等类支持。

收藏 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】的接口。

STM32的IC没有USB-HS的硬件,只提供了DMA的接口,真的要实现2.0高速,还要外加一个IC。
3111272 回答时间:2019-6-24 12:44:02
本帖最后由 3111272 于 2019-6-24 12:49 编辑

谢谢楼主的分享。
美中有一点小遗憾就是有几个图放大了看不是很清楚。
楼主文中提到了USB的时钟是48M,我现在学习H7中,发现H7的时钟树中有一个专门给USB提供时钟的内部时钟,是使用这个更好,还是通过其他时钟线来进行分频得到。 微信截图_20190624124038.png

另外就是,不需要在Middlewares中进行配置吗?

所属标签

相似分享

官网相关资源

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