
你好,我在进行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); 补充说明:我的定时器在初始化时,是停止运行的,测试前开始,测试后立即停止,之后再统计时间 |
debug选项卡中的trace enable选项是灰色的无法勾选
STM32F407ZGT6的SD卡通过DMA控制时,无法从外部SRAM取数据
STM32F407读写U盘出现程序卡死问题
我最近在用stm32f407做CAN通讯的回环+静默,但是现在显示可以成功发送数据,FIFO接收不到数据,这是什么原因啊
vscode如何使用CUBECTL
串口空闲+DMA接收GPS信号,空闲中断触发时间不对。
求助:I2S通过DMA搬运后通过USB上传上位机,转为.wav文件后声音嘈杂,音质很差,基本听不出人声
STM32F407VET6 I2S 采用纯中断接收数据的问题
关于AN2867文档的疑问
tougfx 显示问题
[md]下面文章可以参考下,希望能给你些提醒或启发。
为什么第一次测量结果有误?
补充一下,原子哥统计时间为:0.584毫秒 我自己统计下来是46.612毫秒(我使用的更高的主频,但是相差没道理这么大)
类似测试我做过,没有具体关心绝对时间,只是比较是否使用FPU单元的时间差,开与不开相差10倍以上。
还有,代码方面这里看不出问题来,不过相信原子测试的没问题。倾向怀疑你计算有误或者你的配置有问题。
关于STM32浮点运算单元FPU的小话题
[md]多谢回复,经过硬件验证,原子哥的时间是正确的,重要区别在于,定时器3初始化时,原子哥初始化程序中就使能了定时器;我的程序初始化时,仅初始化参数,未使能定时器,在准备计时前才使能计时。其中产生区别的原理尚未想明白。希望大神不吝赐教
[md]不应该啊,你现在测得的时间是别人多少倍了。我不知你的主频及测试代码跟 原子那边的是否一样。
你这样操作更合理,原子初始化后就启动了计数器,这难免或多计些时间进来。按理如果你们的芯片及主频、还有测试代码一样,测试IDE及优化一样的话,你的结果怎么会跟他那么大差别呢?
如果你能清晰的判断出原子的测试没问题,应该就不难找出你跟它的差别在哪里了。
[md]我能确定原子哥的没错,是因为,我在计算前和计算后,控制了一个IO的电平,用示波器观察,确实是符合原子哥的结果。我自己的程序,主频设到216M了,原子哥是168M,时间我自己的是0.432毫秒,原子哥是0.584毫秒也是符合区别范围的,我也觉得我的控制方法更科学,但是结果确实不正确。只要在TIME3初始化时,也打开定时器,就能正常,无论我的方法还是原子哥计算,都能得到正确值,还在研究中,有结果我会及时反馈
[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. 其实 关不关无所谓
[md]我保持定时器初始化时,不开启定时,将程序修改为计时后 不停止定时器,程序段如下:
测试效果:初次上电 第一次计时 不正确,为46.610毫秒,后面再运行,则一直正确,均为0.432毫秒。
由此猜测:定时器从 停止状态 刚刚 被开启 后,短时间内,有可能对自己的寄存器做底层硬件操作,由于计算消耗时间很短,导致读出寄存器内容尚不正常,后面定时器已经运行起来,则重新开启的操作对定时器无影响。
此仅仅是我猜测的差别原因,不知道是否正确,希望有清楚定时器底层运行的高手,能予以解答。
搞了好久单片机,现在一个定时器让人瑟瑟发抖,以后用定时器都得小心翼翼,如能有人解惑,不胜感激!抱拳!抱拳!
同时感谢xmshao的积极回应,你的回应是我反复测试的动力和鼓励。
[md]呵呵 STM32 TIMER有点内容哦。
如果你的测试代码就是上面的,回头我找STM32F407的开发板也测试下。
测试完毕后会将结果分享与你。
我这边基于下面代码做了测试,结果没有差异。
我大致知道你的原因了,估计是timeout第一次启动时多统计了一次。
注意在使能TIMER更新中断前 先 对更新事件标志清下零!
我的定时器3初始化时,溢出值设置为65535,如果有溢出,计时将超过65毫秒。实际结果没有超出,说明timeout值为0。对这个计时实际上没有影响。
你说的测试代码没有差异,是你那里不出问题,计时一直正确;还是说和我的结果相同,有异常现象?
[md]我的测试没有任何问题,计数TIMER一直没有停止情况下,连续测试多次,结果都是一样的,也正确的。
我见不到你完整的代码,但基本可以肯定是你代码方面有问题。
你可以先不直接计算绝对值,先只统计计数脉冲个数,这样可以更直观地观察结果和发现规律。
[md]代码段如下(定时器初始化为打开定时):
// TIM2->CR1&=0xfffe; //关闭定时器2
time=TIM2->CNT+(u32)timeout*65536; //计算所用时间
sprintf((char*)buf,"%fms\r\n",time/1000);
LCD_ShowString16(0,120,buf);//显示字符串
[md]感谢分享,分析的有道理,等得空了会仔细验证。还是对定时器底层运行过程了解不彻底,并且仍然使用寄存器开发,有些情况之前没遇到。谢谢关注和回复 抱拳