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起振。在看程式...