STM32學習之 定時器簡介

2021-08-09 11:45:29 字數 2473 閱讀 8975

本文為stm32定時器設計大體簡介。

一、定時器簡介

1、時鐘**

2、定時器結構(以基本定時器為例)

二、基本定時器的程式設計方法

1、基本定時器的暫存器

2、例程

/*** @brief 定時器6的初始化,定時週期0.01s

* @param 無

* @retval 無

*/void tim6_init(void)

三、疑惑與解答

以下問題皆以基本定時器為例進行闡述

1、何謂更新事件

更新事件就是指這個事件發生後,將會將定時器的暫存器進行更新,以使定時器工作在新的配置下,例如當乙個定時週期結束(計數器上溢)或者其他事件。

2、何謂自動重裝載暫存器(auto-reload register)

自動重裝載暫存器決定了定時器的上溢時機,當定時器的計數器中數值達到了自動重裝載暫存器規定的值,計數器就要歸零。也就是說自動重裝載暫存器決定了定時器的週期。假定timx_arr=0x36,而且分頻係數為1,則可以看到下邊的情況。

3、自動重裝載暫存器和預載入暫存器的區別與聯絡

當「timx_cr1.arpe = 1」的時候,stm32中有自動重裝載暫存器和預載入暫存器(timx_arr)。

預載入暫存器是自動重裝載暫存器的「影子」,也就是預載入暫存器是自動重裝載暫存器的緩衝器。自動重裝載暫存器的功能在2點已經說明,但是自動重裝載暫存器不是使用者用程式可以直接進行操作的,使用者需要借助於預載入暫存器(緩衝區)才能訪問它。

其目的是為了保證自動重裝載暫存器在合適的時候被修改,不允許其隨便被修改,否則可能導致在過渡的時候發生不期望的結果。

這是什麼乙個概念呢?

在定時器乙個週期結束的時候,產生了乙個更新中斷,我們在中斷服務程式中修改預載入暫存器(timx_arr),但是並沒有直接寫入到自動重裝載暫存器。在中斷剛一產生的時候(早於我們的服務程式),原來timx_arr的值被硬體自動裝入自動重裝載暫存器中。所以下乙個定時器週期的長度取決於「原來timx_arr的值」,而非我們在中斷服務程式中的修改值。

那麼什麼時候,我們的修改值才起作用呢?

當下乙個定時器週期結束的時候,我們對timx_arr的修改值就被硬體自動寫入到自動重裝載暫存器中,所以我們的修改值在下下個定時器週期才起作用。

而當「timx_cr1.arpe = 0」的時候,stm32中只有自動重裝載暫存器(timx_arr),沒有預載入暫存器。自動重裝載暫存器沒有緩衝區,對timx_arr的修改,也就是直接對自動重裝載暫存器的修改。

這種情形又怎樣看呢?

在定時器乙個週期結束的時候,產生了乙個更新中斷,我們在中斷服務程式中修改自動重裝載暫存器(timx_arr)。所以下乙個定時器週期的定時長度要取決於我們的這個修改值。

總結:① timx_cr1.arpe = 0,自動重裝載暫存器沒有緩衝區,對timx_arr的修改直接影響下乙個週期的定時長度。

② timx_cr1.arpe = 1,自動重裝載暫存器有緩衝區,對timx_arr的修改影響的是下下乙個週期的定時長度。

③ timx_cr1.arpe = 1,自動重裝載暫存器有緩衝區預載入暫存器(timx_arr),預載入暫存器更新到自動重裝載暫存器的時機是:當定期器乙個定時週期結束產生乙個更新事件的時候。

④ timx_cr1.arpe = 1,注意我們在寫程式的時候,給timx_arr賦值,並沒有真正的寫入到自動重裝載暫存器中,而是寫入到了預載入暫存器中。

當我們需要定時器以t1和t2交替工作:

⑤ timx_cr1.arpe = 0,自動重裝載暫存器沒有緩衝區,我們是在t1定時週期已經開始一會兒的時候,才去設定定時週期t1長度;在t2定時週期已經開始一會兒的時候,才去設定定時週期t2長度。因為當t1結束的時候,中斷發生後,我們在中斷程式中設定定時週期為t2。其實,此時定時器週期t2已經開始一段時間了。要知道定時器乙個週期結束的時候,硬體自動進入下乙個週期的計數,而不受軟體的控制。

⑥ timx_cr1.arpe = 1,自動重裝載暫存器有緩衝區,我們是在t1定時週期一開始,就去設定定時週期t1的長度;在t2定時週期一開始,就去設定定時週期t2的長度。因為當t1結束的時候,更新事件產生(中斷也發生),(我們在上乙個定時週期的中斷程式中已經設定定時週期為t2),timx_arr中的t2值被硬體更新進入到自動重裝載暫存器中。

⑦ 當t1、t2兩個週期都很大的時候,需要ticks比較多,兩種方式都不會出現錯誤。

但是當t1、t2兩個週期都很小的時候,需要ticks比較少,對於「timx_cr1.arpe = 0」的情況,就有可能出現問題。因為有可能在t1定時週期已經超過t1時間長度的時候,才去設定定時週期t1;在t2週期已經超過t2時間長度的時候,才去設定定時週期t2。

總結:在需要不斷切換定時器的週期時,而且週期都比較短,程式設計師需要通過預載入暫存器配合自動重裝載暫存器,來操作定時器,以保證定時器週期的平穩過渡。

自動重裝載暫存器是預載入的,每次讀寫自動重裝載暫存器時,實際上是通過讀寫預載入暫存器實現。根據timx_cr1 暫存器中的自動重裝載預載入使能位(arpe) ,寫入預載入暫存器的內容能夠立即或在每次更新事件時,傳送到它的影子暫存器。

STM32之定時器

stm32f4的定時器分布如下 其中基本定時器包括tim6 tim7,其結構最簡單,也具有最基本的定時功能,一是用於基本定時 產生時基 二是用於驅動dac數模轉換器。其中通用定時器包括time2 time5,time9 time14共10個 通用定時器除了包含基本定時器的功能外還有輸入捕獲 輸出比較...

stm32關定時器 STM32定時器TIM3程式

include led.h include delay.h include key.h include sys.h include usart.h include timer.h stm32開發板實驗8 定時器中斷實驗 int main void delay init 延時函式初始化 nvic co...

STM32之定時器 例項

pwm輸出例項 pwm在電力電子技術中佔據著重要的地位,被廣泛地用在逆變電路之中。利用stm32定時器的pwm輸出功能,可以直接獲取pwm波。根據面積等效原理,利用規則取樣法 查表法可以調製出spwm波及各種調製pwm波形。這裡實現的是輸入占空比固定的pwm波形 ps 通用定時器tim3產生4路不同...