1.SysTick簡介
SysTick是一種系統(tǒng)定時器,可以用于實現(xiàn)操作系統(tǒng)、任務(wù)調(diào)度、時鐘管理等功能。它通常集成在微控制器中,并且是硬件實現(xiàn)的,具有高精度和可靠性。
在ARM Cortex-M處理器中,SysTick定時器可以配置為計數(shù)器模式或外部時鐘模式。在計數(shù)器模式下,SysTick定時器使用內(nèi)部時鐘作為時基,可以產(chǎn)生中斷,以實現(xiàn)系統(tǒng)的定時功能和任務(wù)調(diào)度。在外部時鐘模式下,SysTick定時器使用外部時鐘信號作為時基,可以用于協(xié)調(diào)外部設(shè)備的時序和同步。
SysTick定時器通常具有以下特點:
1. 高精度:SysTick定時器通??梢蕴峁└呔鹊挠嫊r功能,以滿足實時應(yīng)用的要求。
2. 靈活性:SysTick定時器可以通過軟件配置來適應(yīng)不同的應(yīng)用場景和需求。
3. 可編程性:SysTick定時器可以通過編程來實現(xiàn)各種定時功能,例如系統(tǒng)節(jié)拍、超時檢測、延時等。
2.SysTick使用方法
STM32系列微控制器中的SysTick定時器可以用于實現(xiàn)系統(tǒng)的定時功能和任務(wù)調(diào)度。以下是使用SysTick的基本步驟:
1. 啟用SysTick定時器
首先需要啟用SysTick定時器,通過設(shè)置SysTick控制和狀態(tài)寄存器(STK_CTRL)的ENABLE位為1來完成??梢允褂靡韵麓a片段實現(xiàn):
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
2. 配置SysTick時鐘源
SysTick定時器可以使用內(nèi)部時鐘(CPU時鐘)或外部時鐘作為時基。通過設(shè)置SysTick控制和狀態(tài)寄存器的CLKSOURCE位來選擇時鐘源。例如,要使用CPU時鐘作為時基,可以使用以下代碼片段:
SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
3. 配置定時周期
SysTick定時器以一個固定的頻率遞減計數(shù),當(dāng)計數(shù)達到零時會觸發(fā)中斷。可以通過設(shè)置SysTick重載值寄存器(STK_LOAD)來配置定時周期。例如,要設(shè)置定時周期為1毫秒,可以使用以下代碼片段(假設(shè)使用的時鐘頻率為72MHz):
SysTick->LOAD = 72000-1; // 72MHz / 1000Hz - 1
4. 啟用中斷
如果需要在定時周期結(jié)束時觸發(fā)中斷,可以設(shè)置SysTick控制和狀態(tài)寄存器的TICKINT位為1。例如,要啟用中斷,可以使用以下代碼片段:
SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;
5. 中斷處理
在定時周期結(jié)束時,SysTick定時器會觸發(fā)中斷??梢跃帉懼袛嗵幚砗瘮?shù)來執(zhí)行相應(yīng)的操作。例如,在Cortex-M系列處理器中,可以使用以下方式定義SysTick中斷處理函數(shù):
void SysTick_Handler(void)
{
// 在這里執(zhí)行需要定時的任務(wù)
}
6. 啟動定時器
最后,通過設(shè)置SysTick控制和狀態(tài)寄存器的ENABLE位為1來啟動定時器。例如,可以使用以下代碼片段:
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
通過以上步驟,就可以使用SysTick定時器實現(xiàn)系統(tǒng)的定時功能和任務(wù)調(diào)度了。需要根據(jù)具體的需求進行配置和使用,例如調(diào)整定時周期、啟用/禁用中斷等。請注意,具體的寄存器名稱和位定義可能因STM32系列型號而有所差異,請查閱相關(guān)的參考手冊獲取準確的信息。
3.SysTick定時器實例
?由于SysTick定時器是內(nèi)核里面的外設(shè),所以需要包含頭文件“core_cm3.h”。
1.?SysTick_Config
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
//reload寄存器位24bit,最大值為2^24
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);
//配置reload寄存器的初始值
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
//配置中斷優(yōu)先級為1<<4-1 =15,優(yōu)先級為最低
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
//配置counter計數(shù)器的值
SysTick->VAL = 0;
//分別配置systick的時鐘為72M,使能中斷,使能systick
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
return (0);
}
?SysTick_Config()需要傳進去一個形參,這個形參是要被寫入重裝載寄存器LOAD里面。
2.SysTick定時是時間計算?
t = reload * (1/clk)
clk = 72M時 t = (72)*(1/72M) = 1us
clk = 72M時 t = (72000)*(1/72M) = 1ms
3.?編寫延時函數(shù)
首先調(diào)用?SysTick_Config()函數(shù),傳入?yún)?shù)72就是1us,72000就是1ms。
SysTick_Config(72);
然后使用一個for循環(huán)計數(shù),執(zhí)行一次for循環(huán)就代表1us,for循環(huán)里面再用一個while循環(huán),通過CTRL是否置1來?判斷是都計時1us。
for(i = 0;i < us; i++)
{
while( ! ((SysTick->CTRL) & (1 << 16)) );
}
延時完成后需要關(guān)閉定時器文章來源:http://www.zghlxwxcb.cn/news/detail-832247.html
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
最后,在main函數(shù)中調(diào)用這個延時函數(shù)并傳遞 一個形參即可。文章來源地址http://www.zghlxwxcb.cn/news/detail-832247.html
到了這里,關(guān)于STM32—系統(tǒng)定時器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!