STM32 USB高速USB端口加持4G联网

1、前言

      关于STM32F4USB驱动程序(FULL SPEED)目前是可以用,但是有很多问题,比如NAK的问题,导致U盘读写出错。USB底层驱动程序中进行OUT传输时必须增加一个1ms延时的问题。等等储多问题。本文高速USB的驱动程序参考了网友@sakumisu的文章:[基于 CherryUSB 调试 dwc2 usb host 笔记](https://club.rt-thread.org/ask/article/9c31ce71ead26c2b.html "基于 CherryUSB 调试 dwc2 usb host 笔记"),感谢他在USB方面做出的研究与调试。

  
2、STM32高速USB的调试

     STM32高还USB可以使用内部DMA来进行USB的数据包的传输,会大增加USB通信的速度,同时可以解决使用FULL SPEED过程中遇到的各种问题,因此花时间来修改STM32F的USB驱动程序,把USB RNDIS设备驱动更换到高速USB接口,代码的修改的几个方面如下:


    
2.1 IO口的初始化

    使用高速USB接口要更换 USB的IO管脚, 大家所熟知的PA10, PA11只能用于全速USB,换成高速USB后要使用PB14, PB15管脚本,程序做如下初始化。
   

 void HAL_HCD_MspInit(HCD_HandleTypeDef* hpcd)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(hpcd->Instance==USB_OTG_FS)
  {
  /* USER CODE BEGIN USB_OTG_FS_MspInit 0 */

  /* USER CODE END USB_OTG_FS_MspInit 0 */
   __HAL_RCC_GPIOA_CLK_ENABLE();
   
    /**USB_OTG_FS GPIO Configuration    
    PA12     ------> USB_OTG_FS_DP
    PA11     ------> USB_OTG_FS_DM 
    PA9      ------> USB_VBUS
    */
    GPIO_InitStruct.Pin = GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    //HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


    GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_11;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

     /* Peripheral clock enable */
    __HAL_RCC_USB_OTG_FS_CLK_ENABLE();
    /* USB_OTG_FS interrupt Init */
    HAL_NVIC_SetPriority(OTG_FS_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(OTG_FS_IRQn);

  /* USER CODE BEGIN USB_OTG_FS_MspInit 1 */

  /* USER CODE END USB_OTG_FS_MspInit 1 */
  }
  else if(hpcd->Instance==USB_OTG_HS)
  {

     __HAL_RCC_GPIOB_CLK_ENABLE();

    GPIO_InitStruct.Pin = GPIO_PIN_14 | GPIO_PIN_15;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF12_OTG_HS_FS;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    /* Peripheral clock enable */
    __HAL_RCC_USB_OTG_HS_CLK_ENABLE();
    /* USB_OTG_FS interrupt Init */
    HAL_NVIC_SetPriority(OTG_HS_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(OTG_HS_IRQn);
  }

}

      调试程序时,总想着这地方简单,不会搞错,结果USB驱动部分程序改好了后,怎么调试都无法进入USB中断,最后检查到这里是USB高速管脚配置成GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS导致的,修改这部分代码时没有查看手册,根据GPIO_AF10_OTG_FS的宏定义查看到有GPIO_AF10_OTG_HS定义,就直接改了导致的。看来总在小河沟里翻船呀,总以为这里简单,不会出错。结果因为IO的配置的问题已经遇到了2次了,上一次是调试SPI2驱动程序,修改IO看手册,看手册。

2.2 USB驱动程序的修改

     USB驱动程序的修改,主要修改了操作系统设备驱动程序接口drv_usbh.c文件,在这个文件中对USB驱动使用全速USB与高速USB全部做了初始化,采用宏定义DRV_USBH_USE_HS来进行切换。此宏定义可以在rtconfig.h中增加,定义此宏表示使用高速USB,不定义使用全速USB。代码很多,请参考博客后面的git仓库链接。

    STM32F低层USB驱动程序的改进,改进时兼容原来全速USB的功能。具体的改进点如下:

1、使用高速USB时,需要打开DMA设置。

2、使用高速USB时,需要关闭NAK中断,如果不关NAK中断会调程序调到你怀疑人生。

3、驱动程序使用高速USB端口,实际工作在全速的模式。

4、使用时注意硬件管脚的变化,可以直接采用跳线连接USB口到PB14, PB15上面。

STM32 USB高速USB端口加持4G联网_第1张图片


 

 3、代码仓库

     上面所做的高速USB的驱动程序的优化已经上传到GIT仓库上面。参见版本标签V1.2STM32 USB HOST驱动4G网卡https://github.com/longtengmcu/USB-HOST-driver-4G-rndis-device

 4、性能提升

        采用FTP下载文件并且写入到FLASH中的测试方式,下载一个310Kbyte文件,使用全速USB时下载时间为10秒,使用高速USB时下载时间约7秒。最关键的时解决了全速USB驱动设备时各种返回NAK的问题。如果此文对你有帮助,打赏请我喝茶。

        参考文章:首创STM32 USB主机驱动4G rndis设备https://blog.csdn.net/fhqlongteng/article/details/117398738?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165718138716782388036335%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165718138716782388036335&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-117398738-null-null.185%5Ev2%5Econtrol&utm_term=%E9%A6%96%E5%88%9B&spm=1018.2226.3001.4450

你可能感兴趣的:(RT,Thread,编程经验,stm32,USB,RNDIS)