[应用相关]

实在看不下去了,STM32软件精确延时的方法!!!!!!

[复制链接]
楼主: zhonggx
手机看帖
扫描二维码
随时随地手机跟帖
mintspring| | 2015-6-25 20:02 | 显示全部楼层
不上系统还行,但是我不喜欢用,麻烦,不过精确延时的确可以

使用特权

评论回复
kseeker| | 2015-6-25 23:47 | 显示全部楼层
只要说到用计时器实现软件精确延时,总会有两种跟帖:
1,贴上一段神奇的代码,号称非常精确。事实上这种代码比用定时器的方法难理解的多。而且对于stm32这样连取指时间都不确定的MCU,我真的很怀疑这类代码的可靠性。
2,你的代码是死等,死等不好,程序架构啦,执行效率啦,程序复杂了如何如何啦,巴拉巴拉一大堆。
3,浪费一个计数器。stm32上计数器那么多,很难全都占了。即使有其他用处的计数器,常常也可以顺便用于延时。再说,就SysTick来说,不用操作系统没理由占用了。
总的来说,不知道为什么,在这个问题上,很多人异常的固执,你说什么都白说,他们总能找出一堆理由拒绝使用定时器。就我个人来说,定时器是首选,不是实在没办法,我不会考虑其他方法。

最后说一个现实的问题,如果用了操作系统,死等的延时基本上只能保证一个精确的下限,无法保证精确的上限。因为你等待期间可能被切换走了,再切换回来的时候定时器已经不知道是什么时候了。这个问题和中断类似,但往往要严重的多。
但是,实际使用中,等待若干微妙或若干毫秒的问题,常常只是需要等待至少若干微妙或若干毫秒。等的时间不够,任务就会出错,但等的时间长了只是系统响应慢一点,如果中断和切换发生的不多,影响就可以忽略。

不过使用systick可能导致问题更加恶化,由于系统是基于systick->LOAD进行任务切换的,切换回来时systick可能已经走了好几圈,基于systick的判断将出错并将中间的那些圈数全部丢掉,实际的延时可能变成设定值的若干倍,如果你用来等待几十甚至几百毫秒,问题可能会很严重。所以如果使用操作系统,只要可能还是另找一个计数器吧,systick个人建议就别用了。



使用特权

评论回复
pwppwpw| | 2015-6-26 10:38 | 显示全部楼层
kseeker 发表于 2015-6-25 23:47
只要说到用计时器实现软件精确延时,总会有两种跟帖:
1,贴上一段神奇的代码,号称非常精确。事实上这种代 ...

是啊,【软件延时】真的是个仁者见仁智者见智的问题。不存在某种完美的方式,而只有最适合实际需求的方法。

很多前辈们大概是在自己的项目中发现了某种极为合适的延时方法,一时比较兴奋,所以在拿出来讨论的时候有些激动罢!

使用特权

评论回复
pwppwpw| | 2015-6-26 10:45 | 显示全部楼层
话说这STM32的systick还真是神奇的存在,本质上差不多就是一普通定时器换个名字,在官方的定义中就从“外部资源"变成了“内部资源”了。
然后便肩负起了比普通TIM更多的”责任“,比如跑OS的时候提供OS的tick之类的。。。

总之,systick的使用还是值得大家探讨的!

使用特权

评论回复
FireRiver9| | 2015-6-29 19:53 | 显示全部楼层
楼上的几个方法都是不错的,学习了

使用特权

评论回复
尤彼卡| | 2015-6-29 21:22 | 显示全部楼层
是有点浪费资源的

使用特权

评论回复
xmfish01| | 2015-8-2 18:52 | 显示全部楼层
    感谢楼主。。。
    方法是没有最精确,只有最合适的。让一个菜鸟选择延时的方法,这种死等的就是一个不错的选择,如果死等的方法无法满足应用的要求了,那必然就会去改进和修正,这也就是菜鸟的进阶过程。
    再次感谢楼主的分享和感谢大家的讨论,让我这个菜鸟学了不少知识

使用特权

评论回复
zhou00| | 2015-8-2 20:46 | 显示全部楼层
敢问楼主,为什么看不下去了呢???

使用特权

评论回复
化雨眠66| | 2015-10-25 10:23 | 显示全部楼层
江枫渔火 发表于 2014-9-27 18:55
TI的资料中,此函数在Sysctl.c中是这样定义的:

#if defined(ewarm) || defined(DOXYGEN)    //定 ...


为什么我测试的微妙级的延时有误差呢
延时4us,仿真测试出来差不多十几微妙

使用特权

评论回复
643757107| | 2015-10-25 15:19 | 显示全部楼层
哈哈,有什么看不下去的,都是这个样子,哪儿能精确啊。

使用特权

评论回复
a_ki| | 2015-11-11 08:55 | 显示全部楼层
学习了,

使用特权

评论回复
刁刁刁| | 2016-4-10 21:50 | 显示全部楼层
只要上自己观点就一定有喷子,觉得楼主的死等挺好的,毕竟自己的使用环境,还没说自己使用环境,下面几个人就开始比比比比比比的。真心受不鸟,体谅楼主~ 自己就是要用18B20 看了好多帖子也就是这个帖子里面的这几种方法,回头试试。

使用特权

评论回复
lai832| | 2016-4-10 23:28 | 显示全部楼层
首先:时钟源精确否?
其次:
       所有计数,不断对CLK累加,   当计到X值时中断,并重载计数值 N,再重新累加的这种中断定时都不准,当然,你只计一次还可以接受的
      --------------这种方式引入了:比较/重载/中断(又含优先级等)..................这个时间是不可预估的(立场:芯片用户)
      --------------反而像TIM捕足的方式更可取(相对中断重载这种方式),因为累计不会被打断,只存在时钟源的误差.
再者:软件.....好吧你有那么高的要求,是否你的芯片主要任务是精确延时.

使用特权

评论回复
cornrn| | 2016-4-11 00:25 | 显示全部楼层
就一个延时随你用什么,够用就可以,那么精确你是做卫星授时吗,就一个普通单片机,都喜欢搬出来功能复杂的时候,你说说你做的什么什么项目,不就STM32做的吗,能有多复杂的项目,对事件要求这么高就不要用ARM啊,用FPGA麽挺好并行呢爽死你呢,只要你时钟够准

使用特权

评论回复
dcp| | 2016-4-11 08:02 | 显示全部楼层
定时中断表示不服

使用特权

评论回复
ticomi| | 2016-4-11 08:08 | 显示全部楼层
延时程序这样设计不合适吧!浪费资源,等待时可以做很多事情啊!

使用特权

评论回复
奇立电源| | 2016-5-13 22:53 | 显示全部楼层
真正的高手用子函数延时

使用特权

评论回复
aaroncy79| | 2016-7-6 15:08 | 显示全部楼层
xlsbz 发表于 2014-9-27 15:26
while (uint32_t dwTime)
{
     __IO uint32_t  cnt = SysTick->VAL;;

什么玩意

使用特权

评论回复
pietyknight| | 2016-7-7 22:11 | 显示全部楼层
谢谢楼主分享!

使用特权

评论回复
shizaigaole| | 2016-9-16 15:22 | 显示全部楼层
没看懂大家争论什么??
有什么好争论的??

就算是DS18B20的单总线时序每个延时也是有个范围,
保持在一定误差范围内,不论什么方法都可以。

绝对精确没有必要,
过分的冗余设计,也浪费精力。

毕竟这种小技巧不是项目中应该花费精力的主要地方

使用特权

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

本版积分规则