• 用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的心跳,这个中断是免不了的。

  • 相关阅读:
    创始人透露Twitter新盈利计划:第三方将受益
    试试ScribeFire转发我的其它博客
    2009年12月30日:新网因清除URL转发域名导致DNS解析故障
    VS2008 如果更改源代码管理插件,将关闭活动解决方案或项目
    Linq使用Group By经验总结
    使用C#的BitmapData
    Java与C#开发上的一些差异与转换方法
    成都七中成绩文件导入SQL脚本
    用SQL SERVER对EXCEL数据进行处理
    NULLIF和ISNULL
  • 原文地址:https://www.cnblogs.com/zyqgold/p/3626271.html
Copyright © 2020-2023  润新知