stm32F103定時器使用方法

2021-10-10 06:47:24 字數 3329 閱讀 9442

3、程式源**

4、總結

stm32中一共有11個定時器,其中2個高階控制定時器,4個普通定時器和2個基本定時器,以及2個看門狗定時器和1個系統嘀嗒定時器。其中系統嘀嗒定時器是前文中所描述的systick,看門狗定時器以後再詳細研究。今天主要是研究剩下的8個定時器。

其中tim1和tim8是能夠產生3對pwm互補輸出的高階登時其,常用於三相電機的驅動,時鐘由apb2的輸出產生。tim2-tim5是普通定時器,tim6和tim7是基本定時器,其時鐘由apb1輸出產生。由於stm32的timer功能太複雜了,所以只能一點一點的學習。因此今天就從最簡單的開始學習起,也就是tim2-tim5普通定時器的定時功能。

計數器時鐘可以由下列時鐘源提供:

·內部時鐘(ck_int)

·外部時鐘模式1:外部輸入腳(tix)

·外部時鐘模式2:外部觸發輸入(etr)

·內部觸發輸入(itrx):使用乙個定時器作為另乙個定時器的預分頻器,如可以配置乙個定時器timer1而作為另乙個定時器timer2的預分頻器。

由於今天的學習是最基本的定時功能,所以採用內部時鐘。tim2-tim5的時鐘不是直接來自於apb1,而是來自於輸入為apb1的乙個倍頻器。這個倍頻器的作用是:當apb1的預分頻係數為1時,這個倍頻器不起作用,定時器的時鐘頻率等於apb1的頻率;當apb1的預分頻係數為其他數值時(即預分頻係數為2、4、8或16),這個倍頻器起作用,定時器的時鐘頻率等於apb1的頻率的2倍。

apb1的分頻在stm32_systick的學習筆記中有詳細描述。通過倍頻器給定時器時鐘的好處是:apb1不但要給tim2-tim5提供時鐘,還要為其他的外設提供時鐘;設定這個倍頻器可以保證在其他外設使用較低時鐘頻率時,tim2-tim5仍然可以得到較高的時鐘頻率。

tim2-tim5可以由向上計數、向下計數、向上向下雙向計數。向上計數模式中,計數器從0計數到自動載入值(timx_arr計數器內容),然後重新從0開始計數並且產生乙個計數器溢位事件。

在向下模式中,計數器從自動裝入的值(timx_arr)開始向下計數到0,然後從自動裝入的值重新開始,並產生乙個計數器向下溢位事件。而**對齊模式(向上/向下計數)是計數器從0開始計數到自動裝入的值-1,產生乙個計數器溢位事件,然後向下計數到1並且產生乙個計數器溢位事件;然後再從0開始重新計數。

配置系統時鐘;

配置nvic;

配置gpio;

配置timer;

其中,前3項在前面的筆記中已經給出,在此就不再贅述了。

第4項配置timer有如下配置:

(1)利用tim_deinit()函式將timer設定為預設預設值;

(2)tim_internalclockconfig()選擇timx來設定內部時鐘源;

(3)tim_perscaler來設定預分頻係數;

(4)tim_clockdivision來設定時鐘分割;

(5)tim_countermode來設定計數器模式;

(6)tim_period來設定自動裝入的值;

(7) tim_arrperloadconfig()來設定是否使用預裝載緩衝器;

(8)tim_itconfig()來開啟timx的中斷;

其中(3)-(6)步驟中的引數由tim_timerbaseinittypedef結構體給出。

步驟(3)中的預分頻係數用來確定timx所使用的時鐘頻率,具體計算方法為:ck_int/(tim_perscaler+1)。ck_int是內部時鐘源的頻率,是根據2.1中所描述的apb1的倍頻器送出的時鐘,tim_perscaler是使用者設定的預分頻係數,其值範圍是從0 – 65535。

步驟(4)中的時鐘分割定義的是在定時器時鐘頻率(ck_int)與數字濾波器(etr,tix)使用的取樣頻率之間的分頻比例。tim_clockdivision的引數如下表:

數字濾波器(etr,tix)是為了將etr進來的分頻後的訊號濾波,保證通過訊號頻率不超過某個限定。

步驟(7)中需要禁止使用預裝載緩衝器。當預裝載緩衝器被禁止時,寫入自動裝入的值(timx_arr)的數值會直接傳送到對應的影子暫存器;如果使能預載入暫存器,則寫入arr的數值會在更新事件時,才會從預載入暫存器傳送到對應的影子暫存器。

arm中,有的邏輯暫存器在物理上對應2個暫存器,乙個是程式設計師可以寫入或讀出的暫存器,稱為preload register(預裝載暫存器),另乙個是程式設計師看不見的、但在操作中真正起作用的暫存器,稱為shadow register(影子暫存器);設計preload register和shadow register的好處是,所有真正需要起作用的暫存器(shadow register)可以在同乙個時間(發生更新事件時)被更新為所對應的preload register的內容,這樣可以保證多個通道的操作能夠準確地同步。如果沒有shadow register,或者preload register和shadow register是直通的,即軟體更新preload register時,同時更新了shadow register,因為軟體不可能在乙個相同的時刻同時更新多個暫存器,結果造成多個通道的時序不能同步,如果再加上其它因素(例如中斷),多個通道的時序關係有可能是不可預知的。

本例實現的是通過tim2的定時功能,使得led燈按照1s的時間間隔來閃爍

**如下(示例):

#include

"stm32f10x_lib.h"

void

rcc_cfg()

;void

timer_cfg()

;void

nvic_cfg()

;void

gpio_cfg()

;int

main()

void

rcc_cfg()

//允許tim2的時鐘

rcc_apb1periphclockcmd

(rcc_apb1periph_tim2,enable)

;//允許gpio的時鐘

rcc_apb2periphclockcmd

(rcc_apb2periph_gpiob,enable);}

void

timer_cfg()

void

nvic_cfg()

void

gpio_cfg()

在stm32f10x_it.c中,我們找到函式tim2_irqhandler

(),並向其中新增**

void

tim2_irqhandler

(void

)else

}}

以上就是今天要講的內容,本文僅僅簡單介紹了定時器的使用。

STM32F103定時器配置

一 什麼是定時器 定時器,顧名思義,就是用於定時或計數,它其實就是乙個加1計數器。二 了解stm32f103定時器 stm32通用暫存器有tim2 tim3 tim4 tim5。功能包括 1 16位向上 向下 向上 向下自動裝載計數器 timx cnt 2 16位可程式設計預分頻器 timx psc...

STM32F103內部定時器TIM

1 stm32f103內部定時器有哪些?stm32一共有8個通用16位timer,其中timer1和timer8是高階定時器,其它的timer2 timer7是普通定時器。此外還有乙個systick 系統滴答定時器 這個定時器通常在作業系統中作為系統的任務切換週期。還有乙個rtc,是乙個毫秒定時器,...

STM32F103常規定時器

首先非常感謝秉火和正點原子兩個團隊為我們提供學習stm32的豐富資料及詳細教程。為加深記憶,也方便同行新手們一同學習進步,略作整理,以備檢視,如有錯誤,歡迎指正,如有侵權,聯絡刪帖!定時器分類 stm32f1 系列微控制器中,除了互聯型的產品,都有 8 個定時器,分為2個基本定時器,4個通用定時器和...