用SysTick做的延时计时器

CM3、CM4的内核中都有个24位的SysTick定时器。这两个MCU里边的SysTick大同小异。SysTick的介绍可以参考:(来自CSDN博客的参考)或者(来自百度文库的参考)或者参考《CM3权威指南》这个书。在ST的参考手册中没有SysTick的介绍。因为它是属于内核的东西。

这个实验是使用Systick中断方式做延时定时器。主要目的是熟悉下SysTick的使用。

首先,定义个延时函数,目的是计数

void Delay(__IO uint32_t nTime)
{
  TimingDelay = nTime;
  while(TimingDelay != 0);
}

void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
  { 
    TimingDelay--;
  }
}

其中TimingDelay_Decrement是供SysTick的中断响应函数调用的。每次调用就将TimingDelay减少1,知道0为止.

Delay函数就是一直等着TimingDelay 减到0.

然后配置SysTick定时器。使用系统函数

SysTick_Config(SystemCoreClock/1000)

这个函数打开了SysTick的中断,同时也设置了Systick的重装载寄存器。SystemCoreClock/1000既是系通时钟频率的千分之一。也就是说没每秒钟,Systick寄存器会装满1000次,每次1ms。这就是计时的基础单位了。当重装载寄存器装满时,就会产生Systick中断,之后我们就在中断函数中处理TimingDelay这个标量了。

 

在文件stm32F4xx_it.c中添加一点Systick的中断处理函数:

extern void TimingDelay_Decrement(void);
 
void SysTick_Handler(void)
{
    TimingDelay_Decrement();
}

这样,延时函数就配置好了。

在main函数中的用法:

int main(void)
{
。。。。。。

    if(SysTick_Config(SystemCoreClock/1000))
    {
        while(1);
    }    
    
  while (1)
  {
      Delay(500);
      GPIO_WriteBit(GPIOG,GPIO_Pin_13,Bit_SET);
      Delay(500);
      GPIO_WriteBit(GPIOG,GPIO_Pin_13,Bit_RESET);
  }
}

 

这里的不足之处是你不管使用没有,SysTick总是会反复地产生中断,消耗了一些MCU的资源。当然,如果SysTick用在OS中,作为OS的心跳,这个中断是免不了的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值