历史上的今天
返回首页

历史上的今天

今天是: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 Host

  在移植其他部分的时候与之类似,只需要替换成对应部分的源码文件即可。


源码中的 USB OTG部分是所有其他模块的驱动程序。

usbh_msc_fatfs.c为ST提供的FatFs的diskio.c的具体实现文件。在使用了该文件后,用户不必再自行实现FafFs的diskio.c了。

###源码配置

  整个USB驱动用于灵活的配置选项,且通过一个配置文件的形式给出。这样,使用者可以尽量少的修改的驱动源代码。这些配置文件均为用户级别的文件,通常来说置于用户代码目录下。如下如所示:

USBHostUser

  作为用户级文件,通常所有的用户代码均在以上文件做修改即可,只有少数特殊处理会设计到驱动程序源码的修改。在配置好后,一般来说,所有修改均在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功能。 */

推荐阅读

史海拾趣

Cramer公司的发展小趣事

随着5G技术的普及,Cramer公司紧跟时代潮流,开始研发5G通信设备。他们与多家通信巨头合作,共同推进5G技术的发展。经过不懈的努力,Cramer公司成功研发出了一款高性能的5G路由器。这款产品的推出,使得Cramer公司在5G市场上取得了先机,并为其带来了丰厚的回报。

永源微电子(APM)公司的发展小趣事

永源微电子(APM)公司创立于2017年,前身可追溯到台湾汉磊科技。作为汉磊科技的全资子公司,香港艾柏霖科技有限公司的功率器件事业部,永源微电子继承了丰富的技术积累和市场资源。公司创立之初,便确立了专注于集成电路设计、制造与销售的战略方向。通过引进国际先进的生产工艺和研发团队,永源微电子逐渐在电子行业中崭露头角,为后续的快速发展奠定了坚实基础。

Fong Ya Enterprise Co Ltd公司的发展小趣事

随着国内外市场的不断开拓和技术实力的不断提升,永源微电子开始实施全球化战略。公司积极寻求与国际知名企业的合作机会,通过技术引进和合资合作等方式,不断提升自身的国际化水平。同时,永源微电子还注重内部管理和人才培养,通过建立完善的管理体系和激励机制,吸引和留住了一批优秀的技术人才和管理人才。在全球化战略的推动下,永源微电子实现了持续稳健的发展,成为了电子行业中一颗璀璨的明星。

以上五个故事分别从不同角度描绘了永源微电子(APM)公司的发展历程,包括创立与初步发展、技术突破与产品线拓展、市场拓展与品牌建设、A轮融资与战略合作以及全球化战略与持续发展等方面。这些故事基于事实性的描述,展现了永源微电子在电子行业中的成长轨迹和发展成就。

FOSLINK公司的发展小趣事

为了进一步扩大市场份额,FOSLINK公司积极实施全球化战略。公司先后在多个国家和地区设立了研发中心、生产基地和销售网络,形成了覆盖全球的业务布局。通过全球化的资源配置和市场拓展,FOSLINK成功打入了多个国际知名企业的供应链体系,为其提供了优质的产品和服务。这一系列的全球化举措,不仅提升了FOSLINK的品牌影响力,还为其未来的发展奠定了坚实的基础。

Deltron / DEM Manufacturing公司的发展小趣事

DEM Manufacturing深知品牌对于企业发展的重要性。因此,公司注重品牌塑造和宣传,通过广告、公关等多种手段提升品牌知名度和美誉度。同时,公司还积极参与公益事业和社会活动,履行社会责任,树立了良好的企业形象。

西安航天民芯公司的发展小趣事

随着新能源汽车市场的蓬勃发展,西安航天民芯敏锐地捕捉到了这一机遇。公司投入大量资源进行新能源汽车BMS管理芯片的研发,并成功推出了国内首款新能源汽车专用BMS管理芯片。这一创新产品填补了国内空白,为公司在新能源汽车领域赢得了先机。

问答坊 | AI 解惑

教你认识单片机汇编语言写的延迟函数意义

首先我们要温习下:51单片机内有R0-R7,8个通用寄存器。          1秒=1000毫妙       1S=1000ms          1毫妙=1000微妙     1ms=1000u ...…

查看全部问答>

贡献classAB的好文章!

Compact_Low-Voltage_Power-Efficient_Operational_Amplifier_Cells_for_VLSI.…

查看全部问答>

谁知道3G 模块哪里有卖啊?

各位大吓,有知道TD或者WCDMA模块的,请顶一下哦!谢谢.…

查看全部问答>

嵌入式开发入门!!

嵌入式开发入门 从哪儿入手,我想从LINUX开始,请专家指教! 需要哪些书籍和开发板! …

查看全部问答>

有人需要CC250芯片吗?有人需要NRF2402G模块的吗?

CC2500 有几百个吧  价格暂定5元!~原装 NRF2402G模块价格9元一个!~ 有需要的朋友请联系QQ1625345502   …

查看全部问答>

征求意见-草拟的前言

由于编辑觉得前言内容过于简单,也不够吸引人。希望大家看过之后,多提出一些意见。前言——拟稿    从大二开始接触电路,到研究生毕业,硬件设计对我而言就是电路图和电路板两个阶段。感谢狄工给我这个机会进入了汽车电子的行业 ...…

查看全部问答>

气压传感器选型指南:多款气压传感器性能比较

在我给客户做技术的工作当中,经常遇到客户问到这样的问题,\"目前市场上气压传感器都各有什么优势?\"\"我们应该如何去选型?\" 本文就目前市场上的几款气压传感器性能做次比较,仅供大家选型时参考!目前市场上的气压传感器有:VTI的SCP1000,Bosc ...…

查看全部问答>

stm32---liunx

作为一个低端的arm芯片,cortex-m3内核在上次上海培训的时候有说会达到1G的主频,有没有以后出支持LIUNX芯片的计划。芯片未来前景怎样,就目前的情况来说STM32利用目前的策略,市场反应应该还是不错的。    我只是想知道 ...…

查看全部问答>

关于STM32中MAP文件的内容

大家好! 在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 ...…

查看全部问答>

新手问题,关于sdram的,谢谢指导

1\dsp为TMS320VC5510,用两片4M,16-bit的SDRAM芯片构造32-bit的SDRAM空间. 我不解的地方是:根据datasheet,4M32-bit的SDRAM占据了所有四个EMIF空间.那么要使用这四兆32位空间,是不是把所有四个CE控制寄存器都设置成SDRAM模式,而硬件上只连接CE0? ...…

查看全部问答>