You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:05:29