[STM32F4] CubeMX 固件库中的 USB CDC Bug

[复制链接]
94|15
Treasure101 发表于 2026-8-2 22:35 | 显示全部楼层 |阅读模式
我在 STM32F4 Discovery 上想要正常初始化 USB 虚拟串口(VCP)。
一开始我修改代码:
pdev->pClassData = USBD_malloc(sizeof (USBD_CDC_HandleTypeDef));
改为
pdev->pClassData = (void *) USBD_malloc(sizeof (USBD_CDC_HandleTypeDef));
不加强制类型转换时,pClassData***等于 NULL,导致上层函数usbd_cdc.c内的USBD_CDC_Init直接退出,接口初始化失败。
继续测试问题发现源头在 usbd_cdc.h 宏定义:
#define CDC_DATA_HS_MAX_PACKET_SIZE        512
将这个数值修改为 256 之后,虚拟串口就能正常工作。
VCP 数据回显示例代码,添加到 usb_cdc_if.c 的 CDC_Receive_FS 回调函数内:
static uint8_t buff_RX[256];
static uint8_t buff_TX[256];
int i = 0;

for (i = 0; i < *Len; i++)
    buff_TX[i] = buff_RX[i];

USBD_CDC_SetTxBuffer(&hUsbDeviceFS, &buff_TX[0], *Len);
USBD_CDC_TransmitPacket(&hUsbDeviceFS);

USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &buff_RX[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
同时在文件头部增加外部声明:
extern USBD_HandleTypeDef hUsbDeviceFS;

七毛钱 发表于 2026-8-3 16:12 | 显示全部楼层
强制类型转换只解决编译警告,不影响运行时指针是否为NULL,说明malloc本身可能返回了NULL。
classroom 发表于 2026-8-3 16:43 | 显示全部楼层
可能你的USB配置实际工作在FS模式而非HS模式。
cr315 发表于 2026-8-3 17:17 | 显示全部楼层
pClassData是void*类型,不强制转换也不会导致赋值失败,问题应该在heap配置不足。
duo点 发表于 2026-8-3 17:58 | 显示全部楼层
检查CubeMX里USB_DEVICE选的是Full Speed还是High Speed,选错了就会包长不匹配。
flycamelaaa 发表于 2026-8-3 18:30 | 显示全部楼层
回调里的buff_TX和buff_RX都是局部数组,分配在栈上,如果Len超过256就会溢出。
jcky001 发表于 2026-8-3 19:10 | 显示全部楼层
CDC_Receive_FS回调是在USB中断上下文里执行的,里面做循环拷贝和发送会影响中断响应。
onlycook 发表于 2026-8-3 20:18 | 显示全部楼层
每次收到数据后重新设置RxBuffer地址再调用ReceivePacket,这个操作是必须的,你做对了。
powerantone 发表于 2026-8-3 20:49 | 显示全部楼层
外部声明hUsbDeviceFS说明你在单独的文件里调用,注意这个句柄要在初始化完成后才有效。
probedog 发表于 2026-8-3 21:19 | 显示全部楼层
改成256后能工作不代表Bug在库,可能是你的描述符里最大包长配置和宏定义不匹配。
solty 发表于 2026-8-3 22:59 | 显示全部楼层
如果堆空间不够,可以增加HEAP_SIZE,或者用静态数组替代USBD_malloc来避免动态分配失败。
solty 发表于 2026-8-3 22:59 | 显示全部楼层
如果堆空间不够,可以增加HEAP_SIZE,或者用静态数组替代USBD_malloc来避免动态分配失败。
spicy 发表于 2026-8-3 22:12 | 显示全部楼层
高频率收发数据时,这种同步回显方式可能丢包,因为发送和接收共用同一个中断处理函数。
stormwind123 发表于 2026-8-4 10:18 | 显示全部楼层
建议先确认USB连接速率,通过读取USB_OTG_HS或FS的GUSBCFG寄存器来调试。
内政奇才 发表于 2026-8-4 12:40 | 显示全部楼层
你修改的宏定义在usbd_cdc.h里,但F4的CDC描述符默认用64字节,改512本来就不该用。
jf101 发表于 2026-8-4 18:13 | 显示全部楼层
USB配置实际工作模式确认一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

200

主题

200

帖子

1

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