藍橋杯嵌入式——滴答定時器
作者:閆永成 QQ:793805481
在用液晶驅動參考例程編寫程序時,可以發現這個工程裏面還爲我們提供了一個滴答定時器的MS延時函數,達到一個延時的效果。這篇文章,我們就介紹一下滴答定時器。
SysTick定時器(系統滴答定時器)是一個倒計時定時器,被捆綁在NVIC中,用於產生SYSTICK異常(異常號:15),每1ms產生一次中斷。
中斷函數在:
中斷服務函數:
因此,調用函數時,也就是每過1ms,TimingDelay的值會自動減1,當TimingDelay不等於0時,不斷循環,直到延時結束。
void Delay_Ms(u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
至於滴答定時器的相關配置,液晶驅動例程裏邊已經幫我們配置好了,我們直接調用Delay_Ms()就行,當要在main.c文件之外的其他.c文件調用時,我們只需要如下聲明後即可正常調用。
extern void Delay_Ms(u32 nTime);
比起讓系統循環等待實現延時,直接利用滴答定時器實現延時顯然比較方便。而且,滴答定時器的中斷函數中,還可以寫入其他內容,實現定時等效果。
比如:
關於靜態變量,簡單理解,也就是隻定義一次,在函數調用完成時值會一直被保留。
然後,在main函數中:
就實現了每過50ms,就會自動執行一次KEY_Scan()函數。顯然,這樣比起讓系統循環等待,利用stm32處理程序所用的機器時間去延時更有效。
那麼,在這個中斷函數裏面添加代碼,會不會導致延時不準呢?
答案是,會的,但這對這個定時器的精準度影響是很小的,幾乎可以忽略不計,我們一般不予考慮。
藍橋杯嵌入式比賽中,滴答定時器的應用還是很重要的,我們有必要弄清楚它。這篇文章就介紹到這裏,歡迎大傢俬信提問。