前面用STM32的GPIO模擬液晶驅動時序時遇到一個問題,就是怎樣產生一段較爲精確的延時。通常產生一小段延時的方法就是利用一個遞增或者遞減循環進行軟件延時。
例:
void delay(void)
{
int i="0x0ff";
while (i--)
;
}
我在使用MPLAB IDE進行PIC單片機的開發時,MPLAB提供了一個Watch(跑表)功能,可以很方便的查看一個函數或一段代碼的運行時間,利用這個功能就可以很容易的編寫能產生精確延時的代碼。而據我目前瞭解的情況,不管是IAR還是RealView MDK都沒有提供類似的功能,這樣就不能像上例那樣來獲得較爲精確的延時了。
有人說了,可以用定時器中斷的方法來產生精確延時,一點沒錯,不過在STM32中還可以採用更簡單的方法來產生精確延時,那就是利用Cortex系統定時器—SysTick。
在以前,大多操作系統需要一個硬件定時器來產生操作系統需要的滴答中斷,作爲整個系統的時基。例如,爲多個任務許以不同數目的時間片,確保沒有一個任務能霸佔系統;或者把每個定時器週期的某個時間範圍賜予特定的任務等,還有操作系統提供的各種定時功能,都與這個滴答定時器有關。因此,需要一個定時器來產生週期性的中斷,而且最好還讓用戶程序不能隨意訪問它的寄存器,以維持操作系統“心跳”的節律。SysTick的最大使命,就是定期地產生異常請求,作爲系統的時基。
SysTick定時器被捆綁在NVIC中,用於產生SYSTICK異常(異常號:15)。SysTick是一個24位的倒數定時器,當計數值減到0時,將從RELOAD寄存器中自動重裝載定時初值,只要不把它在SysTick控制及狀態寄存器中的使能位清除,就永不停息。SysTick定時器除了能服務於操作系統之外,還能用於其它目的:如作爲一個鬧鈴,用於測量時間等。
用SysTick產生精確延時的方法如下:
1、首先對SysTick進行設置
void SysTick_Configuration(void)
{
/* Configure HCLK clock as SysTick clock source */
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //系統時鐘8分頻
/* SysTick interrupt each 1000 Hz with HCLK equal to 72MHz */
SysTick_SetReload(9000); //週期1ms
/* Enable the SysTick Interrupt */
SysTick_ITConfig(ENABLE); //打開中斷
}
2、延時函數
void SysTick_Delay(u32 nTime)
{
/* Enable the SysTick Counter */
SysTick_CounterCmd(SysTick_Counter_Enable); //允許計數
TimingDelay = nTime;
while(TimingDelay != 0);
/* Disable SysTick Counter */
SysTick_CounterCmd(SysTick_Counter_Disable); //禁止計數
/* Clear SysTick Counter */
SysTick_CounterCmd(SysTick_Counter_Clear); //計數器清0
}
3.中斷函數
void SysTickHandler(void)
{
TimingDelay_Decrement();
}
4.中斷調用函數
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
利用以上幾個函數就能產生精確延時了,使用時通過調用SysTick_Delay(u32 nTime)函數來設置延時時間,這裏提供一個產生秒延時的程序供大家參考。