打印
[STM32F0]

我理解的delay()原理,菜鸟一枚,请大神指教

[复制链接]
3222|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shi910229|  楼主 | 2014-7-6 16:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Stm32f051 延时函数原理。
/******************延时函数:***************/
void Delay(__IO uint32_t nTime)
{
  TimingDelay = nTime;
  while(TimingDelay != 0);
}
Ntime等于多少,表示延时多少ms
/******************系统滴答定时器***************/
void Systick_Init(void)
{
  if (SysTick_Config(SystemCoreClock / 1000))//1毫秒
  {
    /* Capture error */
    while (1);
  }
}
我们可以看到,假设系统时钟为48M,即systemcoreclock=48M,程序执行一个语句的机器周期是1/48000000,,如果不除1000的话,此时滴答定时器就为1S,同理,可以推出1ms是如何得出的。
/******************中断回调函数***************/
void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
  {
    TimingDelay--;
  }
}
结合第一个delay函数为什么能ntime值为多少,则延时多少ms,是因为中断回调函数执行一次timingdelay的值,而进入一次中断的时间刚好是一次滴答定时器的时间,当ntime1000时,则进入1000次中断,因为此时滴答定时器为1ms,则1000次刚好为1s,此时延时刚好为1s
采用滴答定时器延时可以精确的延时,与51for语句延时明显好很多。

沙发
huangqi412| | 2014-7-6 18:07 | 只看该作者
:L  撸主要改变思维

使用特权

评论回复
板凳
mmuuss586| | 2014-7-6 18:19 | 只看该作者
可以理解为,利用定时器中断做延时。

使用特权

评论回复
地板
shi910229|  楼主 | 2014-7-6 20:17 | 只看该作者
mmuuss586 发表于 2014-7-6 18:19
可以理解为,利用定时器中断做延时。

简要的说,确实 是这样哈。

使用特权

评论回复
5
shi910229|  楼主 | 2014-7-6 22:39 | 只看该作者
huangqi412 发表于 2014-7-6 18:07
撸主要改变思维

???对不起,我哪里错了。说一下,谢谢。

使用特权

评论回复
6
江枫渔火| | 2014-7-7 00:02 | 只看该作者
在程序里用delay,你这种方式,仅仅是延时得稍微精确一点。但不管怎样的,你最好考虑,只将delay用在毫秒以下的延时。1ms对于现在的单片机,都是很长一段时间了。

使用特权

评论回复
7
diweo| | 2014-7-7 11:07 | 只看该作者
假设,用简单的for循环,可以延时1.01ms,用这种方式,可以精确的延时1ms.
可是,这有什么意义呢?  你这1ms之内,CPU 还是空转,还是不能做别的事情呀!!!

使用特权

评论回复
8
systick中断本来就很准,而且此中断优先级颇高,也不容易被抢占,很准!你分析的很好啊,还需要知道什么呢。。。。~

使用特权

评论回复
9
Adu0227| | 2014-7-7 19:02 | 只看该作者
板子刚入手,过一段再研究

使用特权

评论回复
10
shi910229|  楼主 | 2014-7-7 21:25 | 只看该作者
江枫渔火 发表于 2014-7-7 00:02
在程序里用delay,你这种方式,仅仅是延时得稍微精确一点。但不管怎样的,你最好考虑,只将delay用在毫秒以 ...

对于产品来说,精确的延时用这个方法是非常有必要哦。

使用特权

评论回复
11
shi910229|  楼主 | 2014-7-7 21:25 | 只看该作者
想做大牛的小马 发表于 2014-7-7 17:39
systick中断本来就很准,而且此中断优先级颇高,也不容易被抢占,很准!你分析的很好啊,还需要 ...

就是分享,菜鸟一个,求大神们指教

使用特权

评论回复
12
shi910229|  楼主 | 2014-7-7 21:26 | 只看该作者
diweo 发表于 2014-7-7 11:07
假设,用简单的for循环,可以延时1.01ms,用这种方式,可以精确的延时1ms.
可是,这有什么意义呢?  你这1ms ...

你可以用for看,你估计的1ms,绝对没有我这个方法准哦。我测过。

使用特权

评论回复
13
江枫渔火| | 2014-7-7 22:13 | 只看该作者
你在delay的过程中,CPU不能干别的事情,时间长了,这是不能忍受的。
不管你有多精确,都没有用了。

使用特权

评论回复
14
diweo| | 2014-7-8 08:24 | 只看该作者
shi910229 发表于 2014-7-7 21:26
你可以用for看,你估计的1ms,绝对没有我这个方法准哦。我测过。

不错,for延时肯定是不精确的,所以我并不推崇;
你这个方法虽然精确,可是实际意义不大,所以我也不推崇 ;
不过,在你的方法的基础之上,再加以改进,就可以实现,既延时精确,又在延时的时间段里面,CPU可以做别的事情。
所以说你的思路要转变。

使用特权

评论回复
15
shi910229|  楼主 | 2014-7-8 20:23 | 只看该作者
diweo 发表于 2014-7-8 08:24
不错,for延时肯定是不精确的,所以我并不推崇;
你这个方法虽然精确,可是实际意义不大,所以我也不推崇 ...

最近因为公司要求,才刚学STM32,很多不懂啊。。

您说的有道理,谢谢哈~

使用特权

评论回复
16
shi910229|  楼主 | 2014-7-8 20:23 | 只看该作者
江枫渔火 发表于 2014-7-7 22:13
你在delay的过程中,CPU不能干别的事情,时间长了,这是不能忍受的。
不管你有多精确,都没有用了。

确实~!~!

使用特权

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

本版积分规则

21

主题

114

帖子

5

粉丝