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

请问原子哥,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);

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

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

举报

14个回答
xmshao 最优答案 回答时间:2025-9-2 08:18:59

lvshaohua3774 发表于 2025-9-1 10:08
代码段如下(定时器初始化为打开定时):</p>
<p>

[md]下面文章可以参考下,希望能给你些提醒或启发。

为什么第一次测量结果有误?

lvshaohua3774 回答时间:2025-8-22 15:39:02

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

xmshao 回答时间:2025-8-22 15:57:13

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

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

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

lvshaohua3774 回答时间:2025-8-25 14:10:20

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

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

xmshao 回答时间:2025-8-25 14:42:56

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

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

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

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

lvshaohua3774 回答时间:2025-8-25 16:15:11

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

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

xmshao 回答时间:2025-8-25 17:07: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. 其实 关不关无所谓

lvshaohua3774 回答时间:2025-8-27 09:15:21

xmshao 发表于 2025-8-25 17:07
哦你现在的测试结果变了,不是最开始的信息了。</p>
<p>你可以代码简化下,既然每次从0开始计,这里就不用t ...

[md]我保持定时器初始化时,不开启定时,将程序修改为计时后 不停止定时器,程序段如下:

测试效果:初次上电 第一次计时 不正确,为46.610毫秒,后面再运行,则一直正确,均为0.432毫秒。

由此猜测:定时器从 停止状态 刚刚 被开启 后,短时间内,有可能对自己的寄存器做底层硬件操作,由于计算消耗时间很短,导致读出寄存器内容尚不正常,后面定时器已经运行起来,则重新开启的操作对定时器无影响。

此仅仅是我猜测的差别原因,不知道是否正确,希望有清楚定时器底层运行的高手,能予以解答。

搞了好久单片机,现在一个定时器让人瑟瑟发抖,以后用定时器都得小心翼翼,如能有人解惑,不胜感激!抱拳!抱拳!

同时感谢xmshao的积极回应,你的回应是我反复测试的动力和鼓励。

image.png
xmshao 回答时间:2025-8-27 10:02:13

lvshaohua3774 发表于 2025-8-27 09:15
我保持定时器初始化时,不开启定时,将程序修改为计时后 不停止定时器,程序段如下:</p>
<p>

[md]呵呵 STM32 TIMER有点内容哦。

如果你的测试代码就是上面的,回头我找STM32F407的开发板也测试下。

测试完毕后会将结果分享与你。

xmshao 回答时间:2025-8-28 16:25:25
xmshao 发表于 2025-8-27 10:02
[md]呵呵 STM32 TIMER有点内容哦。

如果你的测试代码就是上面的,回头我找STM32F407的开发板也测试下。

我这边基于下面代码做了测试,结果没有差异。


我大致知道你的原因了,估计是timeout第一次启动时多统计了一次。
注意在使能TIMER更新中断前 先 对更新事件标志清下零!
lvshaohua3774 回答时间:2025-8-29 16:46:50

xmshao 发表于 2025-8-28 16:25
我这边基于下面代码做了测试,结果没有差异。</p>
<p>

我的定时器3初始化时,溢出值设置为65535,如果有溢出,计时将超过65毫秒。实际结果没有超出,说明timeout值为0。对这个计时实际上没有影响。

你说的测试代码没有差异,是你那里不出问题,计时一直正确;还是说和我的结果相同,有异常现象?

xmshao 回答时间:2025-8-30 08:43:07

lvshaohua3774 发表于 2025-8-29 16:46
我的定时器3初始化时,溢出值设置为65535,如果有溢出,计时将超过65毫秒。实际结果没有超出,说明ti ...

[md]我的测试没有任何问题,计数TIMER一直没有停止情况下,连续测试多次,结果都是一样的,也正确的。

我见不到你完整的代码,但基本可以肯定是你代码方面有问题。

你可以先不直接计算绝对值,先只统计计数脉冲个数,这样可以更直观地观察结果和发现规律。

lvshaohua3774 回答时间:2025-9-1 10:08:58

xmshao 发表于 2025-8-30 08:43
我的测试没有任何问题,计数TIMER一直没有停止情况下,连续测试多次,结果都是一样的,也正确的。</p>
<p>...

[md]代码段如下(定时器初始化为打开定时):

TIM2->CNT=0;//重设TIM2定时器的计数器值
timeout=0;//溢出清零

TIM2->CR1|=0x0001;    //使能定时器2

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

// TIM2->CR1&=0xfffe; //关闭定时器2

time=TIM2->CNT+(u32)timeout*65536; //计算所用时间

sprintf((char*)buf,"%fms\r\n",time/1000);

LCD_ShowString16(0,120,buf);//显示字符串

lvshaohua3774 回答时间:2025-9-2 10:33:43

xmshao 发表于 2025-9-2 08:18
下面文章可以参考下,希望能给你些提醒或启发。</p>
<p>[为什么第一次测量结果有误?](<a href="https://mp.weixin.q">https://mp.weixin.q</a> ...

[md]感谢分享,分析的有道理,等得空了会仔细验证。还是对定时器底层运行过程了解不彻底,并且仍然使用寄存器开发,有些情况之前没遇到。谢谢关注和回复 抱拳

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