今天想自己用寄存器編程寫一個用systick定時器的延時函數,寫完後做實驗發現我要延時1s,但是卻延時了8s。這個問題讓我糾結了半天。實際上也不是什麼大問題,就是Systick的時鐘選擇錯誤罷了
。
如圖所示,供Systick使用有兩個時鐘源,一個是經過8分頻的時鐘,一個是位經分頻的時鐘。
從《CM3權威指南》中可以看到,Systick的時鐘源選擇是通過控制systick控制與狀態寄存器的CLKSOURCE位來確定的。 置0則是選擇8分頻的時鐘,置1則是未分頻的時鐘。
void Systick_init()
{
SysTick->CTRL |= (1<<2);//STCLK
//SysTick->CTRL &= ~(1<<2);//FCLK
SysTick->CTRL |= 1<<1;
SysTick->LOAD = SysTick_Freq/1000000 -1;
}