stm32 SysTick定時器常見問題和實現延時

2021-07-31 13:00:31 字數 1840 閱讀 3197

q:什麼是systick定時器?

systick 是乙個24 位的倒計數定時器,當計到0 時,將從reload 暫存器中自動重裝載定時初值。只要不把它在systick 控制及狀態暫存器中的使能位清除,就永不停息。

q:為什麼要設定systick定時器?

(1)產生作業系統的時鐘節拍

systick定時器被**在nvic中,用於產生systick異常(異常號:15)。在以前,大多作業系統需要乙個硬體定時器來產生作業系統需要的滴答中斷,作為整個系統的時基。因此,需要乙個定時器來產生週期性的中斷,而且最好還讓使用者程式不能隨意訪問它的暫存器,以維持作業系統「心跳」的節律。

(2)便於不同處理器之間程式移植

cortex‐m3處理器內部包含了乙個簡單的定時器。因為所有的cm3晶元都帶有這個定時器,軟體在不同 cm3器件間的移植工作得以化簡。該定時器的時鐘源可以是內部時鐘(fclk,cm3上的自由執行時鐘),或者是外部時鐘( cm3處理器上的stclk訊號)。不過,stclk的具體**則由晶元設計者決定,因此不同產品之間的時鐘頻率可能會大不相同,你需要檢視晶元的器件手冊來決定選擇什麼作為時鐘源。systick定時器能產生中斷,cm3為它專門開出乙個異常型別,並且在向量表中有它的一席之地。它使作業系統和其它系統軟體在cm3器件間的移植變得簡單多了,因為在所有cm3產品間對其處理都是相同的

(3)作為乙個鬧鈴測量時間。

systick定時器除了能服務於作業系統之外,還能用於其它目的:如作為乙個鬧鈴,用於測量時間等。要注意的是,當處理器在除錯期間被喊停(halt)時,則systick定時器亦將暫停運作。

q:systick如何執行?

首先設定計數器時鐘源,ctrl->clksource(控制暫存器);

設定過載值(reload暫存器);

清空計數暫存器val(就是下圖的current);

置ctrl->enable位 開始計時

如果是中斷則允許systick中斷,在中斷例程中處理。如採用查詢模式則不斷讀取控制暫存器的countflag標誌位,判斷是否計時至零。或者採取下列一種方法

當systick 定時器從1 計到0 時,它將把countflag 位置位;而下述方法可以清零之:

1. 讀取systick 控制及狀態暫存器(stcsr)

2. 往systick 當前值暫存器(stcvr)中寫任何資料

只有當val值為0時,計數器自動過載reload。

q:如何使用systicks作為系統時鐘?

systick 的最大使命,就是定期地產生異常請求,作為系統的時基。os 都需要這種「滴答」來推動任務和時間的管理。如欲使能systick 異常,則把stcsr.tickint 置位。另外,如果向量表被重定位到sram 中,還需要為systick 異常建立向量,提供其服務例程的入口位址。

q:如何使用systick完成一段延時?

中斷方式 參考:

初始化函式systick_configuration(void)放在while()迴圈外,執行一次:

void systick_configuration(void)  

延時函式,用時呼叫

void delay(u32 ntime)  

中斷函式,定時器減至零時呼叫,放在stm32f10x_it.c檔案中

void systickhandler(void)  

STM32 SysTick定時器做延時函式

原理介紹 systick計時器是乙個24位的倒計數定時器,主要用來做作業系統的定時器,每來乙個時鐘週期計數減1,當計數到0時,他就會自動從load暫存器中自動重灌設定的初值,操作時只要不把ctrl暫存器中的enable位清0,它就永遠不會停止,即使在睡眠狀態他也還是在繼續奮鬥。配置 如下 stati...

STM32 SYSTICK定時器及延時函式詳解

systick定時器 systick定時器被 在nvic中,用於產生systick異常 異常號 15 在以前,大多作業系統需要乙個硬體定時器來產生作業系統需要的滴答中斷,作為整個系統的時基。例如,為多個任務許以不同數目的時間片,確保沒有乙個任務能霸佔系統 或者把每個定時器週期的某個時間範圍賜予特定的...

STM32 SysTick兩種定時設計

方案1 void systick init void void delay 10us io u32 ntime void timingdelay decrement void void systick handler void 該方案每10us進一次中斷,進一次中斷timingdelay就減1,所以...