1.定時器介紹
stm32f1的定時器非常多,由2個基本定時器(tim6、tim7)、4個通 用定時器(tim2-tim5)和2個高階定時器(tim1、tim8)組成。基本定 時器的功能最為簡單,類似於51微控制器內定時器。通用定時器是在基本 定時器的基礎上擴充套件而來,增加了輸入捕獲與輸出比較等功能。高階定 時器又是在通用定時器基礎上擴充套件而來,增加了可程式設計死區互補輸出、 重複計數器、帶剎車(斷路)功能,這些功能主要針對工業電機控制方面
1.1 通用定時器簡介
stm32f1的通用定時器包含乙個 16 位自動過載計數器(cnt),該計數器由可程式設計預分頻器(psc)驅動。stm32f1的通用定時器可用於多種 用途,包括測量輸入訊號的脈衝寬度(輸入捕獲)或者生成輸出波形(輸出 比較和pwm)等。 使用定時器預分頻器和 rcc 時鐘控制器預分頻器,脈 衝長度和波形週期可以在幾個微秒到幾個毫秒間調整。stm32f1 的每個 通用定時器都是完全獨立的,沒有互相共享的任何資源。
stm32f1的通用定時器timx (tim2-tim5 )具有如下功能:
(1)16 位向上、向下、向上/向下自動裝載計數器(timx_cnt)。
(2)16 位可程式設計(可以實時修改)預分頻器(timx_psc),計數器時鐘頻率的分頻係數為 1~65535之間的任意數值。
(3)4個獨立通道(timx_ch1-4),這些通道可以用來作為:
a.輸入捕獲
b.輸出比較
c. pwm 生成(邊緣或中間對齊模式)
d.單脈衝模式輸出
(4)可使用外部訊號(timx_etr)控制定時器,且可實現多個定時器互連(可以用1個定時器控制另外乙個定時器)的同步電路。
(5)發生如下事件時產生中斷/dma請求:
a.更新:計數器向上溢位/向下溢位,計數器初始化(通過軟體或者內部/外部觸發)
b.觸發事件(計數器啟動、停止、初始化或者由內部/外部觸發計數)
c.輸入捕獲
d.輸出比較
(6)支援針對定位的增量(正交)編碼器和霍爾感測器電路
(7)觸發輸入作為外部時鐘或者按週期的電流管理
1.2 通用定時器結構框圖
在捕獲模式下,捕獲發生在影子暫存器上,然後再複製到預裝載暫存器中。
在比較模式下,預裝載暫存器的內容被複製到影子暫存器中,然後影子暫存器的內容和計數器
進行比較。
2.通用定時器配置步驟
(1)使能定時器時鐘 rcc_apb1periphclockcmd(rcc_apb1periph_tim4,enable);//使能tim4時鐘
(2)初始化定時器引數,包含自動重灌值,分頻係數,計數方式等
void tim_timebaseinit(tim_typedef* timx , tim_timebaseinittypedef* tim_timebaseinitstruct);
typedef struct
tim_timebaseinittypedef;
了解結構體成員功能後,就可以進行配置,例如:韌體庫中還有兩個函式是用來讀取狀態標誌位以及清除中斷標誌位,函式分別為tim_getflagstatus和tim_clearflag。tim_timebaseinittypedef tim_timebaseinitstructure;
tim_timebaseinitstructure.tim_period=1000; //
自動裝載值
tim_timebaseinitstructure.tim_prescaler=35999; //
分頻係數
tim_timebaseinitstructure.tim_clockdivision=tim_ckd_div1;
tim_timebaseinitstructure.tim_countermode=tim_countermode_up; //
設定向上計數模式
tim_timebaseinit(tim4,&tim_timebaseinitstructure);
定時器定時時間計算公式如下:
tout= ((per)*(psc+1))/tclk;(3
)設定定時器中斷型別,並使能
void tim_itconfig(tim_typedef*timx, uint16_t tim_it, functionalstate newstate);(4
)設定定時器中斷優先順序,使能定時器中斷通道
nvic初始化庫函式是nvic_init();(5
)開啟定時器
void tim_cmd(tim_typedef*timx, functionalstate newstate);(6
)編寫定時器中斷服務函式
tim4_irqhandler
itstatus tim_getitstatus(tim_typedef*timx, uint16_t tim_it);
if(tim_getitstatus(tim4,tim_it_update))
void tim_clearitpendingbit(tim_typedef* timx, uint16_t tim_it);
定時器中斷
系統初始化的時候在預設的系統初始化函式 systeminit 函式裡面已經初始化 apb1 的時鐘為 2 分頻,所以 apb1 的時鐘為 36m。當 apb1 的時鐘分頻數為 1 的時候,tim2 7 的時鐘為 apb1 的時鐘,而如果 apb1 的時鐘分頻數不為 1,那麼 tim2 7 的時鐘頻率...
定時器中斷
tmod 0x01 th0 65536 50000 256 tl0 65536 50000 6 ea 1 et0 1 tr0 1 void timer0 interrupt 1 ea 1 開總中斷允許 et0 1 開定時器0允許 tmod 0x01 定時器選擇軟體啟動,工作方式為1 th0 6553...
定時器 中斷
1 實現電視劇集中的10s定時炸彈功能 炸彈炸了用蜂鳴器模擬 include unsigned char code smgduan 17 unsigned int ms,sec 10,s sbit p1 0 p1 0 void delay unsigned int n void isr timer0...