stm32f4的定時器分布如下:
- 其中基本定時器包括tim6、tim7,其結構最簡單,也具有最基本的定時功能,一是用於基本定時、產生時基、二是用於驅動dac數模轉換器。
- 其中通用定時器包括time2-time5,time9-time14共10個;通用定時器除了包含基本定時器的功能外還有輸入捕獲、輸出比較和pwm功能等。
- 其中高階定時器包括tim1、tim8;
定時器的相關常用暫存器功能如下:
定時器的時鐘源有4個:
- 內部時鐘(ck_int)
- 外部時鐘模式1:外部輸入腳(tix)
- 外部時鐘模式2:外部觸發輸入(etr),僅適用於tim2、tim3、tim4
- 內部觸發輸入(itrx):使得a定時器作為b定時器的預分頻器(a為b提供時鐘)
這是通過設定timx_smcr的相關位來選擇的。其中內部時鐘(ck_int)來自於apb1或apb2匯流排。
該暫存器用於對時鐘進行分頻,然後提供給計數器,作為計數器的時鐘。
其中16位空間儲存分頻係數。
它儲存了定時器當前的計數值。
該暫存器在物理結構上對應著2個暫存器,乙個是程式設計師可以操作的,另乙個是看不到且不能操作的arm把它叫做影子暫存器。實際上真正起作用的是影子暫存器。
根據 timx_cr1 暫存器中 apre 位的設定: apre=0 時,預裝載暫存器的內容可以隨時傳送到影子暫存器,此時 2 者是連通的;而 apre=1 時,在每一次更新事件(uev)時,才把預裝載暫存器( arr) 的內容傳送到影子暫存器。
這裡我們只用最後一位:更新中斷使能(uie:update interrupt enable),改為置1用來允許由更新事件產生的中斷。
簡單應用中,我們只需要使用最後一位:計數器使能位(cen:counter enable),改為必須置1才能使計數器開始計數。
該暫存器用來標記當前定時器相關的各種事件/中斷是否發生。
接下來我們使用定時器產生定時中斷,根據配置定時器的實際步驟,以tim3為例解析配置過程。
定時器相關的庫函式主要集中在韌體庫檔案 stm32f4xx_tim.h 和 stm32f4xx_tim.c 檔案中。 定時器配置步驟如下:
tim3掛載在apb1下,所以要通過使能apb1匯流排的使能函式來使能tim3的時鐘源。
rcc_apb1periphclockcmd(rcc_apb1periph_tim3,enable); ///使能 tim3 時鐘
配置定時器相關引數。
void tim_timebaseinit(
tim_typedef *timx,
tim_timebaseinittypedef *tim_timebaseinitstruct
);
第乙個引數是指定哪個定時器;
第二個引數是定時器配置引數結構體;
typedef
struct tim_timebaseinittypedef;
實際的:
tim_timebaseinittypedef tim_timebasestructure; //宣告初始化引數結構體變數
tim_timebasestructure.tim_period = 5000; //以下開始填充
tim_timebasestructure.tim_prescaler =7199;
tim_timebasestructure.tim_clockdivision = tim_ckd_div1;
tim_timebasestructure.tim_countermode = tim_countermode_up;
tim_timebaseinit(tim3, &tim_timebasestructure); //執行初始化
庫函式tim_itconfig用來設定開啟中斷
void tim_itconfig(tim_typedef* timx, //指定哪個定時器
uint16_t tim_it, //指定中斷型別(更新中斷、觸發中斷等等)
functionalstate newstate); //使能還是失能
實際的:
tim_itconfig(tim3,tim_it_update,enable ); //使能更新中斷
既然使用中斷,就必須設定nvic,使用nvic_init 函式設定。這裡就不多講了,很常用。
配置好後要使能定時器,使其開始工作,使用tim_cmd函式:
void tim_cmd(tim_typedef* timx, //指定定時器
functionalstate newstate); //指定狀態
實際的:
tim_cmd(tim3, enable); //使能 tim3 外設
另外,韌體庫中還提供了兩個函式用來判斷定時器的狀態和清除定時器狀態標誌函式:tim_getflagstatus 和 tim_clearflag,它們的作用和上面兩個相似,不過它們要先判斷中斷是否使能,然後再判斷中斷標誌位,而tim_getitstatus直接判斷中斷標誌位。
實際的:
if (tim_getitstatus(tim3, tim_it_update) != reset) //判斷中斷狀態
tim_clearitpendingbit(tim3, tim_it_update ); //清除中斷
自動裝在暫存器arr值的計算:
tout= ((arr+1)*(psc+1))/tclk;
tclk:tim3的輸入時鐘頻率(單位為mhz)。
tout:tim3溢位時間(單位為us)。
計時1s,輸入時鐘頻率為72mhz,加入psc預分頻器的值為35999,那麼:
((1+psc )/72m)*(1+arr )=((1+35999)/72m)*(1+arr)=1秒
則可計算得出自動窗裝載暫存器arr=1999
編寫的time.c檔案:
[csharp]view plain
copy
#include "timer.h"
#include "led.h"
//通用定時器 3 中斷初始化
//這裡時鐘選擇為 apb1 的 2 倍,而 apb1 為 36m
//arr:自動重灌值。
//psc:時鐘預分頻數
//這裡使用的是定時器 3!
void tim3_int_init(u16 arr,u16 psc)
//定時器 3 中斷服務程式⑥
void tim3_irqhandler(void) //tim3 中斷
}[csharp]view plain
copy
tim_itconfig(tim3,tim_it_update,enable ); // 允許更新中斷
[html]view plain
copy
int main(void)
}
stm32關定時器 STM32定時器TIM3程式
include led.h include delay.h include key.h include sys.h include usart.h include timer.h stm32開發板實驗8 定時器中斷實驗 int main void delay init 延時函式初始化 nvic co...
STM32之定時器 例項
pwm輸出例項 pwm在電力電子技術中佔據著重要的地位,被廣泛地用在逆變電路之中。利用stm32定時器的pwm輸出功能,可以直接獲取pwm波。根據面積等效原理,利用規則取樣法 查表法可以調製出spwm波及各種調製pwm波形。這裡實現的是輸入占空比固定的pwm波形 ps 通用定時器tim3產生4路不同...
STM32之SysTick定時器
systick 作業系統的心跳 systick是系統滴答定時器,可以說是作業系統的的 心跳 它被綁在nvic中,用於產生systick異常 異常號 15 一旦產生systick異常,就會產生滴答中斷,這個滴答中斷對作業系統尤其重要。例如 作業系統可以為多個任務分配不同數目的時間片,確保沒有乙個任務霸...