一些应用中,涉及到对存储设备的数据访问,例如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类的介绍》。
01
硬件支持
不同的stm32系列,对usb的支持情况如下。对于stm32f105/107、stm32f2、stm32f4、stm32f7和stm32h7系列,部分型号支持usb otg,能够实现usb 主机和从机。u盘作为usb msc设备,需要stm32作为usb msc主机,实现两者间的访问。(注:系列中不是所有型号都支持otg,以具体型号手册为准。)
stm32 otg硬件电路图如下所示。cn3为usb连接器。
对于stm32 otg,配置为仅主机模式时,不需使用otg_id,可将其引脚用于其他功能。并且在不使用srp (session request protocol) 和hnp (host negotiation protocol) 时,可不连接vbus至pa9。电路简化如下图。
更多关于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盘的读写等操作。在下面的详解步骤中,会介绍一些主机库和应用机制的内容。如果希望快速开发,可以直接按照步骤开发,略过讲解性的内容。
01
前期准备
出于遵循完全一致的实验步骤考虑,实例基于st发布的stm32f469i-disco板。除此之外,开发者也可以根据自己的目标板的具体情况,参考后面介绍的实例进行配置。
★
stm32板
usb线
2 * usb线
type a ←→ mini b
type a ←→ micro b
stm32cubemx
cube软件包
stm32cubef4(1)
说明:在安装stm32cubemx后,在其“菜单栏\help\install new libraries”中安装stm32cubef4.
本文实现例中采用的是v1.21.0
ide
iar (ewarm)
除iar外,cubemx还支持mdk、truestudio和sw4stm32等。
文本实现例中采用iar v8.30.1
注1:stm32f469i-disco板的原理图、用户手册等资源可通过链接获取。
注2:stm32cubef4可以按照介绍方式获取,或者直接在官网下载,然后通过stm32cubemx从本地导入软件包功能完成导入。
02
应用实现
一、开发流程
结合stm32cubemx的软件开发流程如下图。
二、开发步骤详解
接下来一步一步呈现实现过程。
1.打开stm32cubemx,点击file\new project,选择stm32f469ni(stm32f469i-disco板上微控制器型号)。
2.外设和中间件的选择。首先结合stm32f469i-disco板的原理图,了解功能实现必备的接口的使用情况,如下表所示。
注1. 在不考虑srp和hnp时,访问u盘,只需要stm32的usb otg的usb数据正负线即可。
根据硬件情况,选择调试接口、外部时钟、usb otg fs和usb中间件,如下图所示。
在引脚分布图,pb2引脚上单击鼠标左键,选择‘gpio_output’,如下图所示。
3. 配置时钟,使usb时钟为48mhz,如下图。其中,步骤2中外部高速晶振值要和硬件上匹配。由于usb时钟精度要求高,stm32f469内部时钟无法达到要求,必须选用外部高速时钟,如步骤3所示。对于hclk(处理器时钟,步骤6配置),根据性能需要进行设置,或者简单的设置为最大值。
4. usb和关联的引脚配置。主要对vbus使能引脚进行配置及关联。
在usb_host界面,配置drive_vbus_fs关联引脚为pb2(与硬件连接对应)。vbus电源开关器件为stmps2151str,高电平使能。所以配置如下,在初始化后为低电平(图中步骤7~10)。其他保持默认。
5.设置工程,如下图所示(点击菜单栏\project\settings打开)。选择对应的ide和希望基于的stm32cube软件包位置。实例简单,堆栈占用小,堆栈配置保持默认即可。除ewarm外,stm32cubemx还支持mdk-arm、truestudio、sw4stm32等。
6. 点击菜单栏\project\generate code生成工程。
工程生成后,会出现提示框,点击open project打开工程。工程架构和文件结构如下图(右侧为usb主机应用架构)。生成工程包含全部层的实现,开发者在生成工程的基础上,可直接调用写读等api,实现对u盘的访问。
注: usb主机库和各文件功能介绍,请参考《um1720 stm32cube usb host library》。
7. 添加u盘访问实现。
stm32cubemx生成的工程,调用stm32cube usb主机库。在库中,软核将usb事件传输至用户层,并执行回调用户函数。方便在用户层的回调函数中添加应用实现。用户回调事件如下表。
usb软核状态机如下图所示。
在host_class状态中,软核会通知应用类初始化完成。对u盘的访问,应放置在应用层接收到类初始化完成事件后,即host_user_class_active事件后,否则无法正常工作。
在工程中添加/修改对u盘的写读访问操作和相关源码,如下表所示。
注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盘信息获取和写读功能正常。如下图所示。
总结
stm32cubemx加速了stm32的开发过程。即使类似usb这种复杂的外设使用,也可以如上述实例,只需要几个步骤即可以实现usb应用。并且提供了除msc类之外,hid、uac、cdc等类支持。
中国首款肌肉外甲问世,是一种新型穿戴机器人设备
国内新建锂盐项目进展“追踪”
技术融合是发展关键,国内VR产业发展速度将加快
国星光电告诉你led专利才是LED企业竞争的核武器
消费类和家用电器用PCB
STM32对于U盘访问的硬件/软件实现
手机投屏到电视的5种方法
S7-1500有关组态控制的重要信息简析
开关电源之非同步控制器的仿真
乐檬K12系列即将上市:配备6000mAh超大电池
什么是RDRAM传输标准
荣耀Magic Vs发布:智展新境,卓尔不凡
2010全球搜索引擎营销大会杭州站即将拉开帷幕
谷歌申请新专利 穿上VR鞋子即可体验在虚拟世界中行走的感觉
一文解析支持 NFC 的传感器架构
简述中国汽车工业简史
边缘计算在物联网领域的应用及发展前景
如何减少无铅阵列封装中的空洞?
晶圆代工业者在2019年第一季就面临着相当严峻的挑战
PPG信号采集系统设计方案