一些应用中,涉及到对存储设备的数据访问,例如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 (57.15 KB, 下载次数: 5)

2019-6-21 12:45 上传

STM32 OTG硬件电路图如下所示。CN3为USB连接器。

2.jpg (56.81 KB, 下载次数: 5)

2019-6-21 12:45 上传

对于STM32 OTG,配置为仅主机模式时,不需使用OTG_ID,可将其引脚用于其他功能。并且在不使用SRP (Session Request Protocol) 和HNP (Host Negotiation Protocol) 时,可不连接VBUS至PA9。电路简化如下图。

3.jpg (40.52 KB, 下载次数: 6)

2019-6-21 12:45 上传

更多关于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 (32.54 KB, 下载次数: 5)

2019-6-21 12:45 上传

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 (57.5 KB, 下载次数: 5)

2019-6-21 12:45 上传

二、开发步骤详解

接下来一步一步呈现实现过程。

1.打开STM32CubeMX,点击File\New Project,选择STM32F469NI(STM32F469I-DISCO板上微控制器型号)。

2.外设和中间件的选择。首先结合STM32F469I-DISCO板的原理图,了解功能实现必备的接口的使用情况,如下表所示。

6.jpg (64.3 KB, 下载次数: 5)

2019-6-21 12:45 上传

注1.  在不考虑SRP和HNP时,访问U盘,只需要STM32的USB OTG的USB数据正负线即可。

根据硬件情况,选择调试接口、外部时钟、USB OTG FS和USB中间件,如下图所示。

7.jpg (66.15 KB, 下载次数: 5)

2019-6-21 12:45 上传

在引脚分布图,PB2引脚上单击鼠标左键,选择 ‘GPIO_Output’,如下图所示。

8.jpg (115.42 KB, 下载次数: 5)

2019-6-21 12:45 上传

3. 配置时钟,使USB时钟为48MHz,如下图。其中,步骤2中外部高速晶振值要和硬件上匹配。由于USB时钟精度要求高,STM32F469内部时钟无法达到要求,必须选用外部高速时钟,如步骤3所示。对于HCLK(处理器时钟,步骤6配置),根据性能需要进行设置,或者简单的设置为最大值。

9.jpg (113.53 KB, 下载次数: 5)

2019-6-21 12:45 上传

4. USB和关联的引脚配置。主要对VBUS使能引脚进行配置及关联。

在USB_HOST界面,配置Drive_VBUS_FS关联引脚为PB2(与硬件连接对应)。VBUS电源开关器件为STMPS2151STR,高电平使能。所以配置如下,在初始化后为低电平(图中步骤7~10)。其他保持默认。

11.jpg (76.86 KB, 下载次数: 8)

2019-6-21 12:45 上传

5.设置工程,如下图所示(点击菜单栏\Project\Settings打开)。选择对应的IDE和希望基于的STM32Cube软件包位置。实例简单,堆栈占用小,堆栈配置保持默认即可。除EWARM外,STM32CubeMX还支持MDK-ARM、TrueStudio、SW4STM32等。

12.jpg (82.78 KB, 下载次数: 5)

2019-6-21 12:45 上传

6. 点击菜单栏\Project\Generate Code生成工程。

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

13.jpg (107.91 KB, 下载次数: 5)

2019-6-21 12:45 上传

注: USB主机库和各文件功能介绍,请参考《UM1720 STM32Cube USB host library》。

7. 添加U盘访问实现。

STM32CubeMX生成的工程,调用STM32Cube USB主机库。在库中,软核将USB事件传输至用户层,并执行回调用户函数。方便在用户层的回调函数中添加应用实现。用户回调事件如下表。

14.jpg (71.6 KB, 下载次数: 5)

2019-6-21 12:45 上传

USB软核状态机如下图所示。

15.jpg (81.52 KB, 下载次数: 5)

2019-6-21 12:45 上传

在HOST_CLASS状态中,软核会通知应用类初始化完成。对U盘的访问,应放置在应用层接收到类初始化完成事件后,即HOST_USER_CLASS_ACTIVE事件后,否则无法正常工作。

在工程中添加/修改对U盘的写读访问操作和相关源码,如下表所示。

16.jpg (229.33 KB, 下载次数: 8)

2019-6-21 12:45 上传

注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 (138.43 KB, 下载次数: 5)

2019-6-21 12:45 上传

总结

STM32CubeMX加速了STM32的开发过程。即使类似USB这种复杂的外设使用,也可以如上述实例,只需要几个步骤即可以实现USB应用。并且提供了除MSC类之外,HID、UAC、CDC等类支持。

cubemx 读卡器_技术笔记 | 基于STM32CubeMX开发U盘访问应用相关推荐

  1. 不显示表头_技术干货 | 基于数模混合型SoC实现的两线制高精度无源表头方案

    摘要: 针对传统的两线制表头在高低温环境下测量精度差.温漂大的特点,现提出一种可满足高低温环境使用需求的两线制高精度数显表头设计方案,此方案在高低温环境下测量精度高.工作稳定.抗干扰能力强. 引言 随 ...

  2. springboot增删改查案例_大神基于SpringBoot开发一个Restful服务,实现增删改查功能...

    前言 在去年的时候,在各种渠道中略微的了解了SpringBoot,在开发web项目的时候是如何的方便.快捷.但是当时并没有认真的去学习下,毕竟感觉自己在Struts和SpringMVC都用得不太熟练. ...

  3. 基于python的图像处理的毕业论文_个人毕业设计基于python开发的图像论文34646.doc...

    word文档可自由复制编辑 本科生毕业论文(设计) 题目:基于python开发的图像 采集器之Airppt 学 部 学科门类 专 业 基于python开发的图像采集器之Airppt 摘 要 装订 装 ...

  4. linux修改时间_技术干货||基于Centos8的Linux简单入门学习笔记

    很基础 以后不想记笔记了 最后分享一次

  5. 鱼骨图分析法实际案例_技术前沿 | 基于鱼骨图分析标准实施偏差成因的应用研究...

       引言    标准在实施过程中,难免会因为各种主客观原因导致难以落地的情况,分析标准执行偏差,开展问题成因分析,从而有针对性地制定一套有效的问题整改措施和预防措施,是一件很有价值.很有意义的创造性 ...

  6. sql 拆分_技术分享 | 基于分布式中间件的SQL改造指南

    原创作者: 孙正方 4月12日,GOPS全球运维大会在深圳隆重召开,全球运维大会是国内第一个运维行业大会,爱可开源社区在基础架构及DevOps解决方案专场分享了<基于分布式中间件的SQL改造指南 ...

  7. 图像缩放算法_技术专栏|基于无人机LK光流算法的适用性及其优化方法探究

    点击上方蓝字关注我们 问题描述 ◆ ◆ ◆ 一般的LK光流算法存在一个比较明显的局限性.我们知道,一般的LK光流算法必须包含三个假设: (1)亮度恒定: (2)时间连续或者运动是小运动: (3)空间一 ...

  8. 基于python的搜索引擎论文_技术分享 - 基于python构建搜索引擎系列——(四)检索模型...

    构建好倒排索引之后,就可以开始检索了. 检索模型有很多,比如向量空间模型.概率模型.语言模型等.其中最有名的.检索效果最好的是基于概率的BM25模型. 给定一个查询Q和一篇文档d,d对Q的BM25得分 ...

  9. 银行客户用户画像_技术分享 | 基于数据中台的银行客户画像体系构建

    背景 1.金融消费行为的改变,企业无法接触到客户 80后.90后总计3.4亿人口,日益成为金融企业主要的消费者,但是他们的金融消费习惯正在改变,他们不愿意到金融网点办理业务,不喜欢被动接受金融产品和服 ...

最新文章

  1. 用XML反序列化快速完成ASP.NET配置文件
  2. C# socket编程实践——支持广播的简单socket服务器
  3. Python--高阶学习笔记
  4. 没写client,想先测试server端怎么办?
  5. java调python报错Cannot create PyString with non-byte value
  6. python 累加_对Python实现累加函数的方法详解
  7. Socket Tools的使用
  8. 怎样解决CMD命令行窗口中文乱码问题
  9. 斯坦福的《机器学习》课程上线了
  10. git 进阶系列教程--tag
  11. PHP合并多个PDF文件
  12. 从GraalVM到Quarkus系列-B002篇-Quarkus中的字节码框架gizmo
  13. Elliptic Labs进入奥斯陆证券交易所主板上市名单
  14. python图像的几何运算_《计算机视觉》中的几何变换:Python示例的直观解释
  15. 分布式存储开发:Curve中的内存管理
  16. java最大值最小值_java算法-最大值、最小值
  17. C# Event?.Invoke() 是什么意思
  18. SSM框架之Mybatis同时传入多个对象及普通参数
  19. VB中给UInt32,UShort以16进制方式赋值编译不通过
  20. csdn怎么提问问题?

热门文章

  1. netty自定义封包实现
  2. VS2010用OLEDB连接Access
  3. 应用安全开发之浅谈加密算法的坑
  4. 推箱子小游戏自制100关,有兴趣可以试一试。(头文件和源文件分开)游戏截图已发。
  5. GITHUB设置代理——解决git clone下载过慢的问题
  6. 如何在中国知网上查询最新的学术期刊的级别?
  7. 太阳能电池技术新突破,眼镜也能当充电器
  8. 【001】GitHub新手入门
  9. 一款Mac轻便的记事本软件Microsoft To Do
  10. 基于51单片机的温度检测报警系统