做机网站,wordpress首页按钮,百度关键词相关性优化软件,什么是网站备案在项目应用中#xff0c;经常会有对外交换数据的需求。USB接口读写U盘无疑是一种颇为方便的选择。在这一篇中#xff0c;我们就来讨论如何在STM32上实现USB主机读写U盘文件的方法。
1、应用概述 在我们的产品上有这样一个需求#xff0c;希望通过大容量的U盘存取数据。我们… 在项目应用中经常会有对外交换数据的需求。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盘则操作正常。
欢迎关注