STM32學習筆記3 Systick

2021-06-28 17:38:25 字數 2295 閱讀 8352

對於stm32中,有乙個經常用到,卻在資料手冊上很少資料的工具,那就是systick,這個工具是所有cortex-m0核心的微控制器所共有的,他是乙個系統定時器,其存在的主要目的是為嵌入式作業系統提供100hz(即10ms)的定時節拍。當然,也可以做為其它的普通定時等其他用途。下面,我們就開始理解這個定時器。

系統定時器包括四個暫存器,syst_csr、syst_rvr、syst_cvr、syst_calib。定義如下所示:

對於這幾個暫存器我們可以翻譯一下:

syst_rvr暫存器

reload 值可以是 0x00000001-0x00ffffff 範圍內的任何值。您可以將 reload 的值設為 0,這不會產生任何影響,因為計數值從 1變為 0時 systick 異常請求和 countflag都被啟用了。如果要產生乙個週期為 n個處理器時鐘週期的多次觸發定時器,就可以將 reload 值設為 n-1。例如,如果要求每隔 100個時鐘脈衝就觸發一次 systick 中斷,reload 就被設為 99。

syst_cvr暫存器

cvr暫存器用到bit0~23,即24位數,這是乙個狀態暫存器,當定時器開始運作,這個值在不斷地變化,從rvr暫存器獲取初值以後,倒計時到0.

syst_calib暫存器

校準暫存器syst_calib不用我們考慮,出廠前就配置好了。

__static_inline uint32_t systick_config(uint32_t ticks)

由函式內部的語句「systick->load = ticks – 1;」知道,ticks就是load值,即過載值,表示兩次中斷的計數。

例如,要產生10ms的中斷,可以在程式中如下呼叫函式:systick_config(systemcoreclock/100);函式引數中的systemcoreclock是當前主頻的值,假如現在的主頻是48mhz,systemcoreclock就是48 000 000 ,48 000 000 /100=480 000。我們把引數帶進去以後,load=479 999,也就是說,定時器開始執行後,定時器的值會從479 999遞減到0,進入中斷函式,然後再次從479 999 遞減到0,如此迴圈。至於為什麼從479 999遞減到0就是10ms?知道每遞減乙個值需要多長時間,那麼遞減480 000下,需要多長時間,就知道了。要知道每遞減乙個值需要多長時間,就需要知道當前定時器執行的時鐘是多少。由暫存器csr知道,定時器的時鐘有兩種,一種是等於主頻,一種是等於主頻的二分之一,由csr暫存器中的bit2決定。

函式中,對控制暫存器的bit0 bit1 bit2都置1,對照前面的暫存器定義可知,時鐘設定為等於主頻,開啟系統定時器中斷,允許定時器執行。

我們知道了時鐘,就知道定時器每遞減乙個值需要的時間了,即:1/systemcoreclock 秒,換算成毫秒即:(1/systemcoreclock)*1000=1000/systemcoreclock毫秒,即每遞減乙個值,耗時1000/systemcoreclock毫秒。所以如果要使得10ms定時,即10/(1000/systemcoreclock)=systemcoreclock/100,所以,我們的設定是正確的。以此類推,需要定時多長時間,你可以自己算乙個引數帶進去了,需要注意的是,load值是個24位數,帶進去的數不要超過24位數的最大值。還有乙個需要注意的地方,就是load值最小255,當你給load值帶進去小於255值,load會自動變成255。由於定時器syst_rvr暫存器為24位的,所以最大值為十六進製制ffffff,化為十進位制為16777215,所以最多能儲存資料為16777215+1=16777216;

利用cmsis中的函式我們可以寫如下的函式:

__io uint32_t mstick;

void systick_handler(void) // 中斷函式

void delay_ms(io uint32_t ms)

{ uint32_t endtime=msticks+ms;

systick_config((systemcoreclock/1000)*ms);

while(msticks進行1ms的精確延時。此外還可以修改systemcoreclock/1000進行不同時間的延時。

STM32學習筆記(3) 什麼是STM32

既然已經做好了開發stm32的準備,軟體硬體都準備好了,那麼我們來了解一下何為stm32吧。stm32是意法半導體 st 設計的一系列32位晶元的名字,細分為l f h三個系列。f系列是最經典的系列。f系列的基礎晶元是f1系列,低廉,麻雀雖小五臟俱全,我做課程設計最喜歡用的就是stm32f103c8...

STM32學習筆記

剛到公司實習,要學習stm32開發,boss給了一塊戰艦開發板,讓我自己寫乙個功能要用在公司的產品上。難啊。以前根本沒接觸過stm32,只能一步一步慢慢來,利用晚上利用週末惡補一下。哎,算是為了大學前兩年還債吧。一 跑馬燈實驗 gpio輸出 實驗環境 keil4 實驗平台 戰艦stm32開發板 gp...

stm32學習筆記

開漏模式輸出 輸出暫存器上的 0 啟用 n mos,而輸出暫存器上的 1 將埠 置於高阻狀態 p mos從 被啟用 推挽模式輸出 輸出暫存器上的 0 啟用 n mos,而輸出暫存器上的 1 將啟用 p mos。上拉輸入 輸入高電平,然後接乙個 上拉電阻 保護作用 讀取此時的引腳電平為高電平 下拉輸入...