USB应用开发笔记之一:STM32上实现USB主机读写U盘

摘要:
USB接口读写U盘无疑是一种颇为方便的选择。在这一篇中,我们就来讨论如何在STM32上实现USB主机读写U盘文件的方法。我们使用STM32CubeMX来实现USB的相关配置。中断会监测USB的状态,所以中断不打开,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,如下图所示:

USB应用开发笔记之一:STM32上实现USB主机读写U盘第1张

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

USB应用开发笔记之一:STM32上实现USB主机读写U盘第2张

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

USB应用开发笔记之一:STM32上实现USB主机读写U盘第3张

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

USB应用开发笔记之一:STM32上实现USB主机读写U盘第4张

  中断必须打开,中断级别可以根据需要设置。中断会监测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的文件,经测试是成功的,具体如下图:

USB应用开发笔记之一:STM32上实现USB主机读写U盘第5张

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

USB应用开发笔记之一:STM32上实现USB主机读写U盘第6张

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

4、小结

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

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

欢迎关注:

USB应用开发笔记之一:STM32上实现USB主机读写U盘第7张

免责声明:文章转载自《USB应用开发笔记之一:STM32上实现USB主机读写U盘》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何做升级测试c#数字图像处理(二)彩色图像灰度化,灰度图像二值化下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

STM32之ADC配置,ADC_Mode模式理解

对于STM32,在使用ADC的时候需要配置几个参数。 第一个参数是ADC_Mode,这里设置为独立模式: ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; 在这个模式下,双ADC不能同步,每个ADC接口独立工作。所以如果不需要ADC同步或者只是用了一个ADC的时候,就应该设成独立模式了。 第二个参数是...

WINCE USB驱动组入

在WINCE系统中的驱动主要分成两种方式:一个是在BUILD时候加载,另一种是USB驱动类型,只有在USB设备插入时才调用驱动程序,每个USB设备在组入的时候要对USB设备进行分析,主要是VID PID CLASS INTERFACE等,当USB插入的时候系统会在HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients\下查找相...

Windows识别USB设备过程

集线器检测新设备 主机集线器监视着每个端口的信号电压,当有新设备接入时便可觉察。(集线器端口的两根信号线的每一根都有15kΩ的下拉电阻,而每一个设备在D+都有一个1.5kΩ的上拉电阻。当用USB线将PC和设备接通后,设备的上拉电阻使信号线的电位升高,因此会被主机集线器检测到) 主机知道了新设备连接后 每个集线器用中断传输来报告在集线器上的事件。当主机知道...

移动硬盘不显示的解决方法

今天突然遇上一个问题,那就是原来用的好好的移动硬盘在电脑上显示不了了。它坏了么?   首先,检查USB接口,用U盘等插入检查,发现可以显示,那么USB接口是没有问题的。 接着,将移动硬盘插入别的电脑,发现可以显示。 而且硬盘是有指示灯闪烁,那么问题在于电脑对于移动硬盘的识别。   先描述一下,我尝试了几个方式以后最后解决了的方案。 1.右击安全删除硬件并...

使用UltraISO工具制作U盘启动光盘

以cn_windows_7_professional_x86_dvd_x15-65790.iso镜像文件为例。 1、打开UltraISO工具,文件->打开,并找到下载好的系统镜像文件(镜像文件可在此处下载 https://msdn.itellyou.cn/)。 2、启动->写入硬盘镜像。 3、选择好需要写入的U盘,勾选刻录校验,写入方式选择...

STM32学习笔记——AFIO时钟的配置问题

最近在写程序时发现设置外部中断出了问题,之前的程序好好的怎么就不能用了呢?经过了一晚上的折腾发现问题出在AFIO时钟的配置上,我没有使能AFIO时钟。 什么时候要开启AFIO呢?参考手册:  说的很明白,操作AFIO的三类寄存器时需要开启:  1.事件控制寄存器(AFIO_EVCR) 2.复用重映射和调试I/O配置寄存器(AFIO_MAPR) 3.外部...