如何在STM32上实现USB主机读写U盘文件

发布者:轻松自在最新更新时间:2023-09-05 来源: elecfans关键字:STM32  USB 手机看文章 扫描二维码
随时随地手机看文章

在项目应用中,经常会有对外交换数据的需求。USB接口读写U盘无疑是一种颇为方便的选择。在这一篇中,我们就来讨论如何在STM32上实现USB主机读写U盘文件的方法。


1、应用概述

  在我们的产品上有这样一个需求,希望通过大容量的U盘存取数据。我们来分析一下这个需求的具体内容。


  首先在硬件上我们需要有相应的USB端口,这一点在产品设计时就已经考虑并实现,所以硬件方面我们就不再过多的表述。

  其次我们需要为这个USB的硬件接口编写驱动,就是实现USB端口的底层操作,如IO配置、终端处理等,这是移植的主要工作。

  再者我们需要移植面向大容量存储的USB Host库,这也是我们需要做的工作之一。其实USB主机库本身并不需要我们做什么,但我们要清楚它需要我们提供些什么。

  最后我们还要实现一个应用层操作,它将用于实现我们的读写数据的最终目标。在开发过程中这其实是重点工作,但在这篇文章中他不是重点。我们主要是要实现USB主机库面向大容量存储设备的移植问题。


2、USB库的移植

  在这个产品中使用的是STM32F407作为控制单元,所以我们使用STM32的USB主机库来实现。接下来就看一看STM32的USB主机库移植问题。我们使用STM32CubeMX来实现USB的相关配置。

  第一步,我们来配置USB的连接端口,我们连接中找到USB_OTG_FS,在右侧的选项中选择Host_Only,如下图所示:

  然后在Middleware中找到USB_HOST,并在右侧“Class for FS IP”中选择“Mass Storage Host Class”配置为大容量存储设备。如下图所示:

  接着在Middleware中找到FATFS,并在右侧选中“USB Disk”。下方的参数中,将CODE_PAGE设置为简体中文。具体如下图所示:

  最后需要在终端中将USB的全局中断选中,并设定中断级别,具体如下图所示:

  中断必须打开,中断级别可以根据需要设置。中断会监测USB的状态,所以中断不打开,USB库无法工作。完成上述配置后就可以生成源码了,然后在此基础上进一步开发。

  对于STM32的USB主机库的移植有两个文件是必须要写的,就是usbh_conf.c和usbh_conf.h文件。这两个文件文件实现USB的基础配置,以及库需要调用的基础函数。在我们使用STM32CubeMX来配置和建立项目时,usbh_conf.c和usbh_conf.h文件也一并生成好了,不需要我们再去单独编写这些平台相关的函数。

3、应用实现

  因为使用STM32CubeMX来配置和建立项目的缘故,使得USB主机库的移植非常简单,但我们还需要编写应用层的代码。应用层代码主要实现两个方面的内容:一是编写主机库需要回调的获取USB状态的函数;二是轮询处理主机库中的USBH_Process函数以及我们需要处理的工作。

  首先来看应用处理回调函数。这个函数是主机库所要求的,用于处理与用户应用相关的操作,这个函数的原型如下:

  void (*pUsrFunc)(USBH_HandleTypeDef *phost, uint8_t id)

  如果我们的操作比较简单,我们可以在这个函数中直接完成,在测试时比骄傲方便,在复杂一点的应用中不建议这么做。在这里我们实现这个函数如下:


/* USB应用处理回调函数 */

static void USBH_UserProcess (USBH_HandleTypeDef *phost, uint8_t id)

{

  

  switch(id)

  {

  case HOST_USER_SELECT_CONFIGURATION:

    break;

    

  case HOST_USER_DISCONNECTION:

    Appli_state = APPLICATION_DISCONNECT;

    break;

    

  case HOST_USER_CLASS_ACTIVE:

    Appli_state = APPLICATION_READY;

    break;

    

  case HOST_USER_CONNECTION:

    Appli_state = APPLICATION_START;

    break;

    

  default:

    break;

  }

}

  我们还需要轮询USBH_Process函数并处理我们的应用任务,如读写文件操作等。我们在这一函数中,先调用USBH_Process函数,然后根据当前的状态来决定应处理的工作。在这里,我们希望在USB检测到U盘准备好后对齐进行读写操作,所以我们实现如下:


/* USB通讯数据处理 */

void McUsbDataProcess(void)

{

  /* USB 主机过程:应在主循环中调用,运行主机协议栈 */

  USBH_Process(&hUsbHostFS);

  

  switch(Appli_state)

  {

  case APPLICATION_START:

    {

      break;

    }

  case APPLICATION_READY:

    {

      MSC_Application();

      Appli_state = APPLICATION_IDLE;

      break;

    }

  case APPLICATION_DISCONNECT:

    {

      break;

    }

  case APPLICATION_IDLE:

    {

      break;

    }

  default:

    {

      break; 

    }

  }

}

  我们实现USB主机库的移植,我们尝试往U盘写一个名为STM32.txt的文件,经测试是成功的,具体如下图:

  上图中,我们创建了一个名为STM32.txt的文本文件,我们进一步像文件中写入一定的字符。我们写入一句话,其结果如下:

  至此,我们可以确定我们的USB主机库移植及大容量存储设备的操作应该是正确的。

4、小结

  在usbh_conf.c和usbh_conf.h文件的实现中已经将硬件接口对象HCD_HandleTypeDef已经连接到了USB主机对象USBH_HandleTypeDef上,所以在应用层面就需要操作USBH_HandleTypeDef对象了。


  在移植测试过程中,我们发现了一个现象。如果在USB HOST库完成软硬件初始化之前就插入U盘,则系统不能完成初始化。等到初始化完成之后插入U盘则操作正常。


关键字:STM32  USB 引用地址:如何在STM32上实现USB主机读写U盘文件

上一篇:基于STM32单片机的紫外线消毒系统设计
下一篇:基于STM32的智能加油系统设计方案

推荐阅读最新更新时间:2024-11-11 19:04

优化您的汽车USB防电池短路设计——第2部分
随着C型USB连接器成为消费者领域的新标准,USB正在进入汽车信息娱乐系统等更多解决方案。设计最高的可靠性时,车中处在不同位置的USB端口扩展带来了独特的挑战。因为具有如防电池短路、短路和静电放电(ESD)条件故障,汽车的USB应用呈现其他市场不存在的使用案例。由于电源流经主车辆电池,它们受到预期操作期间产生的高电压和电流峰值影响。此外,从处理器、USB集线器、充电控制器和负载开关连接到VBUS和数据线上的下游电路需要防止电池短路事件。 为了防止USB电池短路,当USB接口端的电压高于过压阈值时,过电压保护电路必须用来断开系统电源。过电压的场效应晶体管(FET)应具有快速响应时间以尽快断开系统电源,保护上游片上系统(SoC)免受
[汽车电子]
优化您的汽车<font color='red'>USB</font>防电池短路设计——第2部分
苹果双USB-C端口35W充电器图片曝光
ChargerLab今天分享了疑似苹果尚未发布的带有双USB-C端口的35W电源适配器的图片,让人们第一次看到了这款配件的潜在设计。 这些图片表明,充电器将有一个紧凑的设计,并排的USB-C端口,可折叠的插头,和圆形凹口,更方便从电源插座上取出充电器。35W将适合为各种苹果设备充电,如iPhone、iPad、最新的MacBook Air和HomePod mini。 上周,在苹果网站上短暂发布的一份文件中,首次发现了对新款电源适配器的引用。 3月初,就有消息表示,苹果正在研发一款采用新设计的30W电源适配器。 至于这款35W的充电器何时发布,目前尚未有定论。
[手机便携]
什么是STM32以及怎样学习?
一、硬件准备: 随着技术的发展,单片机开发手段也越来越先进,而价格却不断下降。当FLASH型单片机被广泛应用后,采用软件模拟加写片验证成为一种经济实用的实验方法。而近年来很多单片机都具有了ISP功能,只要一根下载线即可以编程,不再需要编程器。 美国SST公司推出的SST系列单片机更是集成了仿真功能,配合Keil软件,可使用户的目标板直接具有仿真功能,将单片机的易用性推向一个新的高度。 我们推荐给大家的学习单片机的设备是:方案1:(1)计算机一台;(2)具有仿真功能的实验板一块,(3)其它如电烙铁、实验电源等常规工具。方案2:(1)计算机一台;(2)下载型实验板一块;(3)下载线一根;(4)其它如电烙铁、实验电源等常工具
[单片机]
stm32单片机红外遥控超声波避障小车
和同学一起在学校参加院电子设计大赛做的项目,看起来时间很长,但实际上我们拢共做的时间差不多是3天的样子。 板子是正点的,所以很多地方我们就直接扒的正点的例程,比如红外遥控的部分完整拿过来了,能直接用。 我们在完成学校的要求后又多加了测距显示和差速调节(让小车可以从完全停止到最高速度),后面我会分块尽量详细叙述小车的功能原理及代码介绍。 视频演示 https://www.bilibili.com/video/av85501350/ 电源 我们采用的是三节18650供电,三节电池就有12v,用来驱动小车绰绰有余,为了获得更稳定符合小车需求的电压,我们又采用了一个LM2596S降压模块,把12V的电压给降到3v给单片
[单片机]
STM32的入门总结和学习步骤
一、入门总结 1.1为什么要把时间花在“犹豫”上? 每当我们在入门之前(ARM是这样,DSP也一样),总会有很多疑问,会有很多顾虑。我们渴望知道学习STM32前景如何?需要啥基础?难不难?适不适合我?但是什么时候能心潮澎湃地、相当着急地开始学STM32?日子在一天一天过去!你开始行动了吗?没有行动的思索,永远都不可能入门!把这些时间用来看书吧,效果能好一万倍。 大家可能是从51单片机过来的,回想一下,我们之前学单片机时如何入门呢?实际上都是先看书(理论),再玩板子(实践)。严格地说,应该是模仿实验。熟悉之后才会自己写程序代码实现某个功能。因此,如果你正在咨询STM32;如果你正对STM32心潮澎湃;如果你想入门STM32;
[单片机]
<font color='red'>STM32</font>的入门总结和学习步骤
基于STM32的2μm高功率激光医疗仪控制器设计
2μm高功率激光医疗仪市场需求越来越大,而目人机交互模块前国内此类设备在控制上缺乏对系统安全和出光精准度的考虑。同时随着YY0505-2012医用电气电磁兼容标准于2014年的执行,设计符合YY0505-2012标准的医用设备已迫在眉睫。因此,本文采用模块化设计,设计了一种基于STM32的2μm光纤激光器医疗仪控制系统,将水冷单元的参数监控、电源模块的抗干扰设计、输出功率的校准等集成于一体。测试结果表明,系统可靠稳定,操作方便。   1系统功能和结构设计   按功能划分,医疗仪主要由2μm光纤激光器模块、精密水冷单元、STM32主控制器模块、人机交互模块等部分组成,结构如图1所示。控制器是医疗仪的大脑,负责整个设备的启停和正
[医疗电子]
基于<font color='red'>STM32</font>的2μm高功率激光医疗仪控制器设计
Stm32RS232串口通信——中断接收发送数据
main.c配置: /* *说明: *PA0:KEY1;PA1:KEY2; *PA2:LED1;PA3:LED2; *PA9:USART1_TX;PA10:USART1_RX */ #include stm32f10x.h #include stm32f10x_rcc.h #include stm32f10x_gpio.h #include stm32f10x_usart.h #include stm32f10x_exti.h #include system_stm32f10x.h #include misc.h void RCC_Configurati
[单片机]
基于USB摄像头的高速图像采集技术
0 引言 图像采集系统,现代计算机系统广泛应用的是总线Bus结构。随着GUI(Graphical User Interface)、多媒体等技术在PC机上的应用,传统的PC总线己不能满足系统工作的要求。USB通用串行总线的出现使图像采集技术得到了质的飞跃。更快的传输与相应速度,便捷的图像采集系统安装过程以及更低的能耗,使得图像采集技术广泛应用到了生活中。USB摄像头充当了机器之眼的角色。不仅如此,计算机的发展又赋予了图像采集技术新的活力一图像的采集处理识别功能。这一功能使得很多机械化的产品更加全自动化。图像系统技术的逐渐成熟,使得我们可以更轻易地获取外部信息并添加到其他智能化程序控制系统中。但价格低廉,可进行高效图像处理传输的U
[测试测量]
基于<font color='red'>USB</font>摄像头的高速图像采集技术
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved