原理介紹:
systick計時器是乙個24位的倒計數定時器,主要用來做作業系統的定時器,每來乙個時鐘週期計數減1,當計數到0時,他就會自動從load暫存器中自動重灌設定的初值,操作時只要不把ctrl暫存器中的enable位清0,它就永遠不會停止,即使在睡眠狀態他也還是在繼續奮鬥。
配置**如下:
static u8 fac_us=0;//us延時倍乘數
static u16 fac_ms=0;//ms延時倍乘數
//初始化延遲函式
//systick的時鐘固定為hclk時鐘的1/8
//sysclk:系統時鐘
void delay_init(u8 sysclk)
//延時nms
//注意nms的範圍
//systick->load為24位暫存器,所以,最大延時為:
//nms<=0xffffff*8*1000/sysclk
//sysclk單位為hz,nms單位為ms
//對72m條件下,nms<=1864
void delay_ms(u16 nms)
while(temp&0x01&&!(temp&(1<<16)));//等待時間到達
systick->ctrl=0x00; //關閉計數器
systick->val =0x00; //清空計數器
}
//延時nus
//nus為要延時的us數.
void delay_us(u32 nus)
while(temp&0x01&&!(temp&(1<<16)));//等待時間到達
systick->ctrl=0x00; //關閉計數器
systick->val =0x00; //清空計數器
}(1)、systick->ctrl&=0xfffffffb;選擇外部時鐘源(pllclk)作為系統時鐘**,ahb不分頻,之後ahb進行8分頻後送到核心,作為stclk時鐘,時鐘頻率為72/8=9mhz。
(2)、fac_us=sysclk/8; 延時乙個us秒需要裝入定時器的值,systick頻率為9mhz,1us時間內,定時器會減9,所以定時1us,裝入值為9。
(3)、fac_ms=(u16)fac_us*1000;延時ms秒,直接在us秒基礎上乘以1000。
(4)、systick->load=(u32)nms*fac_ms;設定延時x nms裝入得初值。
(5)、systick->val =0x00; 清零,進行自動重灌
(6)、systick->val =0x00; 開啟定時器
(7)、do
while(temp&0x01&&!(temp&(1<<16)));不斷查詢,定時到了硬體置位。
(8)、systick->ctrl=0x00; 時間到了關閉定時器
(9)、systick->val =0x00;清空計數器
(10)、延時us函式也是一樣的。
(10)、注意load暫存器是24bit暫存器,最大填入數值為2^24,超過了會溢位。
STM32 SYSTICK定時器及延時函式詳解
systick定時器 systick定時器被 在nvic中,用於產生systick異常 異常號 15 在以前,大多作業系統需要乙個硬體定時器來產生作業系統需要的滴答中斷,作為整個系統的時基。例如,為多個任務許以不同數目的時間片,確保沒有乙個任務能霸佔系統 或者把每個定時器週期的某個時間範圍賜予特定的...
stm32 SysTick定時器常見問題和實現延時
q 什麼是systick定時器?systick 是乙個24 位的倒計數定時器,當計到0 時,將從reload 暫存器中自動重裝載定時初值。只要不把它在systick 控制及狀態暫存器中的使能位清除,就永不停息。q 為什麼要設定systick定時器?1 產生作業系統的時鐘節拍 systick定時器被 ...
STM32 SysTick兩種定時設計
方案1 void systick init void void delay 10us io u32 ntime void timingdelay decrement void void systick handler void 該方案每10us進一次中斷,進一次中斷timingdelay就減1,所以...