STM32 定時器用於外部脈衝計數

2021-06-22 20:21:22 字數 2655 閱讀 7126



stm32的定時器是灰常nb的,也是灰常讓人頭暈的(當然是對於白菜來說的)。

stm32中的定時器有很多用法:

(一)系統時鐘(systick)

設定非常簡單,以下是產生1ms中斷的設定,和產生10ms延時的函式:

void rcc_configuration(void) }

void systick_handler(void)//在中斷處理函式中的程式

}//呼叫程式:

delay_ms(10);

當然,前提是要設定好,變數tim要設定成volatile型別的。

(二)第二種涉及到定時器計數時間(timx)

/*tim3時鐘配置*/

tim_timebasestructure.tim_prescaler = 2;       //預分頻(時鐘分頻)72m/(2+1)=24m

tim_timebasestructure.tim_countermode = tim_countermode_up;   //向上計數

tim_timebasestructure.tim_period = 65535;        //裝載值18k/144=125hz

tim_timebasestructure.tim_clockdivision = tim_ckd_div1;

tim_timebasestructure.tim_repetitioncounter = 0x0;

tim_timebaseinit(tim3,&tim_timebasestructure);

定時時間計算:

tim_timebasestructure.tim_prescaler = 2;

//分頻2      72m/(2+1)/2=24mhz

tim_timebasestructure.tim_period = 65535; //計數值65535

((1+tim_prescaler )/72m)*(1+tim_period )=((1+2)/72m)*(1+65535)=0.00273秒=366.2hz */

注意兩點(來自大蝦網,未經檢驗)

(1)timx(1-8),在庫設定預設的情況下,都是72m的時鐘;

(2)tim_timebasestructure.tim_repetitioncounter=0;

是重複計數,就是重複溢位多少次才給你來乙個溢位中斷,

它對應的暫存器叫tim1 rcr.

如果這個值不配置,上電的時候暫存器值可是隨機的,本來1秒中斷一次,可能變成n 秒中斷一次,讓你超級頭大!

因為用stm32f103c8作主控制器,來控制小車,小車的轉速由兩路光電編碼盤輸入(左右各一路).因此想到外部時鐘觸發模式(tim——etrclockmode2config)。

可以試好好久,發現tim1不能計數,到網上查了很久,也沒有找到相關的文章,開始懷疑tim1是不是需要特殊設定。經過很久的糾結,終於找到了問題——其實是我自己在gpio設定的時候,後面的不小心覆蓋了前面的了——沒想到自己也會犯這麼sb的事情。

現總結程式如下:

第一步,設定gpio

gpio_inittypedef gpio_initstructure;

/* pa0,pa12-> 左右脈衝輸入 */

gpio_initstructure.gpio_pin = gpio_pin_0|gpio_pin_12;

gpio_initstructure.gpio_mode = gpio_mode_in_floating; //

gpio_initstructure.gpio_speed = gpio_speed_50mhz; //50m時鐘速度

gpio_init(gpioa, &gpio_initstructure);

注意:(1)stm32f103c8只有tim1_etr(pa12,pin33),和tim2_ch1_etr(pa0,pin10)兩個可以用。其它更多管腳的晶元,有更多的可以輸入(如100管腳的有4個可以輸入的);(2)外部時鐘輸入與中斷無關;(3)stm32f103c8的這個兩個應用中,不需要重對映。

對於哪些需要重對映,參考資料手冊。

第二步:設定rcc

rcc_clockstypedef rcc_clockfreq;

systeminit();//源自system_stm32f10x.c檔案,只需要呼叫此函式,則可完成rcc的配置.

rcc_getclocksfreq(&rcc_clockfreq);

rcc_apb2periphclockcmd(rcc_apb2periph_gpioa, enable);

rcc_apb2periphclockcmd(rcc_apb2periph_gpiob, enable);

rcc_apb2periphclockcmd(rcc_apb2periph_tim1, enable);

rcc_apb1periphclockcmd(rcc_apb1periph_tim2, enable);

第三步,設定定時器模式

void tim1_configuration(void) //只用乙個外部脈衝埠

void tim2_configuration(void) //只用乙個外部脈衝埠

第四步,可以在主函式中讀取計數器的值,其它的應用,就看具體的情況了。

u16 coun1=0;

u16 coun2=0;

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主從模式定時器產生精確脈衝個數

stm32的每個定時器都可以由另乙個定時器觸發啟動定時器一般是通過軟體設定而啟動,stm32的每個定時器也可以通過外部訊號觸發而啟動,還可以通過另外乙個定時器的某乙個條件被觸發而啟動.這裡所謂某乙個條件可以是定時到時 定時器超時 比較成功等許多條件.這種通過乙個定時器觸發另乙個定時器的工作方式稱為定...

STM32定時器單脈衝模式及其應用

stm32的定時器可以配置為單脈衝模式,所謂的單脈衝就是通過配置定時器使其在乙個可控延時後,產生乙個脈寬可控的脈衝。使用stm32cubemx工具配置起來非常方便。硬體環境 stm32f103c8t6 軟體環境 stm32cubemx v5.5.0 hal庫 stm32cubef1 firmware...