STM32學習筆記(五) 通用定時器計數延時

2021-09-19 18:17:49 字數 2019 閱讀 7699

stm32f40x系列總共最多有14個定時器,定時器分為三類:基本定時器、通用定時器和高階定時器。它們的都是通過計數來達到定時的目的,和51的定時器差不多,基本原理都是一樣的,就是功能多了一些,這些計數器都是自動重新裝載初值的,使用起來非常方便,而且計數時鐘頻率可以通過分頻係數來設定。本文章將介紹使用定時器中斷來控制led間隔1s閃爍。

我們使用定時器內部時鐘,即ck_int作為計數器的時鐘源 = 168mhz / 2 = 84mhz

定時器3時鐘使能

/*

初始化定時器引數,設定自動重灌值,分頻係數,計數方式

*/tim_init。tim_clockdivision= tim_ckd_div1; //

時鐘分頻因子

tim_init。tim_countermode=tim_countermode_up; //

定時器模式

tim_init。tim_period=period; //

自動重灌值,0-65535

tim_init。tim_prescaler=prescaler;

//tim_init。tim_prescaler= 8400;

//分頻係數-0。1ms

//tim_init。tim_prescaler= 42000;

//分頻係數-0。5ms

//tim_init。tim_repetitioncounter=

tim_timebaseinit(tim3,&tim_init);

tim_repetitioncounter是使用高階定時器要進行設定的。我們使用的是定時器3,屬於通用定時器,計數模式設定為向上計數,則計數器從0 開始計數,當計數到設定的初值時,然後計數器重新從0開始計數,並將溢位標誌位置1,如果設定了溢位中斷,則會產生計數器溢位中斷。

/*

定時器3中斷優先順序設定

*/nc_init。nvic_irqchannel=tim3_irqn; //

中斷通道指定定時器3

nc_init。nvic_irqchannelcmd=enable;

nc_init。nvic_irqchannelpreemptionpriority=0; //

設定搶占優先順序

nc_init。nvic_irqchannelsubpriority=0; //

設定響應優先順序

nvic_init(&nc_init);

tim_cmd(tim3,enable);

void tim3_irqhandler(void

) tim_clearitpendingbit(tim3,tim_it_update);

//清楚更新中斷標誌位

}

這裡檢測的是定時器溢位中斷,即計時1s時間到,則將led1的狀態反轉,然後將溢位標誌位清零。

int main(void

)}

這裡使用延時函式來延時1s控制led0閃爍,實際執行效果可以看出兩個led的閃爍在一定的時間內是同步的,但是時間一長還是有點誤差。

當學完這一節定時器的時候,我就有乙個想法了,那就是寫乙個lcd電子時鐘的程式,通過定時器來達到準確延時的目的,當然還要學習一下lcd1602的驅動方法,哈哈,想想就很有成就感。

STM32學習筆記(五) 通用定時器計數延時

stm32f40x系列總共最多有14個定時器,定時器分為三類 基本定時器 通用定時器和高階定時器。它們的都是通過計數來達到定時的目的,和51的定時器差不多,基本原理都是一樣的,就是功能多了一些,這些計數器都是自動重新裝載初值的,使用起來非常方便,而且計數時鐘頻率可以通過分頻係數來設定。本文章將介紹使...

stm32通用定時器

stm32的定時器是個強大的模組,定時器使用的頻率也是很高的,定時器可以做一些基本的定時,還可以做pwm輸出或者輸入捕獲功能。時鐘源問題 名為timx的有八個,其中tim1和tim8掛在apb2匯流排上,而tim2 tim7則掛在 apb1匯流排上。其中tim1 tim8稱為高階控制定時器 adva...

STM32通用定時器配置

stm32通用定時器配置 一 stm32 通用定時器原理 stm32 系列的cpu 有多達8 個定時器,其中tim1 和tim8 是能夠產生三對pwm 互補輸出的高階定時器,常用於三相電機的驅動,它們的時鐘由apb2 的輸出產生。其它6 個為普通定時器,時鐘由apb1 的輸出產生。下圖是stm32參...