第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è),有關(guān)寄存器的定義和部分庫函數(shù)都在core_cm33.h這個頭文件中實現(xiàn)。所以學(xué)習(xí)SysTick的時候可以參考這兩個資料,一個是文檔,一個是源碼。
16.1
SysTick系統(tǒng)滴答定時器簡介
SysTick—系統(tǒng)定時器是屬于CM33內(nèi)核中的一個外設(shè),內(nèi)嵌在NVIC中。系統(tǒng)定時器是一個24bit的向下遞減的計數(shù)器,計數(shù)器每計數(shù)一次的時間為 1/SYSCLK,一般我們設(shè)置系統(tǒng)時鐘SYSCLK等于 200MHz。當(dāng)重裝載數(shù)值寄存器的值遞減到0的時候,系統(tǒng)定時器就產(chǎn)生一次中斷,以此循環(huán)往復(fù)。
因為SysTick是屬于CM33內(nèi)核的外設(shè),所以所有基于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當(dāng)前數(shù)值寄存器
表5:表17?5 SysTick校準數(shù)值寄存器
系統(tǒng)定時器的校準數(shù)值寄存器在定時實驗中不需要用到。本章不會詳細講解該寄存器,感興趣的讀者可自行研究。
16.3
使用SysTick定時實驗
利用SysTick產(chǎn)生1s的時基,LED以1s的頻率閃爍。
16.3.1
硬件設(shè)計
SysTick屬于單片機內(nèi)部的外設(shè),不需要額外的硬件電路,剩下的只需一個LED燈即可。
16.3.2
軟件設(shè)計
這里只講解核心的部分代碼,有些變量的設(shè)置,頭文件的包含等并沒有涉及到,完整的代碼請參考本章配套的工程。我們創(chuàng)建了兩個文件:bsp_SysTick.c和bsp_SysTick.h文件用來存放 SysTick驅(qū)動程序,中斷服務(wù)函數(shù)及相關(guān)宏定義。
16.3.2.1
編程要點
設(shè)置重加載寄存器的值
清除當(dāng)前數(shù)值寄存器的值
配置控制與狀態(tài)寄存器
16.3.2.2
代碼分析
SysTick屬于內(nèi)核的外設(shè),有關(guān)的寄存器定義和庫函數(shù)都在內(nèi)核相關(guān)的庫文件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); } // 設(shè)置重加載寄存器 SysTick->LOAD = (uint32_t)(ticks -1UL); // 設(shè)置中斷優(yōu)先級 NVIC_SetPriority(SysTick_IRQn, (1UL<< __NVIC_PRIO_BITS) -?1UL); // 設(shè)置當(dāng)前數(shù)值寄存器 SysTick->VAL =0UL; // 設(shè)置系統(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用來設(shè)置重加載寄存器的值,最大不能超過重加載寄存器的值224,當(dāng)重加載寄存器的值遞減到0的時候產(chǎn)生中斷,然后重加載寄存器的值又重新被裝載并再次遞減計數(shù),以此循環(huán)往復(fù)。緊隨其后設(shè)置好中斷優(yōu)先級,最后配置系統(tǒng)定時器的時鐘等于ICLK=200M,使能定時器和定時器中斷,這樣系統(tǒng)定時器就配置好了,一個庫函數(shù)搞定。
SysTick_Config()庫函數(shù)主要配置了SysTick中的三個寄存器:LOAD、VAL和CTRL,有關(guān)具體
的部分看代碼注釋即可。
16.3.2.2.2配置SysTick中斷優(yōu)先級
SysTick_Config()庫函數(shù)主要配置了SysTick中的三個寄存器:LOAD、VAL和CTRL,有關(guān)具體的部分看代碼注釋即可。其中還調(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); } }
-
單片機
+關(guān)注
關(guān)注
6071文章
45254瀏覽量
659933 -
內(nèi)核
+關(guān)注
關(guān)注
4文章
1427瀏覽量
42208 -
定時器
+關(guān)注
關(guān)注
23文章
3347瀏覽量
120915 -
Systick
+關(guān)注
關(guān)注
0文章
66瀏覽量
13793
原文標題:SysTick系統(tǒng)定時器——瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南(41)
文章出處:【微信號:瑞薩嵌入式小百科,微信公眾號:瑞薩嵌入式小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
對于Systick滴答定時器的理解
最簡單的滴答定時器程序簡介
SysTick—系統(tǒng)定時器
stm32的systick(滴答定時器)實現(xiàn)精準延時

利用systick實現(xiàn)1s定時

STM32F4: Systick滴答定時器-延時函數(shù)講解(五)

STM32筆記(七)---Systick系統(tǒng)定時器

【STM32】SysTick滴答定時器(delay延時函數(shù)講解)

評論