[STM32F4] 加一个乘法运算时,USB 通信失败

[复制链接]
695|15
 楼主| cutfall 发表于 2025-3-14 22:58 | 显示全部楼层 |阅读模式
使用 SPI 通信从外部 ADC 获取数据。另外,我正在使用 USB OTG FS 与pc进行通信,但是当添加一个乘法运算时,USB 通信失败,当我删除此行时,USB 工作正常。

此代码在 Keil 中运行完美,但在 STMCUBE_IDE 中则不然。
PID_X.Tunel_Current=((float)(USB_Communication.Send_Union.Send_Struct.Dat_P3[2]-131074)*0.0001953);
PID_X.Tunel_Current=((float)(USB_Communication.Send_Union.Send_Struct.Dat_P3[2]-131074)*0.0001953);



void Analog_Digital_Converter::Get_All_Value_Adc(){         if(Analog_Digital_Converter::adc_get_value){                 USB_Communication.Send_Union.Send_Struct.Dat_P3[2] =        Analog_Digital_Converter::ADC_GetValue(Select_input_Ch_2,GPIO_PIN_9);                USB_Communication.Send_Union.Send_Struct.Dat_P3[3] =        Analog_Digital_Converter::ADC_GetValue(Select_input_Ch_3,GPIO_PIN_9);                USB_Communication.Send_Union.Send_Struct.Dat_P3[4] =        Analog_Digital_Converter::ADC_GetValue(Select_input_Ch_4,GPIO_PIN_9);                USB_Communication.Send_Union.Send_Struct.Dat_P3[5] =        Analog_Digital_Converter::ADC_GetValue(Select_input_Ch_5,GPIO_PIN_9);                USB_Communication.Send_Union.Send_Struct.Dat_P3[0] =        Analog_Digital_Converter::ADC_GetValue(Select_input_Ch_0,GPIO_PIN_9);                USB_Communication.Send_Union.Send_Struct.Dat_P3[1] =        Analog_Digital_Converter::ADC_GetValue(Select_input_Ch_1,GPIO_PIN_9);                PID_X.Tunel_Current=((float)(USB_Communication.Send_Union.Send_Struct.Dat_P3[2]-131074));                PID_X.Tunel_Current*=0.000019531;        }}






公羊子丹 发表于 2025-3-15 07:49 | 显示全部楼层
你这个问题看起来很奇怪,单单加一个乘法运算就影响 USB?会不会是优化或者编译器的问题?
周半梅 发表于 2025-3-15 07:50 | 显示全部楼层
试试在 PID_X.Tunel_Current 赋值后加个 volatile 关键字,看是不是优化导致的异常。
Wordsworth 发表于 2025-3-15 07:52 | 显示全部楼层
试着把 PID_X.Tunel_Current 计算部分用 __attribute__((optimize("O0"))) 禁用优化,看看 CubeIDE 还能不能正常运行。
Bblythe 发表于 2025-3-15 07:53 | 显示全部楼层
你有打开 FPU 硬件浮点支持吗?如果 FPU 没开启,可能会导致浮点运算异常影响 USB。
Pulitzer 发表于 2025-3-15 07:54 | 显示全部楼层
试试看用 int 进行计算,再在最后一步转换成 float,也许能减少浮点计算的影响。
帛灿灿 发表于 2025-3-15 07:55 | 显示全部楼层
这个现象有点像是浮点运算影响了中断执行时间,USB 通信可能因此被打乱了,能否看看 USB 的中断优先级?
Uriah 发表于 2025-3-15 07:56 | 显示全部楼层
会不会是 USB_Communication.Send_Union.Send_Struct.Dat_P3[2] 访问超出范围或者数据异常,导致后续运算影响了 USB?
Clyde011 发表于 2025-3-15 07:58 | 显示全部楼层
你可以在 PID_X.Tunel_Current 计算前后打印变量值,看看执行过程中有没有出现异常情况?
童雨竹 发表于 2025-3-15 07:59 | 显示全部楼层
你在 Keil 里运行正常,STM32CubeIDE 出问题,会不会是编译器优化等级不一样?试试调低优化级别看看?
万图 发表于 2025-3-15 08:00 | 显示全部楼层
你的 USB 是中断模式还是 DMA 传输的?如果是中断模式,可能是运算增加了中断延迟导致 USB 超时。
classroom 发表于 2025-3-20 13:41 | 显示全部楼层
两个 IDE 中的编译器优化设置是否一致。
laocuo1142 发表于 2025-3-20 16:00 | 显示全部楼层
在 STM32CubeIDE 中降低优化级别。
laocuo1142 发表于 2025-3-20 19:00 | 显示全部楼层
检查是否有任何中断优先级冲突或资源争用。
flycamelaaa 发表于 2025-3-20 22:00 | 显示全部楼层
如果 SPI 和 USB 通信共享相同的资源,则可能存在资源竞争。
尝试增加任务之间的延迟,或使用互斥机制来管理对共享资源的访问。
powerantone 发表于 2025-3-20 22:00 | 显示全部楼层
小概率是硬件问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

53

帖子

0

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