[STM32F4] 函数CDC_Receive_FS () 和USBD_CDC_ReceivePacket () 问题

[复制链接]
53|15
封存into 发表于 2026-6-29 19:11 | 显示全部楼层 |阅读模式
我的设备 USB 同时启用MSC 可移动磁盘 + CDC 虚拟串口。
MSC 功能完全正常;CDC 上行稳定运行两年无任何问题。
CDC 下行此前没做过完整测试,现在出现大约每 20 个字节就会出现 1 字节错乱。
PC 端用 TeraTerm 串口工具,上行 CDC 一直用来打印调试日志。
按下键盘输入字符时触发 CDC 接收中断;
我有一个简易 FreeRTOS 任务,把收到的数据原样回发输出,就在这里观测到数据错乱。
关闭某些无关 FreeRTOS 任务后,数据损坏直接消失;但这些任务逻辑和 USB 完全无关。因此我怀疑 USB 底层存在未做临界区保护的代码段,FreeRTOS 任务抢占切换破坏了 USB 接收时序 / 缓冲区。
这两个 CDC 接收函数是 CubeMX 标准生成代码里的接口。
但本项目三年前由其他人基于 CubeMX 创建,底层 USB 驱动沿用了自动生成的框架。

公羊子丹 发表于 2026-7-1 09:18 | 显示全部楼层
纯数学算结果是40,但21IC论坛发这个肯定不是小学算术,大概率两路AD采样值。建议单独断开一路负载,多次采样对比,排查共地干扰造成数值异常。
周半梅 发表于 2026-7-1 09:19 | 显示全部楼层
我怀疑这是两路并联电源的输出电流,之前调试双路并联供电时,直接相加数值和实测总电流对不上,记得测量时单独串入采样电阻分别读数。
帛灿灿 发表于 2026-7-1 09:22 | 显示全部楼层
调侃一下楼主,不会是单片机做两数相加逻辑出错了吧?如果是代码问题,确认变量类型,char类型上限小,很容易溢出导致计算结果错乱。
童雨竹 发表于 2026-7-1 09:23 | 显示全部楼层
只给两个相同数字很难判断场景,你说说20分别代表电压、电芯电压还是电阻?讲清楚硬件电路,我们才能给你对应的排查调试办法。
万图 发表于 2026-7-1 09:23 | 显示全部楼层
看着像两串锂电池单体电压,之前测串联电池总电压直接累加有误差,测量前把万用表表笔短接归零,消除仪表零点带来的微小偏差。
Wordsworth 发表于 2026-7-1 09:24 | 显示全部楼层
若是两路交流信号千万别直接相加,相位不同总和差距很大,拿示波器抓取两路波形,开启设备自带求和功能对比理论计算数值。
Bblythe 发表于 2026-7-1 09:25 | 显示全部楼层
这两个数值很像两路LED驱动支路功耗,单纯数字相加忽略二极管导通压降,算出来的总功率和整机实际功耗会有明显出入,这点一定要留意。
Pulitzer 发表于 2026-7-1 09:26 | 显示全部楼层
你检查过AD采集模块的基准电压吗?基准漂移会让两路读数同步偏移,用精密稳压源校准基准后,多采集几组数据取平均值再计算。
Uriah 发表于 2026-7-1 09:28 | 显示全部楼层
之前做双路温度采集换算求和,不开软件均值滤波时读数波动严重,开启滑动滤波后采集数据稳定,两者相加的结果也会更贴合实际工况。
Clyde011 发表于 2026-7-1 09:29 | 显示全部楼层
好奇楼主是在调试双路开关电源还是分压采集电路?如果是两路并联输出,还要考虑均流电阻损耗,不能只用原始采样数值简单汇总。
EmmaTT 发表于 2026-7-1 13:08 | 显示全部楼层
这USB下行问题,试试加入中断禁用标志,保护接收缓冲区,看能否稳定。
亚瑟 发表于 2026-7-2 17:00 | 显示全部楼层
看看你的任务调度,可能中断优先级设置有问题,导致任务切换时USB接收数据没处理好。试试调整中断优先级,或者优化任务调度策略。
Jacquetry 发表于 2026-7-3 14:28 | 显示全部楼层
看看FreeRTOS的中断优先级设置,确保USB中断优先级高于其他无关任务。
OliviaSH 发表于 2026-7-4 23:35 | 显示全部楼层
先检查中断优先级,确保CDC中断优先级高于其他无关任务中断,避免任务切换导致数据错乱。同时,确认USB缓冲区大小足够,避免溢出。
MessageRing 发表于 2026-7-6 13:49 | 显示全部楼层
看来是FreeRTOS的调度和USB中断处理冲突导致的,你可以尝试增加USB中断的优先级,或者优化FreeRTOS的任务调度策略,避免中断处理被打断。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

230

主题

288

帖子

0

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