STM32U585基于USBX实现DFU+VCP复合设备仅DFU识别问题咨询
问题说明
在STM32U585 MCU上基于USBX中间件开发集成DFU、VCP(CDC ACM)功能的USB复合设备时,参考两个官方独立例程移植代码,单独运行例程功能正常,合并工程后已通过ux_device_stack_class_register注册DFU与CDC ACM两类设备,但启动USB外设后PC端仅能识别DFU类设备,怀疑端点FIFO配置错误导致CDC ACM无法正常枚举。
开发环境
- MCU型号:STM32U585QIIx
- STM32CubeMX版本:6.5.0
- 固件包版本:STM32Cube FW_U5 V1.1.0
根因分析
该问题绝大多数情况是FIFO配置缺失导致,附带存在描述符配置错误的可能:
- STM32U5的USB OTG FS模块在设备模式下共有1.25KB(1280字节,折合320个32位word)的专用FIFO RAM,所有端点的收发缓存都从这块空间分配,必须为所有用到的IN端点单独配置发送FIFO,为所有OUT端点配置共享的接收FIFO,分配不能重叠、不能超过总空间上限。
- 单DFU例程仅使用默认控制端点EP0完成所有传输,原有FIFO配置只覆盖了EP0,没有为CDC ACM类用到的3个额外端点分配FIFO,导致CDC相关端点无法正常收发数据,枚举过程中主机无法获取CDC类的描述符信息,自然只能识别到枚举顺序靠前的DFU设备。
解决方案
第一步:确认端点分配无冲突
先核对复合设备的端点规划,避免地址冲突:
- EP0(默认控制端点):双向,最大包长64字节,供DFU类、标准枚举请求共用
- CDC ACM类额外占用3个端点:
- 中断IN端点:地址
0x81(端点1,方向为设备到主机),最大包长8字节,用于发送串口状态通知 - 批量OUT端点:地址
0x02(端点2,方向为主机到设备),最大包长64字节,用于接收主机下发的串口数据 - 批量IN端点:地址
0x82(端点2,方向为设备到主机),最大包长64字节,用于向主机发送串口数据
- 中断IN端点:地址
- DFU类不需要额外端点,所有传输复用EP0即可。
第二步:按规则配置FIFO
FIFO配置单位为32位word(即4字节),所有配置必须在调用HAL_PCD_Start前完成:
- 配置共享接收FIFO(RxFIFO)
RxFIFO供所有OUT端点共用,仅需配置1次,从FIFO RAM起始地址开始分配,大小需要覆盖最大OUT包长+协议开销,按当前端点规划配置为64 word(256字节)足够:HAL_PCDEx_SetRxFiFo(&hpcd_USB_OTG_FS, 0x40); - 按端点号从小到大依次配置每个IN端点的独立发送FIFO(TxFIFO),从RxFIFO结束地址之后连续分配,不能重叠:
- 配置EP0的发送FIFO:最大包长64字节,分配17 word(68字节)
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x11); - 配置CDC中断IN端点(EP1)的发送FIFO:最大包长8字节,分配3 word(12字节)
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 1, 0x3); - 配置CDC批量IN端点(EP2)的发送FIFO:最大包长64字节,分配17 word(68字节)
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 2, 0x11);
- 配置EP0的发送FIFO:最大包长64字节,分配17 word(68字节)
上述配置总占用FIFO空间为64+17+3+17=101 word,远小于320 word的总上限,不存在溢出风险。
第三步:排查其他易漏配置
如果配置完FIFO仍无法识别,需要检查以下两个配置项:
- 核对配置描述符总长度:复合设备的配置描述符需要按顺序包含DFU接口+DFU功能描述符、CDC控制接口+CDC功能描述符+CDC中断IN端点描述符、CDC数据接口+CDC批量OUT/IN端点描述符,总长度计算错误会导致主机无法读取完整描述符,只能识别第一个设备类。
- 核对类注册参数:调用
ux_device_stack_class_register注册类时,传入的接口号、端点地址必须和描述符中定义的完全一致,避免接口号冲突、端点地址传参错误。
内容的提问来源于stack exchange,提问作者mejha
相关产品推荐
相关产品推荐

