STM32學(xué)習(xí)006_Systick使用(一)
Systick是STM32中特有的系統(tǒng)時(shí)鐘
Systick有兩個(gè)功能:
1.可以產(chǎn)生精確延時(shí);
2.可以提供給系統(tǒng)一個(gè)單獨(dú)的時(shí)鐘節(jié)拍。
一般延時(shí)程序:
DELAY(N)
{ for( i=0 ; i<=x ; i++ ) ;
}
對(duì)于STM32系列的微處理器中,執(zhí)行一條指令只需要幾十ns,進(jìn)行for循環(huán)時(shí),要實(shí)現(xiàn)N毫秒延時(shí),那么x的意義非常大,而且由于系統(tǒng)頻率的寬廣,很難計(jì)算出延時(shí)N毫秒的精確值,那么在一些高速電路中,是不允許的,容易出現(xiàn)問(wèn)題,很難查找出來(lái)。尤其在液晶驅(qū)動(dòng)中,延時(shí)要求非常精確。針對(duì)STM32的處理器中,需要重新設(shè)計(jì)一個(gè)方法實(shí)現(xiàn)該功能,來(lái)代替DELAY(N)延時(shí);
cortex-m3中包含了一個(gè)Systick時(shí)鐘,Systick是一個(gè)24位的遞減計(jì)數(shù)器,設(shè)定初值并使能后,每經(jīng)過(guò)1個(gè)系統(tǒng)時(shí)鐘周期,該計(jì)數(shù)器減1,計(jì)數(shù)到零時(shí),systick自動(dòng)重裝初值,并繼續(xù)計(jì)數(shù),同時(shí)內(nèi)部的COUNTFLAG標(biāo)志位會(huì)置1,觸發(fā)中斷(中斷如果使能);
外部晶振是8MHz,9倍頻,系統(tǒng)時(shí)鐘為72MHz,systick的最大值為9MHz(最大值為HCLK/8),在這個(gè)條件下,如果將計(jì)數(shù)器的效驗(yàn)值設(shè)置為9000,將systick設(shè)置為9MHz,能夠產(chǎn)生1ms的時(shí)基值,即systick產(chǎn)生1ms的中斷,
systick時(shí)鐘共包含4個(gè)寄存器:
1.CTRL COUNTFLAG CLKSOURCE TICOUNT ENABLE
2.LOAD
3.VAL
4.CALIB
利用ST庫(kù)函數(shù)設(shè)置Systick的方法
1.調(diào)用SysTick_CountCmd() 失能SysTick計(jì)數(shù)器
2.調(diào)用SysTick_ITConfig() 失能SysTick中斷
3.調(diào)用SysTick_CLKSourceConfig() 配置SysTick的時(shí)鐘源
4.調(diào)用SysTick_SetReload() 設(shè)置SysTick 的效驗(yàn)值
5.調(diào)用SysTick_ITConfig() 使能SysTick中斷
6.調(diào)用SysTick_CountCmd() 使能SysTick計(jì)數(shù)器
void SysTick_Config() //配置好,并將計(jì)數(shù)器使能
{
SysTick_CountCmd(SysTick_CountCmd_DISABLE);
SysTick_ITConfig(DISABLE);
SysTick_CLKSourceConfig( SysTick_CLKSourceConfig_EXTERN);
SysTick_SetReload(SysTick_SetReload_9000);
SysTick_ITConfig(ENABLE);
SysTick_CountCmd(SysTick_CountCmd_ENABLE);
}
延時(shí)函數(shù):
void Delay_MS(u16 diy)
{
Delay=diy;
while(Delay);
}
extern vu16 Delay;
void SysTickHandle() /systick中斷服務(wù)程序/
{
Delay--;
}
如果延時(shí)較長(zhǎng),那么該延時(shí)程序一定程度上還是在耗CPU的資源。