针对 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 */
}
}
|
|