本課將為大家講解CKS32F4xx系列產品的SysTick定時器原理及使用方法。SysTick定時器也叫SysTick滴答定時器,屬于Cortex-M4內核外設。SysTick定時器可以用于查詢延時、中斷延時以及測量函數運行時間;在實時操作系統(tǒng)RTOS中作為滴答定時器,用于上下文切換。采用Cortex-M內核的微處理都有SysTick定時器,方便不同處理器之間的軟件移植。SysTick定時器時鐘源可直接選取系統(tǒng)時鐘,還可以通過系統(tǒng)時鐘8分頻后取得。
SysTick定時器內部是一個遞減的計時器,當減到0時,將從LOAD寄存器中自動重裝定時器初始值,重新向下遞減計數,如此循環(huán)往復。如果開啟SysTick中斷,當計數器減到0時,SysTick可以生產異常,異常編號為15。
SysTick定時器寄存器
SysTick定時器內部是一個24位向下遞減的計時器,包含4個寄存器,如圖。

圖1SysTick定時器框圖
1)STK_CTRL寄存器
STK_CTRL是SysTick定時器的控制及狀態(tài)寄存器,相應功能如下:

2)STK_LOAD寄存器
STK_LOAD寄存器是SysTick定時器的重裝載數值寄存器,相應功能如下:

3)STK_VAL寄存器
STK_VAL寄存器是SysTick定時器的當前數值寄存器,相應功能如下:

4)STK_CALIB寄存器
STK_CALIB寄存器是SysTick定時器的校準數值定時器,用于利用片上硬件為軟件提供校準信息,但使用情況較少。在CMSIS Core中,不需要使用SysTick校準寄存器,因為CMSIS Core提供了一個名為“SystemCoreClock”的軟件變量。此變量在系統(tǒng)初始化函數“SystemInit()”中設置,每次更改系統(tǒng)時鐘配置時也會更新。這種方法比使用SysTick CalibrationRegister的硬件方法靈活。校準寄存器描述如下表:

查詢延時使用步驟
1)配置SysTick定時器時鐘源
2)加載延時計數值 3)清零計數器,啟動定時器開始遞減計數 4)等待計數結束 5)清零計數,關閉定時器,延時結束 相關函數如下:
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource) { if (SysTick_CLKSource == SysTick_CLKSource_HCLK) { SysTick->CTRL |= SysTick_CLKSource_HCLK; } else { SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8; } } void TickDelayInit(u8 SYSCLK) { //選擇時鐘源為AHB/8 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); fac_us=SYSCLK>>3; fac_ms=((u32)SYSCLK*1000)>>3; } void TickDelayUs(u16 nus) { uint32_t temp; SysTick->LOAD=nus*fac_us-1; SysTick->VAL=0x00; SysTick->CTRL=0x01; do { temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1<<16))); SysTick->CTRL=0x00; SysTick->VAL =0X00; } void TickDelayMs(u16 nms) { u32 temp; SysTick->LOAD=nms*fac_ms -1; SysTick->VAL =0x00; SysTick->CTRL=0x01 ; do { temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1<<16))); SysTick->CTRL=0x00; SysTick->VAL =0X00; }
中斷方式延時使用步驟
1)配置SysTick定時器時鐘源
2)調用系統(tǒng)函數SysTick_Config(),開啟中斷,配置中斷間隔
3)延時函數賦值延時變量,并等待延時變量遞減到0,達到精確延時效果
4)中斷函數中延時變量遞減到0 相關函數如下:
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if ((ticks - 1) > 0xFFFFFF)//24位寄存器,大于該值返回錯誤
{
return (1);
}
SysTick->LOAD = (uint32_t)(ticks - 1);//計數到0,ticks值應減1
NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1);
SysTick->VAL = 0UL;
SysTick->CTRL = (1<<2) |(1<<1) | 1;//配置時鐘源,使能定時器,開啟中斷
return (0UL);
}
void TickInterruptDelay(__IO u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
void TickInterruptHandleTimingDelay_Decrement(void)
{
if (TimingDelay != 0)
{
TimingDelay--;
}
}
測量短時函數的執(zhí)行時間
SysTick計時器可用于計時測量。例如,可以使用以下代碼測量短函數的持續(xù)時間:
SysTick->CTRL = 0; // 禁用 SysTick
SysTick->LOAD = 0xFFFFFFFF; // 設置重裝寄存器到最大值
SysTick->VAL = 0; // 清零VAL
SysTick->CTRL = 0x5; // 使能SysTick, 使用處理器時鐘
while(SysTick->VAL != 0); // 等待重裝完畢
start_time = SysTick->VAL; // 較大的起始點
TestDelayFunc(); // 待測函數執(zhí)行時間
stop_time = SysTick->VAL; // 獲取執(zhí)行結束時間
cycle_count = start_time e stop_time;//計算函數執(zhí)行時間
由于SysTick是一個遞減計數器,因此start_time的值大于stop_time。如果待測函數執(zhí)行時間較長,這種情況必須啟用SysTick異常,并使用SysTick處理程序來計算SysTick計數器下溢的次數。
總結及注意事項
SysTick定時器是微處理器系統(tǒng)內部定時器,提供精確的時間延時和計時功能。采用中斷方式延時,需要考慮SysTick中斷優(yōu)先級較低,容易被打斷影響延時;在嵌入式系統(tǒng)中,系統(tǒng)將使用SysTick計時器,應用程序中則不可在使用SysTick;在系統(tǒng)在線調試停止時,SysTick計時器將停止計時。
審核編輯:湯梓紅
-
mcu
+關注
關注
147文章
18420瀏覽量
380699 -
寄存器
+關注
關注
31文章
5503瀏覽量
128326 -
操作系統(tǒng)
+關注
關注
37文章
7267瀏覽量
128167 -
定時器
+關注
關注
23文章
3350瀏覽量
121264 -
Systick
+關注
關注
0文章
66瀏覽量
13830
原文標題:MCU微課堂|CKS32F4xx系列SysTick定時器
文章出處:【微信號:中科芯MCU,微信公眾號:中科芯MCU】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
MCU微課堂|CKS32F4xx系列產品時鐘配置
基于CKS32F4xx系列的MCU互補PWM方案
CKS32F4xx系列產品串口DMA傳輸
CKS32F4xx系列FSMC功能簡介

CKS32F4xx系列MCU SysTick定時器的原理及使用方法
評論