打印
[STM32F4]

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

[复制链接]
92|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 还能不能正常运行。

使用特权

评论回复
5
Bblythe| | 2025-3-15 07:53 | 只看该作者
你有打开 FPU 硬件浮点支持吗?如果 FPU 没开启,可能会导致浮点运算异常影响 USB。

使用特权

评论回复
6
Pulitzer| | 2025-3-15 07:54 | 只看该作者
试试看用 int 进行计算,再在最后一步转换成 float,也许能减少浮点计算的影响。

使用特权

评论回复
7
帛灿灿| | 2025-3-15 07:55 | 只看该作者
这个现象有点像是浮点运算影响了中断执行时间,USB 通信可能因此被打乱了,能否看看 USB 的中断优先级?

使用特权

评论回复
8
Uriah| | 2025-3-15 07:56 | 只看该作者
会不会是 USB_Communication.Send_Union.Send_Struct.Dat_P3[2] 访问超出范围或者数据异常,导致后续运算影响了 USB?

使用特权

评论回复
9
Clyde011| | 2025-3-15 07:58 | 只看该作者
你可以在 PID_X.Tunel_Current 计算前后打印变量值,看看执行过程中有没有出现异常情况?

使用特权

评论回复
10
童雨竹| | 2025-3-15 07:59 | 只看该作者
你在 Keil 里运行正常,STM32CubeIDE 出问题,会不会是编译器优化等级不一样?试试调低优化级别看看?

使用特权

评论回复
11
万图| | 2025-3-15 08:00 | 只看该作者
你的 USB 是中断模式还是 DMA 传输的?如果是中断模式,可能是运算增加了中断延迟导致 USB 超时。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

4

帖子

0

粉丝