[STM32L4] USB 自定义 HID 底层驱动问题

[复制链接]
399|0
Treasure101 发表于 2025-11-13 16:18 | 显示全部楼层 |阅读模式

针对 STM32L433CB 芯片,我使用 STM32CubeMX和 Cube FW_L4 V1.17.0 固件包生成了自定义 HID代码。
我将CUSTOM_HID_FS_BINTERVAL设置为 5 毫秒,并配置了自定义 HID 描述符,同时调整了USBD_CUSTOMHID_OUTREPORT_BUF_SIZE和USBD_CUSTOM_HID_REPORT_DESC_SIZE,使其与我的描述符匹配。
但问题出现了,调用USBD_CUSTOM_HID_SendReport函数发送第一条消息后,通过 USB 分析仪可以观察到,总有无穷无尽的URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER帧,大约每 5 毫秒就会出现一条新消息。
在查阅 Cube 生成的 HAL 库代码后,我发现:在stm32l4xx_hal_pcd.c文件中,PCD_EP_ISR_Handler函数的末尾会持续调用HAL_PCD_EP_DB_Transmit函数。该函数用于处理 “中断类型” 端点,但我认为它的设计初衷是处理采用双缓冲的端点, 而从usbd_conf.c文件的配置可以看出,我们的 HID 端点采用的是单缓冲模式。
之后,我为USB_EP_CTR_TX中断编写了自定义处理函数,问题得以解决。

补充说明:经过多次测试,我的代码已能正常工作,现将补丁代码分享如下。我使用该补丁是为了持续传输 64 字节的 “单帧” 数据,且应用层中已实现传输超时机制。
修改位置:在stm32l4xx_hal_pcd.c文件的HAL_StatusTypeDef PCD_EP_ISR_Handler函数中,第 2500 行之后、紧接着以下代码处:

          else
          {
            /* Transfer is not yet Done */
            ep->xfer_buff += TxByteNbre;
            ep->xfer_count += TxByteNbre;
            (void)USB_EPStartXfer(hpcd->Instance, ep);
          }
        }

我加入的以下代码

   else if((ep->type == EP_TYPE_INTR) && ep->doublebuffer == 0) {
            /* multi-packet on the NON control IN endpoint */
            TxByteNbre = (uint16_t)PCD_GET_EP_TX_CNT(hpcd->Instance, ep->num);
            if (ep->xfer_len > TxByteNbre)
            {
              ep->xfer_len -= TxByteNbre;
            }
            else
            {
              ep->xfer_len = 0U;
            }

            /* Zero Length Packet? */
            if (ep->xfer_len == 0U)
            {
              /* TX COMPLETE */
  #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
              hpcd->DataInStageCallback(hpcd, ep->num);
  #else
              HAL_PCD_DataInStageCallback(hpcd, ep->num);
  #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
            }
        }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

72

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部