当前位置: 首页 > news >正文

STM32F4xx usb库源码详解:HAL_PCDEx_SetRxFiFo 和 HAL_PCDEx_SetTxFiFo

HAL_PCDEx_SetRxFiFo 和 HAL_PCDEx_SetTxFiFo

这两个函数的作用是:该EndPoint数据传输最大数量的限定

除前面贴子里廛的影响数据传输量的函数外,这两个HAL_PCDEx_SetRxFiFo / HAL_PCDEx_SetTxFiFo函数也值得注意。

其一,这两个函数是有使用顺序的(参考USBD_LL_Init函数):HAL_PCDEx_SetRxFiFo先设置GRXFSIZ,然后HAL_PCDEx_SetTxFiFo中会用到这个GRXFSIZ。

另外,所有EP共享的Rx FIFO + 所有的Tx FIFO,最大允许在RAM中开辟的空间为1.25kB(i.e. max. 0x140 words)

下面的代码中,Tx_Offset是指bit0~15,存放的是地址偏移量。"<<16"是指bit16~31,存放是当前EndPoint的FIFO的大小。

/**
  * @brief  Set Tx FIFO
  * @param  hpcd PCD handle
  * @param  fifo The number of Tx fifo
  * @param  size Fifo size
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size)
{
  uint8_t i = 0;
  uint32_t Tx_Offset = 0U;
​
  /*  TXn min size = 16 words. (n  : Transmit FIFO index)
      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
     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.
     When DMA is used 3n * FIFO locations should be reserved for internal DMA registers */
  
    //the RAM size that must be allocated to the RxFIFO.
    Tx_Offset = hpcd->Instance->GRXFSIZ;
  
    /*
    DIEPTXF0_HNPTXFSIZ <=equivalent to DIEPTXF0=>
    DEVICE MODE:
    Bits 31:16 TX0FD: Endpoint 0 TxFIFO depth
        This value is in terms of 32-bit words.
        Minimum value is 16 Maximum value is 256
    Bits 15:0 TX0FSA: Endpoint 0 transmit RAM start address
        This field contains the memory start address for the endpoint 0 transmit FIFO RAM
        
    DIEPTXFx
    Bits 31:16 INEPTXFD: IN endpoint TxFIFO depth
        This value is in terms of 32-bit words.
        Minimum value is 16 
        The power-on reset value of this register is specified as the largest IN endpoint FIFO number depth.
    
    Bits 15:0 INEPTXSA: IN endpoint FIFOx transmit RAM start address
        This field contains the memory start address for IN endpoint transmit FIFOx. The address must be aligned with a 32-bit memory location. 
    */
  if(fifo == 0){      
    hpcd->Instance->DIEPTXF0_HNPTXFSIZ = (uint32_t)(((uint32_t)size << 16U) | Tx_Offset);
  }
  else
  {
    Tx_Offset += (hpcd->Instance->DIEPTXF0_HNPTXFSIZ) >> 16U;
    for (i = 0; i < (fifo - 1); i++)
    {
      Tx_Offset += (hpcd->Instance->DIEPTXF[i] >> 16U);
    }
    
    /* Multiply Tx_Size by 2 to get higher performance */
    hpcd->Instance->DIEPTXF[fifo - 1] = (uint32_t)(((uint32_t)size << 16U) | Tx_Offset);        
  }
  
  return HAL_OK;
}

 

相关文章:

  • Libuv 1.34.2 源码详解 ---- 以uvCat为例讲解
  • 步进电机的细分驱动中1-2相, W1-2相, 2W1-2相, 4W1-2相 表示什么意思?
  • MCU_关于STM32Fxxx中断EXTI产生时多次(两次)进入中断的原因
  • MCU_通过windows串口API控制RTS和DTR
  • MCU_STM32的HAL库中的宏DMA_FLAG_TCIF0_4/DMA_FLAG_TCIF1_5/DMA_FLAG_TCIF2_6/DMA_FLAG_TCIF3_7
  • LWIP_TCP如何理解数据发送,何时使用tcp_recved函数
  • MCU_使用STM32CUBEMX配置STM32F107/407 RMII-ETHERNET要注意的细节:PHY Address和MCO时钟
  • MCU_STM32CUBEMX v5.5.0的一个BUG:ethernetif_input引起进入HardFault_Handler
  • MCU_STM32CUBEMX配置生成CAN2的初始化代码的修改
  • MCU_STM32F4xx使用CCM RAM
  • MCU_C语言中 数组型指针 的应用 -- char (*stringp)[]
  • Anaconda 安装yaml
  • pip(easy_install)anaconda本地安装文件包(附gluon-cv的升级过程)
  • vscode如何安装官方提供的Microsoft.python.language server包?
  • MXNet gpu 版本快速安装(mxnet-cu101)
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 《剑指offer》分解让复杂问题更简单
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【个人向】《HTTP图解》阅后小结
  • 2017届校招提前批面试回顾
  • Django 博客开发教程 8 - 博客文章详情页
  • EOS是什么
  • java概述
  • laravel 用artisan创建自己的模板
  • Linux快速复制或删除大量小文件
  • node入门
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • XForms - 更强大的Form
  • 订阅Forge Viewer所有的事件
  • 分布式任务队列Celery
  • 入门级的git使用指北
  • 实现简单的正则表达式引擎
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 小程序开发中的那些坑
  • 正则表达式小结
  • elasticsearch-head插件安装
  • 仓管云——企业云erp功能有哪些?
  • ​插件化DPI在商用WIFI中的价值
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (1)bark-ml
  • (16)Reactor的测试——响应式Spring的道法术器
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (ZT)出版业改革:该死的死,该生的生
  • (八)Spring源码解析:Spring MVC
  • (附源码)php新闻发布平台 毕业设计 141646
  • (转)Google的Objective-C编码规范
  • .naturalWidth 和naturalHeight属性,
  • .net core 6 集成和使用 mongodb
  • .NET MVC第三章、三种传值方式
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)