STM32 systick做为系统时间使用(非简单延时)

转自:http://bruce.is-programmer.com/posts/36012.html

 基本能搜到的systick 都是作为延时使用的,因为设计需求我更多实用的是系统时间判断。
假如我有个LED 需要每10s 闪一下,并且单片机还需要做其他的工作,用延时工作效率太低了,开个定时器又太浪费了。因此系统时钟就体现出了由为重要的应用场合。只需要检测到系统时间为10s 的倍数就可以做动作了,当然前提保证程序的大体循环能在1s 内完成,这个基本没问题如果一个大体循环1s 内完成不了 那这个程序要么就是大到无法形容,要么就是无止境的运行。

   首先进入while(1) 大循环前初始化systick,进入主体程序就在计数了,计数分毫秒,秒,这样能在特点的时间进入指定的程序中运行。

初始化systick


?
1
2
3
4
5
6
7
8
9
10
void TimeCount_Init( void )
{
     
     SysTick->LOAD=72000000/1000; //系统频率为72MH
     SysTick->VAL=0x00;
     SysTick->CTRL=0xFFFFFFFF;
     MilliS=0;
     Second=0;
     Min=0;
}

当然如果用库函数也行的


?
1
2
3
4
5
6
7
8
9
10
void TimeCount_Init( void )
{
     
   if (SysTick_Config (SystemCoreClock / 1000))
   while (1); }
 
   MilliS=0;
   Second=0;
   Min=0;
}

中断函数


?
1
2
3
4
5
6
7
void SysTick_Handler( void )
{                                                           
   MilliS++;
   if (MilliS>=10000) MilliS=0; //此处10000ms 主要方便延时函数使用
   if (MilliS%1000==0) {Second++;}
   if (Second>=60) {Second=0;min++;}
}

如果我们要想5秒去做一次计算某组数据只需要写入秒判断即可
if(Second%5 == 0)
{  需要间隔运行的程序……    }
毫秒也是可以的,换成MilliS 即可,甚至分钟都行。

   好了,那延时怎么办?是的特殊场合我们可能还是可能有需要延时函数的。当然这个也是可以做到的,不过相对运算多一点点。
延时函数如下:


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
u8 delayms(u16 nCount)
{
   u16 CurTim=MilliS;
   u16 i=0;
   if (nCount<60000)
      {
         if (CurTim+nCount<10000) 
           {
              while (MilliS-CurTim<nCount); return 1;
           }
         i=nCount-(10000-CurTim);
         while (MilliS<9998);
         while (MilliS>=9998||MilliS<i);  
         return 1;
      }
   delayS(nCount/1000);
   delayms(nCount%1000);
   //while()
   return 1;
}
 
u8 delayS(u16 nCount)
{
   u16 CurTim=Second;
   u16 i=0;
   if (nCount<6000)
      {
         if (CurTim+nCount<60)
           while (Second-CurTim<nCount); return 1;}
         i=nCount-(60-CurTim);
         while (Second<59);
         while (Second>=59||Second<i);
         return 1;
      }
   return 0;
}

    这里我做的毫秒延时中实际最长的只能计算60000ms 即60s的延时 再长的延时就会先调用秒延时,运行完后再把剩下的毫秒延时运行掉。所以超出部分将计算越出计数器最大计算值多少来计算i=nCount-(10000-CurTim);而中断中定义的技术最大值10000 原因是一般我们使用延时都不会太长,最长一般也就数秒而已,更多的是毫秒级的,所以这里放宽至10S 的长度,直接等待值到了就推出,所以10S内的延时延时还是非常精确的,但如果大于就会有几个微秒的差距了,中间插入了好几条运算和指令,非精确定时就别用这个定时器了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值