STM32之SysTick定時器

2021-08-18 17:54:34 字數 3834 閱讀 1356

systick-------作業系統的心跳

systick是系統滴答定時器,可以說是作業系統的的「心跳」,它被綁在nvic中,用於產生systick異常(異常號:15)。一旦產生systick異常,就會產生滴答中斷,這個滴答中斷對作業系統尤其重要。例如:作業系統可以為多個任務分配不同數目的時間片,確保沒有乙個任務霸佔系統,或者將每個定時器週期的某個時間範圍賜於特定的任務等。作業系統提供的各種定時功能都與這個滴答定時器有關,因此需要乙個定時器產生週期性的中斷,而且最好讓使用者程式不能隨意訪問它的暫存器。以維持作業系統「心跳」的節律。

而stm32核心包含了乙個簡單的定時器——systick,所有cm3晶元都帶有這個定時器,該定時器的時鐘源可以是內部時鐘,也可以是外部時鐘,在stm32中的systick以hclk(ahb時鐘)或hclk/8作為執行時鐘。

systick定時器能產生中斷,cm3為它專門開出乙個異常型別,便且在向量表中有它的一席之地。 systick定時器除了能服務於作業系統外,還能用於其他目的,比如作為鬧鈴,用於測量時間。

systick是系統滴答定時器,可以說是作業系統的的「心跳」,它被綁在nvic中,用於產生systick異常(異常號:15)。一旦產生systick異常,就會產生滴答中斷,這個滴答中斷對作業系統尤其重要。例如:作業系統可以為多個任務分配不同數目的時間片,確保沒有乙個任務霸佔系統,或者將每個定時器週期的某個時間範圍賜於特定的任務等。作業系統提供的各種定時功能都與這個滴答定時器有關,因此需要乙個定時器產生週期性的中斷,而且最好讓使用者程式不能隨意訪問它的暫存器。以維持作業系統「心跳」的節律。

而stm32核心包含了乙個簡單的定時器——systick,所有cm3晶元都帶有這個定時器,該定時器的時鐘源可以是內部時鐘,也可以是外部時鐘,在stm32中的systick以hclk(ahb時鐘)或hclk/8作為執行時鐘。

systick定時器能產生中斷,cm3為它專門開出乙個異常型別,便且在向量表中有它的一席之地。 systick定時器除了能服務於作業系統外,還能用於其他目的,比如作為鬧鈴,用於測量時間。

2.systick工作分析

systick是乙個24位的定時器,即一次最多可以計數2的24次方個時鐘脈衝,這個脈衝計數值被儲存到當前計數值暫存器stk_val中,只能向下計數,每收到乙個時鐘脈衝stk_val的值就向下減1,直至0。當stk_val的值被減為0時,由硬體自動把過載暫存器stk_load中儲存的資料載入到stk_val,重新向下計數。當stk_val的值被計數至0,就可以在中斷服務函式中處理定時事件了。

時間單位換算:1s=1000ms=10^6 us=10^9

下面我們來看程式:

/*

* 函式名 :main

* 描述 :主函式

* 輸入 :

* 輸出 :

*/int main(void)

}

在main函式中,systick_init( )和delay_us( )這兩個函式比較陌生,他們的功能分別是配置systick定時器和進行精確延時。整個main函式的流程就是初始化led及systick定時器之後,就進入死迴圈,輪流點亮led1,led2,led3,點亮的時間為精確的500ms。

接下來便是配置並啟動

systick

systick_init()這個函式,它是使用者在

systick.c這個檔案中實現的,其功能是啟動系統滴答定時器

systick,並將

systick配置為10us中斷一次。

#include "systick.h"

#include "stm32f10x_it.h"

#include "core_cm3.h"

#include "system_stm32f10x.h"

static __io u32 timingdelay;

/** 函式名 :systick_init

* 描述 :啟動系統滴答定時器 systick

* 輸入 :

* 輸出 :

* 呼叫 :外部呼叫

*/void systick_init(void)

//關閉滴答定時器

systick->ctrl &= ~ systick_ctrl_enable_msk;

} /*

* 函式名:delay_us

* 描述 :us 延時程式,10us 為乙個單位

* 輸入 :

* 輸入 :

* 呼叫 : delay_us(1) 則實現的延時為1*10us = 10us

*/void delay_us(__io u32 ntime)

/** 函式名:timingdelay_decerment

* 描述 : 獲取節拍程式

* 輸入 :

* 輸入 :

* 呼叫 : 在systick中斷函式 systick_handler()呼叫

*/void timingdelay_decrement(void)

}

systick_init() 函式實際上只呼叫了systick_config()函式,它是屬於核心層的cortex_m3通用函式,位於core_cm3.h檔案中,若呼叫systick_config()配置systick不成功,則進入死迴圈,初始化systick成功後,先關閉定時器,需要的時候再開啟。

使能   關閉定時器//

使能滴答定時器

systick->ctrl |= systick_ctrl_enable_msk; //(或運算)

//使能滴答定時器

systick->ctrl &= ~systick_ctrl_enable_msk;//(與運算)

接下來到編寫中斷服務程式啦

讓我們回到main函式中,我們使led工作在乙個無限迴圈中,在led的開與關之間呼叫了delay_us函式

/*

* 函式名:delay_us

* 描述 :us 延時程式,10us 為乙個單位

* 輸入 :

* 輸入 :

* 呼叫 : delay_us(1) 則實現的延時為1*10us = 10us

*/void delay_us(__io u32 ntime)

一旦我們呼叫了delay_us()函式,systick定時器就被開啟,按照設定好的定時週期遞減技術,當systick的計數暫存器的值減為0時,就進入中斷函式,當中斷函式執行完畢之後重新計時,如此迴圈,除非它被關閉。

使用

systick 測量時間的功能

stm32的Systick定時器

systick定時器簡介 systick定時器就是系統滴答定時器,乙個24 位的倒計數定時器,計到0 時,將從reload 暫存器中自動重裝載定時初值。只要不把它在systick 控制及狀態暫存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。systick定時器被 在nvic中,用於產生sy...

STM32開發 Systick定時器

參看 stm32菜鳥成長記錄 系統滴答定時器 systick 應用 參看 systick定時器和delay延遲函式 systick定時器被 在nvic中,用於產生systick異常 異常號 15 在以前,大多作業系統需要乙個硬體定時器來產生作業系統需要的滴答中斷,作為整個系統的時基。例如,為多個任務...

STM32關於Systick定時器

delay ms和delay us支援 os 需要用到的三個巨集定義 值為 1,當 os 還未執行時,該巨集定義值為 0。delay ostickspersec,用於表示 os 的時鐘節拍,即 os 每秒鐘任務排程次數。delay osintnesting,用於表示 os 中斷巢狀級別,即中斷巢狀次...