用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的心跳,這個中斷是免不了的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM