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

systick做为系统时钟使用

[复制链接]
小贾-370388 发布时间:2015-1-6 11:13

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

首先进入while(1) 大循环前初始化systick,进入主体程序就在计数了,计数分毫秒,秒,这样能在特点的时间进入指定的程序中运行。
初始化systick
void TimeCount_Init(void)
{
     
    SysTick->LOAD=72000000/1000;//系统频率为72MH
    SysTick->VAL=0x00;
    SysTick->CTRL=0xFFFFFFFF;
    MilliS=0;
    Second=0;
    Min=0;
}

当然如果用库函数也行的
void TimeCount_Init(void)
{
     
  if (SysTick_Config (SystemCoreClock / 1000))
  {  while (1); }

  MilliS=0;
  Second=0;
  Min=0;
}

中断函数
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 即可,甚至分钟都行。
   好了,那延时怎么办?是的特殊场合我们可能还是可能有需要延时函数的。当然这个也是可以做到的,不过相对运算多一点点。
延时函数如下:


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内的延时延时还是非常精确的,但如果大于就会有几个微秒的差距了,中间插入了好几条运算和指令,非精确定时就别用这个定时器了。

收藏 评论1 发布时间:2015-1-6 11:13

举报

1个回答
QianFan 回答时间:2015-1-6 13:14:34
这样是不是太麻烦了啊,直接让无符号的ms++就行,32位的无符号数溢出之后需要几十天呢

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

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