1.stm32的timer簡介
stm32中一共有11個定時器,其中2個高階控制定時器,4個普通定時器和2個基本定時器,以及2個看門狗定時器和1個系統嘀嗒定時器。其中系統嘀嗒定時器是前文中所描述的systick,看門狗定時器以後再詳細研究。今天主要是研究剩下的8個定時器。
定時器計數器解析度
計數器型別
預分頻係數
產生dma請求
捕獲/比較通道
互補輸出
tim1
tim8
16位向上,向下,向上/向下
1-65536之間的任意數可以有
tim2
tim3
tim4
tim5
16位向上,向下,向上/向下
1-65536之間的任意數
可以沒有
tim6
tim7
16位向上
1-65536之間的任意數
可以沒有
其中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個定時器。定時器計數器解析度 計數器型...