1、系統定時器SysTick的簡介
系統定時器SysTick屬於內核外設,內嵌在NVIC中。SysTick是一個24位的向下遞減的計數器,計數器根據SysTick的時鍾源計數,當SysTick的計數器計數到0的時候,SysTick就產生一次中斷,並且SysTick的重裝載寄存器會給計數器重新賦值,以此循環往復。
SysTick一般用於帶操作系統的應用,用來產生時基,維持操作系統的心跳。
2、SysTick的寄存器
SysTick有4個寄存器:
-
- 控制及狀態寄存器CTRL;
- 重裝載數值寄存器LOAD;
- 當前數值寄存器VAL,即SysTick的計數器;
- 校准數值寄存器CALIB;
一般只需要配置CTRL、LOAD、VAL這三個寄存器,CALIB基本不使用。
控制及狀態寄存器CTRL
CTRL的bit16位COUNTFLAG用來判斷SysTick計數器是否遞減到0,當SysTick遞減到0的時候,COUNTFLAG會被置1,如果沒有使用SysTick的中斷功能,可以通過查詢該位是否為1來判斷SysTick定時器是否溢出。
CTRL的bit2位CLKSOURCE用來選擇SysTick的時鍾源:
當CLKSOURCE = 0時,SysTick的時鍾源為AHB/8;
當CLKSOURCE = 1時,SysTick的時鍾源為AHB;
一般ABH為SYSCLK的1分頻,所以SysTick的時鍾源可以選擇為SYSCLK或SYSCLK/8。
CTRL的bit1位TICKINT用來設置當SysTick計數到0的時候是否產生中斷:
當TICKINT = 0時,在SysTick計數到0的時候不會產生中斷;
當TICKINT = 1時,當SysTick計數到0的時候產生中斷。
CTRL的bit1位ENABLE是SysTick的使能位,當ENABLE = 1時,SysTick開始計數。
重裝載數值寄存器RELOAD
RELOAD寄存器是SysTick的自動重載數值寄存器,當SysTick的計數器遞減到0的時候,RELOAD寄存器的值會重新賦值給SysTick的計數器,讓SysTick可以重復計時。
當前數值寄存器VAL
當去讀取VAL寄存器的值時,返回的是SysTick計數器的當前值;當去寫VAL寄存器的時候,會使SysTick計數器的值清零,而且還會清除CTRL寄存器的bit16位COUNNTFLAG。
3、HAL庫操作SysTick
SysTick相關的寄存器定義和庫函數操作都是在Core_CM3.h頭文件內實現的。
在HAL中使用SysTick比較簡單,只需要通過Core_CM3.h文件中的SysTick_Config函數就可以了,通過將參數傳入SysTick_Config函數設置SysTick的自動重載數值。
調用SysTick_Config函數,SysTick的時鍾源會被配置成AHB,並且使能中斷,SysTick的中斷優先級也在SysTick_Config函數中配置了。如果需要更改配置,可以找到SysTick_Config函數,並修改。
SysTick的中斷服務函數在stm32f1xx_it.c文件中,SysTick的中斷處理過程在SysTick_Handler中實現。
初始化代碼如圖:
中斷服務函數