用SysTick作的延時計時器

CM三、CM4的內核中都有個24位的SysTick定時器。這兩個MCU裏邊的SysTick大同小異。SysTick的介紹能夠參考:(來自CSDN博客的參考)或者(來自百度文庫的參考)或者參考《CM3權威指南》這個書。在ST的參考手冊中沒有SysTick的介紹。由於它是屬於內核的東西。函數

這個實驗是使用Systick中斷方式作延時定時器。主要目的是熟悉下SysTick的使用。ui

首先,定義個延時函數,目的是計數url

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爲止.spa

Delay函數就是一直等着TimingDelay 減到0..net

而後配置SysTick定時器。使用系統函數code

SysTick_Config(SystemCoreClock/1000)blog

這個函數打開了SysTick的中斷,同時也設置了Systick的重裝載寄存器。SystemCoreClock/1000既是系通時鐘頻率的千分之一。也就是說沒每秒鐘,Systick寄存器會裝滿1000次,每次1ms。這就是計時的基礎單位了。當重裝載寄存器裝滿時,就會產生Systick中斷,以後咱們就在中斷函數中處理TimingDelay這個標量了。資源

 

在文件stm32F4xx_it.c中添加一點Systick的中斷處理函數:rem

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

這樣,延時函數就配置好了。get

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

相關文章
相關標籤/搜索