第16章
SysTick——系統(tǒng)定時器
本章參考資料
《DEFINITIVE GUIDE TO ARM CORTEX-M23 AND CORTEX-M33 PROCESSORS》-11.2章節(jié)SysTick Timer,《Cortex-M3內(nèi)核編程手冊》-4.5章節(jié)SysTick Timer(STK),和4.48章節(jié)SHPRx,這個章節(jié)有SysTick的簡介和寄存器的詳細描述。因為SysTick是屬于CORTEX-M33內(nèi)核的外設,有關寄存器的定義和部分庫函數(shù)都在core_cm33.h這個頭文件中實現(xiàn)。所以學習SysTick的時候可以參考這兩個資料,一個是文檔,一個是源碼。
16.1
SysTick系統(tǒng)滴答定時器簡介
SysTick—系統(tǒng)定時器是屬于CM33內(nèi)核中的一個外設,內(nèi)嵌在NVIC中。系統(tǒng)定時器是一個24bit的向下遞減的計數(shù)器,計數(shù)器每計數(shù)一次的時間為 1/SYSCLK,一般我們設置系統(tǒng)時鐘SYSCLK等于 200MHz。當重裝載數(shù)值寄存器的值遞減到0的時候,系統(tǒng)定時器就產(chǎn)生一次中斷,以此循環(huán)往復。
因為SysTick是屬于CM33內(nèi)核的外設,所以所有基于CM33內(nèi)核的單片機都具有這個系統(tǒng)定時器,使得軟件在CM33單片機中可以很容易的移植。系統(tǒng)定時器一般用于操作系統(tǒng),用于產(chǎn)生時基,維持操作系統(tǒng)的心跳。
16.2
SysTick寄存器介紹
SysTick—系統(tǒng)定時器有4個寄存器,簡要介紹如下。在使用SysTick產(chǎn)生定時的時候,只需要配置前三個寄存器,最后一個校準寄存器不需要使用。
表1:表17?1 SysTick寄存器匯總

表2:表17?2 SysTick控制及狀態(tài)寄存器

表3:表17?3 SysTick重裝載數(shù)值寄存器

表4:表17?4 SysTick當前數(shù)值寄存器

表5:表17?5 SysTick校準數(shù)值寄存器

系統(tǒng)定時器的校準數(shù)值寄存器在定時實驗中不需要用到。本章不會詳細講解該寄存器,感興趣的讀者可自行研究。
16.3
使用SysTick定時實驗
利用SysTick產(chǎn)生1s的時基,LED以1s的頻率閃爍。
16.3.1
硬件設計
SysTick屬于單片機內(nèi)部的外設,不需要額外的硬件電路,剩下的只需一個LED燈即可。
16.3.2
軟件設計
這里只講解核心的部分代碼,有些變量的設置,頭文件的包含等并沒有涉及到,完整的代碼請參考本章配套的工程。我們創(chuàng)建了兩個文件:bsp_SysTick.c和bsp_SysTick.h文件用來存放 SysTick驅(qū)動程序,中斷服務函數(shù)及相關宏定義。
16.3.2.1
編程要點
設置重加載寄存器的值
清除當前數(shù)值寄存器的值
配置控制與狀態(tài)寄存器
16.3.2.2
代碼分析
SysTick屬于內(nèi)核的外設,有關的寄存器定義和庫函數(shù)都在內(nèi)核相關的庫文件core_cm33.h中。
16.3.2.2.1SysTick配置庫函
列表1:代碼清單17?1 SysTick配置庫函數(shù)
左右滑動查看完整內(nèi)容
__STATIC_INLINEuint32_tSysTick_Config(uint32_tticks)
{
// 不可能的重加載值,超出范圍
if((ticks -1UL) > SysTick_LOAD_RELOAD_Msk) {
return(1UL);
}
// 設置重加載寄存器
SysTick->LOAD = (uint32_t)(ticks -1UL);
// 設置中斷優(yōu)先級
NVIC_SetPriority(SysTick_IRQn, (1UL<< __NVIC_PRIO_BITS) -?1UL);
// 設置當前數(shù)值寄存器
SysTick->VAL =0UL;
// 設置系統(tǒng)定時器的時鐘源為 ICLK=200M
// 使能系統(tǒng)定時器中斷
// 使能定時器
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
return(0UL);
}
用固件庫編程的時候我們只需要調(diào)用庫函數(shù) SysTick_Config()即可,形參ticks用來設置重加載寄存器的值,最大不能超過重加載寄存器的值224,當重加載寄存器的值遞減到0的時候產(chǎn)生中斷,然后重加載寄存器的值又重新被裝載并再次遞減計數(shù),以此循環(huán)往復。緊隨其后設置好中斷優(yōu)先級,最后配置系統(tǒng)定時器的時鐘等于ICLK=200M,使能定時器和定時器中斷,這樣系統(tǒng)定時器就配置好了,一個庫函數(shù)搞定。
SysTick_Config()庫函數(shù)主要配置了SysTick中的三個寄存器:LOAD、VAL和CTRL,有關具體
的部分看代碼注釋即可。
16.3.2.2.2配置SysTick中斷優(yōu)先級
SysTick_Config()庫函數(shù)主要配置了SysTick中的三個寄存器:LOAD、VAL和CTRL,有關具體的部分看代碼注釋即可。其中還調(diào)用了函數(shù)庫函數(shù) NVIC_SetPriority()來配置系統(tǒng)定時器的中斷優(yōu)先級,該庫函數(shù)也在core_cm33.h中定義,原型如下:
列表2:代碼清單17?2 NVIC中斷優(yōu)先級配置函數(shù)
左右滑動查看完整內(nèi)容
__STATIC_INLINEvoid__NVIC_SetPriority(IRQn_Type IRQn,uint32_tpriority)
{
if((int32_t)(IRQn) >=0)
{
NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U?- __NVIC_
→PRIO_BITS)) & (uint32_t)0xFFUL);
}
else
{
SCB->SHPR[(((uint32_t)IRQn) &0xFUL)-4UL] = (uint8_t)((priority <
→(8U?- __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
}
}

-
單片機
+關注
關注
6072文章
45283瀏覽量
661798 -
內(nèi)核
+關注
關注
4文章
1433瀏覽量
42377 -
定時器
+關注
關注
23文章
3350瀏覽量
121430 -
Systick
+關注
關注
0文章
66瀏覽量
13844
原文標題:SysTick系統(tǒng)定時器——瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南(41)
文章出處:【微信號:瑞薩嵌入式小百科,微信公眾號:瑞薩嵌入式小百科】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
對于Systick滴答定時器的理解
SysTick—系統(tǒng)定時器
stm32的systick(滴答定時器)實現(xiàn)精準延時
STM32F4: Systick滴答定時器-延時函數(shù)講解(五)
STM32筆記(七)---Systick系統(tǒng)定時器
【STM32】SysTick滴答定時器(delay延時函數(shù)講解)

SysTick系統(tǒng)滴答定時器簡介
評論