STM32F103內部定時器TIM

2021-07-27 10:29:24 字數 3270 閱讀 4520

1、stm32f103內部定時器有哪些?

stm32一共有8個通用16位timer,其中timer1和timer8是高階定時器,其它的timer2~timer7是普通定時器。

此外還有乙個systick(系統滴答定時器),這個定時器通常在作業系統中作為系統的任務切換週期。

還有乙個rtc,是乙個毫秒定時器,支援秒級中斷,用來做實時時鐘計數器。

看門狗定時器 也可以算乙個。

8個定時器中,timer1 和timer8是由apb2(輸出最高頻率為72mhz)預分頻後,再通過乙個倍頻器得到時鐘頻率,最高為72mhz。timer2~timer7則是由apb1(輸出最高頻率為36mhz)預分頻後,再通過乙個倍頻器得到時鐘頻率,最高為36mhz。

這裡我通過定時器來控制乙個led亮0.5s 滅0.5s ,交替閃爍。當然要讓定時器正常工作起來,還要配置中斷nvic。定時器計數到某個數,產生中斷,從而進入中斷服務程式,點亮led燈。

main函式分析:

#include "stm32f10x.h"

void gpio_config(void)//gpio配置

gpio_inittypedef gpio_initstructure;

rcc_apb2periphclockcmd(rcc_apb2periph_gpioc,enable);//使能gpioc的時 

gpio_initstructure.gpio_pin = gpio_pin_13;  

//選擇管腳pc.13作led燈

gpio_initstructure.gpio_speed = gpio_speed_50mhz; 

//管腳速度為50m

gpio_initstructure.gpio_mode = gpio_mode_out_pp; 

//設定輸出模式為推挽輸出

gpio_init(gpioc, &gpio_initstructure); 

//將上述設定寫入到gpioc裡去

void nvic_config(void) 

//中斷控制器的配置

nvic_inittypedef nvic_initstructure;

nvic_prioritygroupconfig(nvic_prioritygroup_0); 

//優先組設定

nvic_initstructure.nvic_irqchannel =tim2_irqn ; 

//tim2中斷選通

nvic_initstructure.nvic_irqchannelpreemptionpriority = 0;  

//搶占優先順序

nvic_initstructure.nvic_irqchannelsubpriority = 0;  

//子優先順序

nvic_initstructure.nvic_irqchannelcmd = enable; 

//使能中斷控制

nvic_init(&nvic_initstructure);

void timer_config(void) 

//定時器的配置

tim_timebaseinittypedef 

tim_timebasestructure; 

rcc_apb1periphclockcmd(rcc_apb1periph_tim2 , enable);  //timer2 時鐘使能

tim_deinit(tim2); 

//復位tim2定時器 

tim_timebasestructure.tim_period=1000; 

//定時器週期

tim_timebasestructure.tim_prescaler=36000-1; 

//預分頻數

tim_timebasestructure.tim_clockdivision=tim_ckd_div1; 

//tim2時鐘分頻,為1表示不分頻

tim_timebasestructure.tim_countermode=tim_countermode_up;//定時器計數為向上計數模式

tim_timebaseinit(tim2, &tim_timebasestructure); 

tim_clearflag(tim2, tim_flag_update); 

//清除定時器2的溢位標誌位

tim_itconfig(tim2,tim_it_update,enable); 

//使能定時器2溢位中斷

tim_cmd(tim2, enable); 

//定時器2使能

int main(void)

systeminit();//初始化時鐘,配置為72mhz,我試過將這句注釋掉,好像不影響結果。查 

了一下,在配置

//main函式之前的啟動**有這樣一句  ldr r0, =systeminit,我疑惑的是難 

道啟動的時候就配成72mhz? 

gpio_config();

nvic_config();

timer_config();

while(1)

中斷服務函式

void tim2_irqhandler(void)

static int flag_bit=0;//定義乙個標誌位

if ( tim_getitstatus(tim2 , tim_it_update) != reset ) //判斷中斷溢位標誌為是否為1

這個函式是寫在stm32f10x_it.c 裡面的,我對tim2_irqhandler()函式的理解應該是這樣的:

首先由定時器定時,定時好了產生中斷溢位標誌位,傳送中斷

然後進入中斷服務函式tim2_irqhandler(),進入函式之後要做的就是清除中斷溢位 

標誌位。

最後再執行函式裡的其他內容。

定時器定時時間計算是這兩句:

tim_timebasestructure.tim_period=1000; 

//定時器週期

tim_timebasestructure.tim_prescaler=36000-1; 

//預分頻數

prescaler可以理解為定時器的基數是72m  /  prescaler+1  = 2000k,也就是500us ,period 可以理解為要計數多少次,這裡是1000次。 所以就是每500us記一次,計數1000次,就是500ms。

公式為:

period / (72m / (prescaler+1) )=____ 秒

1000 / (72 m/ (35999+1) )  =  0.5 秒

STM32F103定時器配置

一 什麼是定時器 定時器,顧名思義,就是用於定時或計數,它其實就是乙個加1計數器。二 了解stm32f103定時器 stm32通用暫存器有tim2 tim3 tim4 tim5。功能包括 1 16位向上 向下 向上 向下自動裝載計數器 timx cnt 2 16位可程式設計預分頻器 timx psc...

STM32F103常規定時器

首先非常感謝秉火和正點原子兩個團隊為我們提供學習stm32的豐富資料及詳細教程。為加深記憶,也方便同行新手們一同學習進步,略作整理,以備檢視,如有錯誤,歡迎指正,如有侵權,聯絡刪帖!定時器分類 stm32f1 系列微控制器中,除了互聯型的產品,都有 8 個定時器,分為2個基本定時器,4個通用定時器和...

STM32F103 滴答定時器定時不准

緣由 做了五片同樣的板子,功能是使用板子上的感測器採集資料後,利用stm32f103串列埠將資料傳輸出去,就其中一片板子資料傳輸比其他的慢,原本正常使用串列埠115200波特率傳輸一幀資料只需要1s多,而那塊板子傳輸資料得十幾秒。一開始用示波器對時鐘測量都是ok的,外部晶振也是8mhz起振。在看程式...