STM32 通用定時器基本定時功能

2021-07-24 11:12:31 字數 3775 閱讀 7354

1.    

stm32的timer簡介

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

定時器計數器解析度

計數器型別

預分頻係數

產生dma請求

捕獲/比較通道

互補輸出

tim1

tim8

16位向上,向下,向上/向下

1-65536之間的任意數可以4

有tim2

tim3

tim4

tim5

16位向上,向下,向上/向下

1-65536之間的任意數可以4

沒有tim6

tim7

16位向上1-65536之間的任意數可以0

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

2.     普通定時器tim2-tim5

2.1    時鐘**

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

·內部時鐘(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仍然可以得到較高的時鐘頻率。

2.2    計數器模式

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

2.3    程式設計步驟

1.       配置系統時鐘;

2.       配置nvic;

3.       配置gpio;

4.       配置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的引數如下表:

tim_clockdivision 描述

二進位制值

tim_ckd_div1

tdts = tck_tim

0x00

tim_ckd_div2

tdts = 2 * tck_tim

0x01

tim_ckd_div4

tdts = 4 * tck_tim

0x10

數字濾波器(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,因為軟體不可能在乙個相同的時刻同時更新多個暫存器,結果造成多個通道的時序不能同步,如果再加上其它因素(例如中斷),多個通道的時序關係有可能是不可預知的。

3.     程式源**

本例實現的是通過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

} }

STM32 通用定時器基本定時功能

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

STM32 通用定時器基本定時功能

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

STM32 通用定時器基本定時功能

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