0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

CHANBAEK 来源:木南创智 作者:尹家军 2022-12-13 17:20 次阅读

在项目应用中,经常会有对外交换数据的需求。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盘则操作正常。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • usb
    usb
    +关注

    关注

    60

    文章

    7914

    浏览量

    264233
  • U盘
    +关注

    关注

    7

    文章

    489

    浏览量

    63225
  • STM32
    +关注

    关注

    2268

    文章

    10881

    浏览量

    355258
收藏 人收藏

    评论

    相关推荐

    STM32105做USB HOST读写U,频繁插拔后U不识别怎么处理?

    使用STM32F105做USB HOST读写U 正常流程下识别写文件断开
    发表于 03-28 07:53

    求助,基于stm32 U读写的疑问求解

    大家好: 我移植官方usb库,实现U读写,目前单次的读写已经成功,但是频繁写入的时候遇到一
    发表于 04-10 06:41

    STM32F107VCT6使用USB HOST OTG挂载U连续读写文件错误是怎么回事?如何解决?

    最近研究STM32F107VCT6的USB HOST OTG驱动U,目前可以正确识别到U和挂
    发表于 04-29 08:28

    STM32F4CUBE USB读写U遇到的几个疑问求解

    txt文件,但内容没写进去,f_write返回值是ok;U是好用的,插在电脑没有问题 (3)在STM32F4CUBE1.9的库中有FAT
    发表于 05-06 07:08

    嵌入式U读写模块USB118

    读写数据呢?答案是肯定的。USB118系列嵌入式U读写模块提供了通过串口或并口读写
    发表于 07-24 14:46

    STM32F4 USB模拟U写入文件数据后如何判断文件已经写结束了?

    使用STM32USB模拟U,电脑向STM32模拟的U
    发表于 02-20 08:04

    何在搭载了RT-Thread操作系统的平台上使用USBHost读写U

    本文描述了如何在搭载了 RT-Thread 操作系统的平台上使用 USB Host 读写 U ,包括
    发表于 03-30 07:54

    如何使用u*** host实现U读写

    U是一个很常用的存储设备,它是通过u***实现数据传输的,那么在stm32上面,我们要怎么接入U
    发表于 02-22 06:22

    基于单片机的嵌入式USB主机系统的实现

    在无操作系统的单片机系统中实现USB主机系统功能,对U进行文件
    发表于 09-16 09:21 30次下载

    U伴侣 EasyUDisk读写U模块

    在嵌入式的电子产品中实现U文件读写,在软件设计上成了许多厂家威廉希尔官方网站 攻关的难题,U
    发表于 11-04 12:01 74次下载

    STM32CubeMX通过FatFS读写U

    ;(上述气话,接下来上干货)大致思路STM32读写U主要分为以下几个方面:1、文件系统(抽象层,以统一方式对不同外设进行
    发表于 12-09 10:21 21次下载
    <b class='flag-5'>STM32</b>CubeMX通过FatFS<b class='flag-5'>读写</b><b class='flag-5'>U</b><b class='flag-5'>盘</b>

    RT-thread应用讲解——Uusb host)

    U是一个很常用的存储设备,它是通过usb实现数据传输的,那么在stm32上面,我们要怎么接入U
    发表于 12-28 19:41 22次下载
    RT-thread应用讲解——<b class='flag-5'>U</b><b class='flag-5'>盘</b>(<b class='flag-5'>usb</b> host)

    STM32&SD卡实现USB虚拟U

    下载源码请关注公众号之前的文章中介绍过STM32读写SD卡和FatFS文件系统相关的知识。今天将在这基础介绍STM32通过
    发表于 12-28 19:54 43次下载
    <b class='flag-5'>STM32</b>&SD卡<b class='flag-5'>实现</b><b class='flag-5'>USB</b>虚拟<b class='flag-5'>U</b><b class='flag-5'>盘</b>

    STM32CubeMX | STM32基于HAL实现USB模拟U

    STM32CubeMX | STM32基于HAL实现USB模拟U目录
    发表于 12-28 20:04 40次下载
    <b class='flag-5'>STM32</b>CubeMX | <b class='flag-5'>STM32</b>基于HAL<b class='flag-5'>实现</b><b class='flag-5'>USB</b>模拟<b class='flag-5'>U</b><b class='flag-5'>盘</b>

    如何扩展USB接口进行对U读写

    电子发烧友网站提供《如何扩展USB接口进行对U读写.doc》资料免费下载
    发表于 10-25 10:15 5次下载
    如何扩展<b class='flag-5'>USB</b>接口进行对<b class='flag-5'>U</b><b class='flag-5'>盘</b>的<b class='flag-5'>读写</b>