历史上的今天
今天是:2025年07月29日(星期二)
2019年07月29日 | STM32 之四 标准外设版 USB 驱动 + MSC(Host) + Fatfs 移植
2019-07-29 来源:eefocus
写在前面
现在,网上关于STM32的USB的文章数不胜数。写这篇文章仅仅是对于自我学习的一个记录。主要是对实际学习中遇到的一些棘手问题做个备忘录。使用的芯片为STM32F407VG 。
目前,ST的USB驱动有两套,一套是早期的独立版USB驱动,官方培训文档中称为Legacy library,最新版为2.2.0;一套为针对其Cube系列的驱动,根据芯片不同可能有区别,具体见对应芯片的Cube驱动包,官方培训文档中称为Cube library。 本文使用的为Legacy libraryUSB驱动。更详细的请参考博文STM32 之 USB IP(USB模块) 详解。
HAL库 + Legacy library USB库两个混用
目前,Fatfs 驱动最新版为R0.13a 。
本文多出自于ST的官方文档,读者也可以直接去ST官网查阅相关文档。
本文主要涉及USB Host(全速)+ MSC + Fatfs的移植。其他移植后续用到再说。
关于独立版USB驱动库的详解见 http://blog.csdn.net/zcshoucsdn/article/details/78936456
USB驱动部分
源码移植
源码的移植相对来说比较简单,使用时,根据需要复制相关的文件即可。需要注意的是,整理一下源码的结构。这个在上一篇博文中已经由说明了。具体见下图:

在移植其他部分的时候与之类似,只需要替换成对应部分的源码文件即可。
源码中的 USB OTG部分是所有其他模块的驱动程序。
usbh_msc_fatfs.c为ST提供的FatFs的diskio.c的具体实现文件。在使用了该文件后,用户不必再自行实现FafFs的diskio.c了。
###源码配置
整个USB驱动用于灵活的配置选项,且通过一个配置文件的形式给出。这样,使用者可以尽量少的修改的驱动源代码。这些配置文件均为用户级别的文件,通常来说置于用户代码目录下。如下如所示:

作为用户级文件,通常所有的用户代码均在以上文件做修改即可,只有少数特殊处理会设计到驱动程序源码的修改。在配置好后,一般来说,所有修改均在usbh_usr.h/.c中。
usb_config.h
usb_config.h是USB OTG 底层驱动的配置文件。在USB OTG的源代码中,ST提供了usb_conf_template.h。使用者只需要复制该文件到自己的代码目录下,修改即可。具体配置见下文的注释部分:
/** ******************************************************************************
* @file usb_conf.h
* @author
* @version V2.2.0
* @date 2017.12.27
* @brief USB的底层驱动配置
******************************************************************************
* @attention
*
*
© COPYRIGHT 2017 ST
*
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __USB_CONF__H__
#define __USB_CONF__H__
/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx.h" /* 这里需要包含自己使用的ST的库的头文件 */
/** @addtogroup USB_OTG_DRIVER
* @{
*/
/** @defgroup USB_CONF
* @brief USB 底层驱动配置文件
* @{
*/
/** @defgroup USB_CONF_Exported_Defines
* @{
*/
/* USB Core and PHY interface 配置.
Tip: To avoid modifying these defines each time you need to change the USB configuration, you can declare the needed define in your toolchain compiler preprocessor.
*/
/**** 配置文件包含了Full Speed 和 High Speed 两种速率的配置,使用时,从两者选择其一即可。****/
/****************** USB OTG FS PHY 配置 *******************************
* USB OTG FS Core 支持 one on-chip Full Speed PHY。通常,ST芯片内部已经集成了该PHY。
*
* 当使用了FS core时,宏USE_EMBEDDED_PHY 需要在编译器中定义.
*
*******************************************************************************/
#ifndef USE_USB_OTG_FS
#define USE_USB_OTG_FS /* 使用 FS, 与下面的 HS 只能选一个。目前,终端只支持FS */
#endif /* USE_USB_OTG_FS */
#ifdef USE_USB_OTG_FS
#define USB_OTG_FS_CORE
#endif
/****************** USB OTG HS PHY 配置 *******************************
* USB OTG HS Core 支持 两种 PHY 接口:
* (i) 使用外部高速PHY的ULPI 接口: USB HS Core 工作在高速模式下
* (ii) 片内Full Speed PHY: USB HS Core 工作在全速模式下
* 通过下面两个宏,选择使用哪种PHY:
* (i) USE_ULPI_PHY: if the USB OTG HS Core is to be used in High speed mode
* (ii) USE_EMBEDDED_PHY: if the USB OTG HS Core is to be used in Full speed mode
*
* Notes:
* - The USE_ULPI_PHY symbol is defined in the project compiler preprocessor as default PHY when HS core is used.
* - On STM322xG-EVAL and STM324xG-EVAL boards, only configuration(i) is available.
* Configuration (ii) need a different hardware, for more details refer to your STM32 device datasheet.
*******************************************************************************/
#ifndef USE_USB_OTG_HS
//#define USE_USB_OTG_HS
#endif /* USE_USB_OTG_HS */
#ifndef USE_ULPI_PHY
//#define USE_ULPI_PHY
#endif /* USE_ULPI_PHY */
#ifndef USE_EMBEDDED_PHY
//#define USE_EMBEDDED_PHY
#endif /* USE_EMBEDDED_PHY */
#ifdef USE_USB_OTG_HS
#define USB_OTG_HS_CORE
#endif
/*******************************************************************************
* FIFO Size Configuration in Device mode
*
* (i) Receive data FIFO size = RAM for setup packets +
* OUT endpoint control information +
* data OUT packets + miscellaneous
* Space = ONE 32-bits words
* --> RAM for setup packets = 10 spaces
* (n is the nbr of CTRL EPs the device core supports)
* --> OUT EP CTRL info = 1 space
* (one space for status information written to the FIFO along with each
* received packet)
* --> data OUT packets = (Largest Packet Size / 4) + 1 spaces
* (MINIMUM to receive packets)
* --> OR data OUT packets = at least 2*(Largest Packet Size / 4) + 1 spaces
* (if high-bandwidth EP is enabled or multiple isochronous EPs)
* --> miscellaneous = 1 space per OUT EP
* (one space for transfer complete status information also pushed to the
* FIFO with each endpoint's last packet)
*
* (ii)MINIMUM RAM space required for each IN EP Tx FIFO = MAX packet size for
* that particular IN EP. More space allocated in the IN EP Tx FIFO results
* in a better performance on the USB and can hide latencies on the AHB.
*
* (iii) TXn min size = 16 words. (n : Transmit FIFO index)
* (iv) When a TxFIFO is not used, the Configuration should be as follows:
* case 1 : n > m and Txn is not used (n,m : Transmit FIFO indexes)
* --> Txm can use the space allocated for Txn.
* case2 : n < m and Txn is not used (n,m : Transmit FIFO indexes)
* --> Txn should be configured with the minimum space of 16 words
* (v) The FIFO is used optimally when used TxFIFOs are allocated in the top
* of the FIFO.Ex: use EP1 and EP2 as IN instead of EP1 and EP3 as IN ones.
*******************************************************************************/
/*******************************************************************************
* FIFO Size Configuration in Host mode
*
* (i) Receive data FIFO size = (Largest Packet Size / 4) + 1 or
* 2x (Largest Packet Size / 4) + 1, If a
* high-bandwidth channel or multiple isochronous
* channels are enabled
*
* (ii) For the host nonperiodic Transmit FIFO is the largest maximum packet size
* for all supported nonperiodic OUT channels. Typically, a space
* corresponding to two Largest Packet Size is recommended.
*
* (iii) The minimum amount of RAM required for Host periodic Transmit FIFO is
* the largest maximum packet size for all supported periodic OUT channels.
* If there is at least one High Bandwidth Isochronous OUT endpoint,
* then the space must be at least two times the maximum packet size for
* that channel.
*******************************************************************************/
/****************** USB OTG HS CONFIGURATION **********************************/
/* 以下暂不使用 */
#ifdef USB_OTG_HS_CORE
#define RX_FIFO_HS_SIZE 512 /* 设置高速内核的接收FIFO大小。*/
/* 设置设备端点的发送FIFO大小(高速),其中0~3是要使用的端点的索引。*/
#define TX0_FIFO_HS_SIZE 512
#define TX1_FIFO_HS_SIZE 512
#define TX2_FIFO_HS_SIZE 0
#define TX3_FIFO_HS_SIZE 0
#define TX4_FIFO_HS_SIZE 0
#define TX5_FIFO_HS_SIZE 0
#define TXH_NP_HS_FIFOSIZ 96 /* 设置主机模式(高速)的非周期性发送FIFO大小。 */
#define TXH_P_HS_FIFOSIZ 96 /* 设置主机模式(高速)的周期性发送FIFO大小。*/
// #define USB_OTG_HS_LOW_PWR_MGMT_SUPPORT /* 实现高速核心(USB核心时钟门控等)的低功耗管理。 */
// #define USB_OTG_HS_SOF_OUTPUT_ENABLED
// #define USB_OTG_INTERNAL_VBUS_ENABLED
#define USB_OTG_EXTERNAL_VBUS_ENABLED
#ifdef USE_ULPI_PHY
#define USB_OTG_ULPI_PHY_ENABLED /* 启用高速内核的ULPI PHY。 */
#endif
#ifdef USE_EMBEDDED_PHY
#define USB_OTG_EMBEDDED_PHY_ENABLED /* 为高速内核启用嵌入式FS PHY。 */
#endif
#define USB_OTG_HS_INTERNAL_DMA_ENABLED /* 启用高速内核的内部DMA功能。 */
#define USB_OTG_HS_DEDICATED_EP1_ENABLED /* 在高速内核中为器件模式启用专用的端点1功能。 */
史海拾趣
|
首先我们要温习下:51单片机内有R0-R7,8个通用寄存器。 1秒=1000毫妙 1S=1000ms 1毫妙=1000微妙 1ms=1000u ...… 查看全部问答> |
|
有人需要CC250芯片吗?有人需要NRF2402G模块的吗? CC2500 有几百个吧 价格暂定5元!~原装 NRF2402G模块价格9元一个!~ 有需要的朋友请联系QQ1625345502 … 查看全部问答> |
|
由于编辑觉得前言内容过于简单,也不够吸引人。希望大家看过之后,多提出一些意见。前言——拟稿 从大二开始接触电路,到研究生毕业,硬件设计对我而言就是电路图和电路板两个阶段。感谢狄工给我这个机会进入了汽车电子的行业 ...… 查看全部问答> |
|
在我给客户做技术的工作当中,经常遇到客户问到这样的问题,\"目前市场上气压传感器都各有什么优势?\"\"我们应该如何去选型?\" 本文就目前市场上的几款气压传感器性能做次比较,仅供大家选型时参考!目前市场上的气压传感器有:VTI的SCP1000,Bosc ...… 查看全部问答> |
|
作为一个低端的arm芯片,cortex-m3内核在上次上海培训的时候有说会达到1G的主频,有没有以后出支持LIUNX芯片的计划。芯片未来前景怎样,就目前的情况来说STM32利用目前的策略,市场反应应该还是不错的。 我只是想知道 ...… 查看全部问答> |
|
大家好! 在MAP文件中,可以看到 6 926 bytes of readonly code memory 582 bytes of readonly data memory 1 348 bytes of readwrite data memory 的内容。 我知道“6 926 bytes of ...… 查看全部问答> |
|
1\dsp为TMS320VC5510,用两片4M,16-bit的SDRAM芯片构造32-bit的SDRAM空间. 我不解的地方是:根据datasheet,4M32-bit的SDRAM占据了所有四个EMIF空间.那么要使用这四兆32位空间,是不是把所有四个CE控制寄存器都设置成SDRAM模式,而硬件上只连接CE0? ...… 查看全部问答> |




