SysTick 是一個(gè) 24bit 的系統(tǒng)計(jì)時(shí)器杖们,計(jì)數(shù)器從 LOAD寄存器 中讀取數(shù)值(該數(shù)值最大為24bit)肩狂,不斷遞減,遞減為 0 時(shí)相應(yīng)標(biāo)志位置 1孝治,產(chǎn)生一個(gè)中斷請求审磁;
該寄存器通常用來產(chǎn)生精確的 延時(shí)(Delay)函數(shù);
SysTick寄存器
-
端口配置低寄存器 --- CTRL(Control and status register):使能SysTick和相應(yīng)中斷請求杭措,并配置時(shí)鐘來源钾恢;
作用---使能計(jì)數(shù)器(counter):位0 置 1 時(shí)計(jì)數(shù)器使能,置 0 時(shí)計(jì)數(shù)器關(guān)閉刑桑;
-
作用---使能中斷請求:位1 置 1 時(shí)中斷請求使能募舟,置 0 時(shí)中斷請求關(guān)閉(SysTick中斷為中斷向量表 系統(tǒng)中斷第16項(xiàng));
SysTick中斷 作用---選擇時(shí)鐘源:位2 置 1 時(shí)選擇 AHB 時(shí)鐘作為源琢锋,置 0 時(shí)選擇 AHB / 8 作為時(shí)鐘源呢灶;(默認(rèn)情況下AHBCLK = 72M)
位16 為標(biāo)志位 COUNTFLAG,為 1 時(shí)表明計(jì)數(shù)器的值為 0鲸阻;
復(fù)位值:0x0000 0000
-
讀取值寄存器 --- LOAD(reload value register):位23:0 儲存計(jì)數(shù)器要讀取的值缨睡;
- 復(fù)位值:0x0000 0000
-
當(dāng)前值寄存器 --- VAL(current value register):位23:0 儲存計(jì)數(shù)器當(dāng)前的值;
- 復(fù)位值:0x0000 0000
-
校準(zhǔn)值寄存器 --- CALIB(calibration value register):位23:0 儲存計(jì)數(shù)器校準(zhǔn)值和相應(yīng)標(biāo)志位的寄存器细诸;
- 復(fù)位值:0x0002328
常用SysTick固件庫函數(shù) (core_cm3.h)
SysTick配置函數(shù) --- SysTick_Config
static __INLINE uint32_t SysTick_Config(uint32_t ticks);
- 作用:使能 SysTick陋守,使能中斷請求并把該中斷優(yōu)先級設(shè)置為最低(0x1111)利赋,把時(shí)鐘源設(shè)置為 AHBCLK猩系,同時(shí)設(shè)置 reload = ticks;
- 注意:SysTick中斷優(yōu)先級寄存器與外設(shè)中斷優(yōu)先級寄存器不同季希,但仍可按優(yōu)先級規(guī)則判斷優(yōu)先級幽纷;
- ticks:LOAD寄存器中的值,為reload值友浸,必須是24位以內(nèi)的樹;
- 返回值:0則表示配置成功收恢,1則表示配置失敗伦意;
- 示例:
SysTick_Config(72000); //默認(rèn)系統(tǒng)為72M
//一般可不需讀取返回值,只要ticks值在24位以內(nèi)即可配置成功
編寫Delay函數(shù)
編寫一個(gè) 毫秒(ms) 級Delay函數(shù)
計(jì)算
設(shè) SysTick 時(shí)鐘源的頻率為 CLK (MHz)熏矿,LOAD寄存器中存儲的值為 reload离钝;
可得計(jì)數(shù)器在 1毫秒(ms) 內(nèi)震蕩 CLK×1000 次(即遞減 CLK×1000 次),我們要讓計(jì)數(shù)器中的值在 1毫秒(ms) 從 reload 遞減至 0卵渴,將 reload 的值設(shè)置為 CLK×1000 即可;
若采用默認(rèn)情況下 選取 AHBCLK = 72MHz昔榴,則將 LOAD 寄存器設(shè)置為 72000 即可碘橘。
程序思路
- SysTick_Config函數(shù) 使能SysTick并配置 reload值;
- 不斷讀取 COUNTFLAG 位直至其值為 1蛹屿,確認(rèn)計(jì)數(shù)器已經(jīng)遞減至 0错负;
- 產(chǎn)生相應(yīng)中斷;
實(shí)現(xiàn)代碼
void SysTick_Delay_ms(uint32_t tms)
{
uint32_t i;
SysTick_Config(72000); //默認(rèn)系統(tǒng)為72M
for(i=0; i<tms; i++)
{
//等待標(biāo)志位 COUNTFLAG 為 1
while(!((SysTick->CTRL) & (1<<16)));
}
//使能中斷請求
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}