定時器中斷

2022-09-16 11:33:09 字數 2655 閱讀 1262

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_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);

韌體庫中還有兩個函式是用來讀取狀態標誌位以及清除中斷標誌位,函式分別為tim_getflagstatus和tim_clearflag。

定時器中斷

系統初始化的時候在預設的系統初始化函式 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...