你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

请问原子哥,STM32F407例程力,FFT测试章节里,计算时间统计正确吗?

[复制链接]
lvshaohua3774 提问时间:2025-8-22 15:36 / 未解决

你好,我在进行STM32F407例程力,DSP测试的FFT测试章节里,自己写的测试时间统计和原子哥的不同,差别非常大,不确定是否正确,请大家帮忙验证,谢谢!

程序不同部分如下:

原子哥 :TIM3->CNT=0;//**重设 TIM3 定时器的计数器值 timeout=0; arm_cfft_radix4_f32(&scfft,fft_inputbuf); //FFT 计算(基 4**) time=TIM3->CNT+(u32)timeout*65536; //**计算所用时间 *sprintf((char)buf,"%0.3fms\r\n",time/1000); *LCD_ShowString(30+128,160,100,16,16,buf); //**显示运行时间

自己写的:

TIM3->CNT=0;//重设TIM3定时器的计数器值 timeout=0;//溢出清零 TIM3->CR1|=0x01; //使能定时器3 arm_cfft_radix4_f32(&scfft,fft_inputbuf); //FFT计算(基4) TIM3->CR1&=0xFE; //关闭定时器3 time=TIM3->CNT+(u32)timeout65536; //计算所用时间 sprintf((char)buf,"%0.3fms\r\n",time/1000);

补充说明:我的定时器在初始化时,是停止运行的,测试前开始,测试后立即停止,之后再统计时间

收藏 评论6 发布时间:2025-8-22 15:36

举报

6个回答
lvshaohua3774 回答时间:4 天前

补充一下,原子哥统计时间为:0.584毫秒 我自己统计下来是46.612毫秒(我使用的更高的主频,但是相差没道理这么大)

xmshao 回答时间:4 天前

类似测试我做过,没有具体关心绝对时间,只是比较是否使用FPU单元的时间差,开与不开相差10倍以上。

还有,代码方面这里看不出问题来,不过相信原子测试的没问题。倾向怀疑你计算有误或者你的配置有问题。

关于STM32浮点运算单元FPU的小话题

lvshaohua3774 回答时间:昨天 14:10

xmshao 发表于 2025-8-22 15:57
类似测试我做过,没有具体关心绝对时间,只是比较是否使用FPU单元的时间差,开与不开相差10倍以上。</p>
<p>...

[md]多谢回复,经过硬件验证,原子哥的时间是正确的,重要区别在于,定时器3初始化时,原子哥初始化程序中就使能了定时器;我的程序初始化时,仅初始化参数,未使能定时器,在准备计时前才使能计时。其中产生区别的原理尚未想明白。希望大神不吝赐教

xmshao 回答时间:昨天 14:42

lvshaohua3774 发表于 2025-8-25 14:10
多谢回复,经过硬件验证,原子哥的时间是正确的,重要区别在于,定时器3初始化时,原子哥初始化程序 ...

[md]不应该啊,你现在测得的时间是别人多少倍了。我不知你的主频及测试代码跟 原子那边的是否一样。

你这样操作更合理,原子初始化后就启动了计数器,这难免或多计些时间进来。按理如果你们的芯片及主频、还有测试代码一样,测试IDE及优化一样的话,你的结果怎么会跟他那么大差别呢?

如果你能清晰的判断出原子的测试没问题,应该就不难找出你跟它的差别在哪里了。

lvshaohua3774 回答时间:昨天 16:15

xmshao 发表于 2025-8-25 14:42
不应该啊,你现在测得的时间是别人多少倍了。我不知你的主频及测试代码跟 原子那边的是否一样。</p>
<p>你 ...

[md]我能确定原子哥的没错,是因为,我在计算前和计算后,控制了一个IO的电平,用示波器观察,确实是符合原子哥的结果。我自己的程序,主频设到216M了,原子哥是168M,时间我自己的是0.432毫秒,原子哥是0.584毫秒也是符合区别范围的,我也觉得我的控制方法更科学,但是结果确实不正确。只要在TIME3初始化时,也打开定时器,就能正常,无论我的方法还是原子哥计算,都能得到正确值,还在研究中,有结果我会及时反馈

xmshao 回答时间:昨天 17:07

lvshaohua3774 发表于 2025-8-25 16:15
我能确定原子哥的没错,是因为,我在计算前和计算后,控制了一个IO的电平,用示波器观察,确实是符合 ...

[md]哦你现在的测试结果变了,不是最开始的信息了。

你可以代码简化下,既然每次从0开始计,这里就不用timeout及相关运算了。

如果坚持用timeout这个量也可以,干脆再加个临时变量temp.

这样测试下:

TIM3->CNT=0;//重设TIM3定时器的计数器值 timeout=0;

TIM3->CR1|=0x01; //使能定时器3

arm_cfft_radix4_f32(&scfft,fft_inputbuf); //FFT计算(基4)

uint32_t temp = TIM3->CNT;

time=temp + (u32)timeout*65536;

TIM3->CR1&=0xFE; //关闭定时器3. 其实 关不关无所谓

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版