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