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

2021-10-09 11:24:34 字數 1538 閱讀 3367

systick定時器

systick定時器被**在nvic中,用於產生systick異常(異常號:15)。在以前,大多作業系統需要乙個硬體定時器來產生作業系統需要的滴答中斷,作為整個系統的時基。例如,為多個任務許以不同數目的時間片,確保沒有乙個任務能霸佔系統;或者把每個定時器週期的某個時間範圍賜予特定的任務等,還有作業系統提供的各種定時功能,都與這個滴答定時器有關。因此,需要乙個定時器來產生週期性的中斷,而且最好還讓使用者程式不能隨意訪問它的暫存器,以維持作業系統「心跳」的節律。

cortex‐m3處理器內部包含了乙個簡單的定時器systick。因為所有的cm3晶元都帶有這個定時器,軟體在不同 cm3器件間的移植工作得以化簡。該定時器可以用來做延時,或者實時系統的心跳時鐘。這樣可以節省mcu資源,不用浪費乙個定時器。比如在ucos中,分時復用,需要乙個最小的時間戳,一般在stm32+ucos的系統中,都採用systick做ucos心跳時鐘。

systick暫存器

systick主要有四個暫存器:ctrl(狀態和控制暫存器), load(自動重裝載值暫存器),val(當前值暫存器)以及callib(校準值暫存器)

態暫存器中的使能位清除,就永不停息。

相關配置函式詳解

static __inline uint32_t systick_config(uint32_t ticks)

延時初始化函式(無作業系統)

void delay_init(u8 sysclk)

延時函式

//延時nus微妙

//

void delay_us(u32 nus)

//當systick的load暫存器內的值倒數到0時,ctrl第16位countflag置1,非1為0退出迴圈,計時時間到

while((temp&0x01)&&!(temp&(1<<16)));

//關閉計數器

systick->ctrl=0x00;

當前值清0

systick->val =0x00;

}注意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;

}

參考:《stm32不完全手冊_暫存器版本_v3.1》

《cortex-m3權威指南(中文)》

STM32 SysTick定時器做延時函式

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

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,所以...