eric2013 发表于 2016-6-22 10:41:58

STM32移植USB库2.2.0版本----USB Host之外挂U盘移植步骤及其注意事项,识别率很高,

这个库是去年11月份官方升级的,U盘识别率很高,热插拔也好用。配套的例子含F407和F429,下周
FreeRTOS教程发布后贴到这个帖子里面
例子下载:
==========================================================================
文件名:U盘挂载模块移植和使用说明

----Eric2013整理于2016-02-26

【移植说明】
安富莱移植的U盘挂载应用说明:
usb_mass_storage 文件夹的文件主要来自于ST的USB固件库2.2.0版本中的范例
官方下载地址:
http://www.st.com/web/catalog/to ... 961/SS1743/PF257882
安富莱电子对齐进行了整理。使其可以方便地添加到不同的工程中去。

---------------------当前的SD卡模拟U盘是用的MicrUSB接口---------------------

移植步骤如下:
1. 在工程中添加USB固件库:STM32_USB_Host_Library 和 STM32_USB_OTG_Driver
    STM32_USB_Host_Library\Core\Core
    STM32_USB_Host_Library\Class\msc
    STM32_USB_OTG_Driver\src   

   具体添加的文件参考此工程,就不一一详述了,注意部分文件在软件包的工程文件夹下。

2. 添加usbd_usr.c,usb_bsp.c和相应的.h文件到User文件夹下的usbd_mass_storage文件夹下。
   usb_conf.h和usbh_conf.h文件也添加到这个路径下。
   -----
   其中usb_bsp.c此文件做较大修改,具体看此文件实现即可。这几个文件是在官方工程的具体实现文件夹下。

3. 整理USB的中断到一个专门新建的usb_it.c文件里,具体参考源文件即可。


4. 整理并修改usbd_usr.c文件。
   (1)USB相关全局变量定义在 usbd_usr.c 文件
      #ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
          #if defined ( __ICCARM__ )/*!< IAR Compiler */
            #pragma data_alignment=4   
          #endif
      #endif

      /* USB HOST使用 */
      __ALIGN_BEGIN USB_OTG_CORE_HANDLE   USB_OTG_Core__ALIGN_END;
      __ALIGN_BEGIN USBH_HOST   USB_Host   __ALIGN_END;

      /* USB Devie使用 */
      __ALIGN_BEGIN USB_OTG_CORE_HANDLE   USB_OTG_dev   __ALIGN_END ;

   (2)添加两个新函数,方便调用。
      /* 挂载U盘 ****************************/
      void usbh_OpenMassStorage(void)
      {
            USBH_Init(&USB_OTG_Core,
                      #ifdef USE_USB_OTG_FS
                         USB_OTG_FS_CORE_ID,
                      #else
                         USB_OTG_HS_CORE_ID,
                      #endif
                      &USB_Host,
                      &USBH_MSC_cb,
                      &USRH_cb);
      }

      /* 卸载U盘 ****************************/
      void usbh_CloseMassStorage(void)
      {
            /* Host de-initializations */
            USBH_DeInit(&USB_OTG_Core, &USB_Host);

            USB_OTG_BSP_DisableInterrupt();    /* 关闭USB相关的所有中断 */
      }
   (3)添加如下调试:
      //#define usb_printf    printf
      #define usb_printf(...)

      这个文件的源文件是LCD调试的,故将其修改为了串口打印的形式。
    (5) 修改USBH_Usr_cb_TypeDef USR_cb为USBD_Usr_cb_TypeDef USRH_cb。
         此文件的.h文件也要做相应的extern修改。


6. 新建一个usbh_bsp_msc.h文件,专门供用户调用。

7. usb_conf.h文件
   1. 删除官方评估板宏定义
   2. 选择使能Host模式,其中Device模式也使能,方便兼容usb_bsp.c中修改的函数
       #define USE_HOST_MODE
       #define USE_DEVICE_MODE

9. 工程中添加预编译宏定义:USE_USB_OTG_HS, USE_EMBEDDED_PHY, 其中 VBUS_SENSING_ENABLED 是可选的



【使用方法】
1. 用户直接调用usbh_OpenMassStorage即可,在主程序中循环调用
   USBH_Process(&USB_OTG_Core, &USB_Host);
   就可以支持热插拔,无需再调用usbh_OpenMassStorage,这个函数初始化时调用一次即可。


2. 动态移除USB连接调用:
    usbh_CloseMassStorage;


==========================================================================

eric2013 发表于 2016-7-1 07:51:17

已经更新例子。

baonng 发表于 2017-4-10 15:06:21

新的2.2库,外挂U盘,还是无法百分百兼容吧

baonng 发表于 2017-4-10 16:58:45

回 eric2013 的帖子

eric2013:已经更新例子。 (2016-07-01 07:51) images/back.gif

调试发现,应该是U盘枚举成功,但是还是存在U盘兼容性问题,手中有一个U盘执行
if ( f_mount( &amp;fatfs, &quot;2:/&quot;, 1 ) != FR_OK )
后失败,然后就没法继续了。

eric2013 发表于 2017-4-11 11:33:20

修改为裸机要修改的地方:














zerone 发表于 2017-7-29 13:21:53

教程里用的是 USE_USB_OTG_HS端口吧,我要用 USE_USB_OTG_FS端口要怎么改呢

zerone 发表于 2017-7-29 14:21:49

串口不停的收到这样的信息,那里有问题。按理说应该只收到一次这样的信息就够了吧

收←◆> UNRECOVERED ERROR STATE
收←◆> USBH_USR_ResetDevice
收←◆> Device Attached
收←◆> USBH_USR_ResetDevice
> Full speed device detected
收←◆> VID : 1908h
> PID : 1320h
收←◆> Mass storage device connected
收←◆> Manufacturer : Genericr
收←◆> Product : Mass storage
收←◆> Serial Number : 3858332209
收←◆> Enumeration completed

zerone 发表于 2017-7-29 16:57:58

不停的执行这句

case HOST_CLASS:   
    /* process class state machine */
    status = phost-&gt;class_cb-&gt;Machine(pdev, phost);
    USBH_ErrorHandle(phost, status);
    break;

换了个U盘后就不会不停的执行了。但还是显示
【1 - ViewR-ootDir】
挂载文件系统失败 (11)
打开根目录失败 (12)

zerone 发表于 2017-7-29 17:02:46

不停的产生 USBH_UNRECOVERED_ERROR 错误

eric2013 发表于 2017-7-30 15:29:54

回 zerone 的帖子

zerone:教程里用的是 USE_USB_OTG_HS端口吧,我要用 USE_USB_OTG_FS  端口要怎么改呢   (2017-07-29 13:21) images/back.gif

下载官方的软件包,里面有。

主要是修改MDK-&gt;Option-&gt;c/c++里面的预定义宏
修改初始化函数
修改使用的引脚。

跟我上面写的修改套路基本一样的。

莓可儿 发表于 2017-8-5 16:12:12

请问我用的是 USE_USB_OTG_FS端口,下载本程序,修改了MDK-&gt;Option-&gt;c/c++里面的预定义宏后,编译总是提示有四个错误,提示usb_core.c文件中的
TX0_FIFO_FS_SIZE,TX1_FIFO_FS_SIZE,TX2_FIFO_FS_SIZE,TX3_FIFO_FS_SIZE这四个变量没有定义。

但是下载安富莱之前的例程,也用的USE_USB_OTG_FS端口,TX0_FIFO_FS_SIZE~TX3_FIFO_FS_SIZE的几个变量也是没有定义涉及,但是程序确并不报错,不知道啥原因

eric2013 发表于 2017-8-5 16:39:42

回 莓可儿 的帖子

莓可儿:请问我用的是 USE_USB_OTG_FS端口,下载本程序,修改了MDK-&gt;Option-&gt;c/c++里面的预定义宏后,编译总是提示有四个错误,提示usb_core.c文件中的
TX0_FIFO_FS_SIZE,TX1_FIFO_FS_SIZE,TX2_FIFO_FS_SIZE,TX3_FIFO_FS_SIZE这四个变量没有定义。

但是下载安富莱之前的例程,也 .. (2017-08-05 16:12) images/back.gif

我们的V5和V6板子的例子都是FS做Device,HS做Host了。

下载官方的那个例子,里面有FS对应的Host

google 发表于 2018-5-30 15:43:36

请问移植后,容量支持64g的么?

ssssssss 发表于 2018-8-3 11:09:26

经典教程学习学习

caicaptain2 发表于 2018-8-7 11:18:16

这个说明文档有个错误,所有“usbd_usr.c”都应该为“usbh_usr.c”。例子中都是usb host,没有device

caicaptain2 发表于 2018-8-7 11:27:55

再问一个问题:
        result = f_mount(&fs, "2:", 0);        /* Mount a logical drive */
这里为什么盘符是"2:"   ???

eric2013 发表于 2018-8-7 11:30:23

caicaptain2 发表于 2018-8-7 11:27
再问一个问题:
        result = f_mount(&fs, "2:", 0);        /* Mount a logical drive */
这里为什么盘符是"2:"   ...

看下diskio.c文件里面的接口函数就明白了。多个存储设备时,设置的不同盘符。

caicaptain2 发表于 2018-8-7 11:32:48

eric2013 发表于 2018-8-7 11:30
看下diskio.c文件里面的接口函数就明白了。多个存储设备时,设置的不同盘符。


/* Definitions of physical drive number for each media */
#define FS_SD                0
#define FS_NAND                1
#define FS_USB                2

是这里定义的吗?   我以为这个例子都是SD卡的文件操作,以为是"0:" ?

eric2013 发表于 2018-8-7 11:37:08

caicaptain2 发表于 2018-8-7 11:32
/* Definitions of physical drive number for each media */
#define FS_SD                0
#define FS_NAND                1
...

SD卡是0,USB是2

caicaptain2 发表于 2018-8-8 08:47:38

本帖最后由 caicaptain2 于 2018-8-8 09:35 编辑

成功切换到PA11-12脚的Full-speed USB,此处来汇报一下,其中RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); 必须删除,不知何故??
我修改的初始化部分代码:
void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev)
{
GPIO_InitTypeDef GPIO_InitStructure;

/*USB HOST */
if (pdev ==&USB_OTG_Core)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_OTG1_FS);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_OTG1_FS);
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//此行代码必须删除掉,不知何故? 请版主帮忙解释一下?
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS, ENABLE);
}
}

void USB_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE *pdev)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* 先关闭所有和USB相关的中断 */
USB_OTG_BSP_DisableInterrupt();
/* USB Host */
if (pdev == &USB_OTG_Core)
{
NVIC_InitStructure.NVIC_IRQChannel = OTG_FS_IRQn; //此处有修改
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
}

使用的RTTview监控:


eric2013 发表于 2018-8-8 10:30:26

caicaptain2 发表于 2018-8-8 08:47
成功切换到PA11-12脚的Full-speed USB,此处来汇报一下,其中RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCF ...

这个SYSCFG主要是配置外部中断用的,应该没有影响的,你放在其它地方初始化看看。

caicaptain2 发表于 2018-8-8 10:53:32

"    (5) 修改USBH_Usr_cb_TypeDef USR_cb为USBD_Usr_cb_TypeDef USRH_cb。
         此文件的.h文件也要做相应的extern修改。"

这句话是什么意思? 看例程里面,没有这样子更改啊?

caicaptain2 发表于 2018-8-8 16:03:23

很奇怪的现象,不解中。。。以下代码来自usb_conf.h文件。 它们应该是设置缓存的。 如果所有数据都设置大一点,比如4倍,然后程序就死机了。。。
/****************** USB OTG FS CONFIGURATION **********************************/
#ifdef USB_OTG_FS_CORE
#define RX_FIFO_FS_SIZE                        128 //512
#define TX0_FIFO_FS_SIZE                         32//128
#define TX1_FIFO_FS_SIZE                         32//128
#define TX2_FIFO_FS_SIZE                         0
#define TX3_FIFO_FS_SIZE                         0
#define TXH_NP_FS_FIFOSIZ                         96 //128
#define TXH_P_FS_FIFOSIZ                        96 //128

eric2013 发表于 2018-8-8 18:01:59

caicaptain2 发表于 2018-8-8 10:53
"    (5) 修改USBH_Usr_cb_TypeDef USR_cb为USBD_Usr_cb_TypeDef USRH_cb。
         此文件的.h文件也要 ...
这个没事,估计是我有些地方记录有误。

eric2013 发表于 2018-8-8 18:07:15

caicaptain2 发表于 2018-8-8 16:03
很奇怪的现象,不解中。。。以下代码来自usb_conf.h文件。 它们应该是设置缓存的。 如果所有数据都设置大一 ...
F4系列的FIFO是固定大小的一块空间,不可超了。


caicaptain2 发表于 2018-8-9 10:11:28

本帖最后由 caicaptain2 于 2018-8-9 10:43 编辑

感谢Eric的细心答复,已经可以正常跑起来了。接的PA口,Full-speed的。 实测,
64G USB3.0的U盘也可以正常识别和操作;4G普通U盘也没有问题。
文件格式可以识别exfat。
读写速度基本在500kB/s左右
USBH_Process(&USB_OTG_Core, &USB_Host)这个函数很敏感,必须非常快速的频繁调用。 比如10ms一次。用了FreeRTOS。如果设定100ms一次调用,易死在此函数里面。
实际,系统已含Emwin,RTOS,USB,Fatfs,设置的stack为0x0c00即可,demofat的任务stack设定1024即可(实测占用462word)。毕竟,demo例程中使用的RAM太豪放。
一点遗憾,键入文件指令太快,或者太频繁(<0.5s),(比如列文件清单,)易死机,卡在USB的函数USBH_MSC_Read10(),原因不详。。。。

eric2013 发表于 2018-8-9 13:47:50

caicaptain2 发表于 2018-8-9 10:11
感谢Eric的细心答复,已经可以正常跑起来了。接的PA口,Full-speed的。 实测,
64G USB3.0的U盘也可以正常 ...

一定要实时调用这个USBH_Process(&USB_OTG_Core, &USB_Host),USB要消息不能得到及时处理。

另外你说的键入文件指令太快问题,换个U盘也许会好很多,现在的这个USB协议栈还是不太给力,不过比之前好很多了。

caicaptain2 发表于 2018-8-10 11:20:00

再提一个问题:如果把usbh_OpenMassStorage(); 放在FreeRTOS创建任务和启动调度器之前,会死在里面。

这是什么原因?

eric2013 发表于 2018-8-10 12:02:20

caicaptain2 发表于 2018-8-10 11:20
再提一个问题:如果把usbh_OpenMassStorage(); 放在FreeRTOS创建任务和启动调度器之前,会死在里面。

这 ...

打开后,函数USBH_Process(&USB_OTG_Core, &USB_Host)没有得的实时调用。

caicaptain2 发表于 2018-8-16 11:02:08

本帖最后由 caicaptain2 于 2018-8-16 11:13 编辑

继续总结一下子。。。 使用的fatfs13b版本,可以支持exfat

曾经把USBH_Process(&USB_OTG_Core, &USB_Host)和fatfs的文件处理放在两个不同的任务中,如果两个任务优先级不同,U盘识别枚举可以100%成功,但是100%出现FR_DISK_ERR。也就是无法读写文件。如果两个任务优先级相同,U盘识别枚举可以100%成功,但是偶尔FR_DISK_ERR。


参考ST的案列后,把fatfs的文件处理任务放在USBH_Process同一任务中,比如全部文件加载读写,全部放在函数 USBH_USR_MSC_Application中,一切就都OK了。。。。。。。

这说明,USBH_Process和fatfs的函数必须顺序操作,不能互相打断。 另外,函数 USBH_USR_MSC_Application()中可以插入vtaskdelay()之类的阻塞函数,不影响usb的识别和操作。

eric2013 发表于 2018-8-18 01:31:39

caicaptain2 发表于 2018-8-16 11:02
继续总结一下子。。。 使用的fatfs13b版本,可以支持exfat

曾经把USBH_Process(&USB_OTG_Core, &USB_Hos ...

{:33:}

Evan_Ji 发表于 2019-3-14 15:50:51

Mark学习了!!

sanit 发表于 2019-3-14 16:43:40

caicaptain2 发表于 2018-8-16 11:02
继续总结一下子。。。 使用的fatfs13b版本,可以支持exfat

曾经把USBH_Process(&USB_OTG_Core, &USB_Hos ...

最近移植GD的USB库也是这个现象,最好USB应用放在USBH_USR_MSC_Application()这个函数内部执行,稳定可靠。

廷润 发表于 2019-3-22 09:44:31

我有个STM32F105的产品,用官网的老资源,只能识别2GB以下的U盘。怎样可以让F105识别大一点的U盘?

Eric,麻烦给些idea,谢谢。

caicaptain2 发表于 2019-3-22 14:21:03

廷润 发表于 2019-3-22 09:44
我有个STM32F105的产品,用官网的老资源,只能识别2GB以下的U盘。怎样可以让F105识别大一点的U盘?

Eric ...

更换文件系统版本。 Fatfs可以用013b版本

eric2013 发表于 2019-3-23 02:43:18

廷润 发表于 2019-3-22 09:44
我有个STM32F105的产品,用官网的老资源,只能识别2GB以下的U盘。怎样可以让F105识别大一点的U盘?

Eric ...

你用的FAT16吗,如果是FAT16,的确是只能2GB。

廷润 发表于 2019-3-23 09:00:02

eric2013 发表于 2019-3-23 02:43
你用的FAT16吗,如果是FAT16,的确是只能2GB。

默认那一套是关联FAT16的驱动。

廷润 发表于 2019-3-23 09:06:22

caicaptain2 发表于 2019-3-22 14:21
更换文件系统版本。 Fatfs可以用013b版本

官网的老工程找到efsl,是替换这个模块吗?
\Loader\Utilities\Third_Party\efsl

xiashuang 发表于 2019-3-28 14:32:03

硬汉!我用的V5的USB-OTG-HS例程俢改成USB-OTG-FS,显示如下:
请选择操作命令:

1 - 显示根目录下的文件列表

2 - 创建一个新文件armfly.txt

3 - 读armfly.txt文件的内容

4 - 创建目录

5 - 删除文件和目录

6 - 读写文件速度测试

> Device Attached

> USBH_USR_ResetDevice

> Full speed device detected

> VID : 090Ch

> PID : 1000h

> Mass storage device connected

> Manufacturer : Kingstonr

> Product : DataTraveler G2

> Serial Number : AA000000000000000148

> Enumeration completed



【2 - CreateNewFile】

程序貌似就卡在这儿了,是还有什么地方没修改好吗?

马氏王朝 发表于 2022-3-1 09:15:30

caicaptain2 发表于 2018-8-9 10:11
感谢Eric的细心答复,已经可以正常跑起来了。接的PA口,Full-speed的。 实测,
64G USB3.0的U盘也可以正常 ...

插入64GU盘   写着写着会卡一段时间   再写
页: [1] 2
查看完整版本: STM32移植USB库2.2.0版本----USB Host之外挂U盘移植步骤及其注意事项,识别率很高,