STM32F723 USB_CDC启用DMA后传输异常问题求助
STM32F723 USB CDC VCP DMA模式USBD_BUSY问题解决建议
针对你开启USB_OTG_HS内部DMA后,CDC_Transmit_HS持续返回USBD_BUSY的问题,以下是具体排查和解决步骤:
检查DMA传输完成回调的正确性
确保CDC_TransmitCplt_HS回调函数正确实现并被注册,这是DMA传输结束后重置TxState的关键。如果CubeMX生成的代码中缺少该回调,需手动在usbd_cdc_if.c中添加:void CDC_TransmitCplt_HS(uint8_t *Buf, uint32_t *Len) { USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceHS.pClassData; hcdc->TxState = USBD_OK; }同时确认在
USBD_CDC_HS_RegisterInterface函数中,已将pUserData->TransmitCplt指向该回调。调整DMA模式与优先级
- 在CubeMX的DMA配置界面,将USB_OTG_HS的DMA通道设置为Normal模式(而非Circular模式),批量传输场景下Normal模式更适配单次数据发送的完成状态反馈。
- 提升USB_OTG_HS DMA通道的优先级(比如设为High),避免被其他低优先级外设的DMA抢占,导致传输中断后无法完成状态更新。
规范CDC发送逻辑
- 发起新的
CDC_Transmit_HS调用前,必须检查hcdc->TxState是否为USBD_OK,确认上一次传输完全结束后再触发新传输,禁止连续调用发送函数。 - 不要在USB接收中断等上下文直接调用发送函数,建议通过消息队列或信号量,将发送任务转移到主循环或低优先级线程执行,避免DMA资源冲突。
- 发起新的
验证USB时钟与硬件配置
- 确认USB_OTG_HS的时钟严格配置为48MHz,时钟异常会导致DMA传输时序错误,可在CubeMX的Clock Configuration界面核对。
- 检查开发板USB_OTG_HS的硬件连接,确保VBUS供电正常、ID引脚配置正确(STM32F723 Discovery的USB_OTG_HS为device模式,ID引脚需接地)。
更新HAL库或修复CubeMX生成代码
部分旧版本的STM32CubeF7 HAL库存在DMA与USB CDC适配的bug,可尝试升级到最新稳定版;若CubeMX生成的代码中未正确启用USB_OTG_HS的DMA中断,需手动在stm32f7xx_it.c中添加中断服务函数的映射,确保DMA完成中断能被正确捕获。
内容的提问来源于stack exchange,提问作者CoObri
相关产品推荐
相关产品推荐

