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