定時器簡介和使用

2021-09-10 08:55:08 字數 3253 閱讀 3299

**

一、定時器簡介

定時器有systick(用於作業系統的時間片,或在裸機程式設計中用作普通定時器或實現精準延時),高階定時器tim1(包含通用定時器的所有功能並帶有死區控制和緊急剎車,可用於pwm控制電機),通用定時器tim2/3/14/15/16/17(輸入捕獲,輸出比較,定時計數),基本定時器tim6(用於定時計數和驅動dac)。使用哪個定時器根據你的soc資源和你的需求決定

1、時鐘**(因soc不同會有差異)

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

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

配置定時器:開啟tim的時鐘,設定定時器的分頻因子psc,過載值arr,使能nvic中的定時器對應的中斷。

啟動定時器:使能更新中斷timx_dier,使能計數器timx_cr1

中斷服務程式:重寫定時器中斷isr,提醒要對中斷源以及對應的那個定時器進行判斷,響應中斷時,要清空中斷標誌位

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。

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

SysTick滴答定時器簡介

概述 系統滴答定時器是乙個非常基本的倒計時定時器,用於在每隔一定的時間產生乙個中斷,即使是系統在睡眠模式下也能工作。它使得 os 在各 cm3器件之間的移植中不必修改系統定時器的 移植工作一下子容易多了。systick定時器也是作為 nvic 的一部分實現的。標頭檔案 ifndef systick ...

JS迴圈定時器和炸彈定時器

setinterval 迴圈定時器 規定時間間隔執行一次,像鬧鐘一樣,不關閉繼續執行 setinterval code,millisec,lang code 必需。要呼叫的函式或要執行的 串 millisec 必需。lang 可選。cleartimeout settime 清除定時器 60s倒計時特...

JS設定定時器和清除定時器

在做專案中難免會碰到需要實時重新整理,動畫依次出現等等需求,這時候就需要定時器登上我們的 舞台了,所以今天我們就先來了解一下js定時器的設定和清除吧。window物件提供了兩個方法來實現定時器的效果,分別是window.settimeout 和window.setinterval。其中前者可以使一段...