STM32定時器學習記錄(二)

2021-10-25 10:30:07 字數 1329 閱讀 6862

問題由來:專案需要對乙個外部輸入訊號統計一段時間內負脈衝(低電平)的個數

思路:乙個定時器用來計時1分鐘,乙個定時器通過etr模式進行邊沿檢測並計數(本次檢測下降沿以獲取負脈衝個數)

平台:stm32f103小板-正點原子(pwm輸出,上一次已介紹)+stm32f407最小系統板(定時計數)

定時1分鐘實現:由於採用的f407 的tim3進行計時,,tim3 的時

鐘為 84m,再根據我們設計的 arr 和 psc 的值,就可以計算中斷時間了。計算公式如下:

tout= ((arr+1)*(psc+1))/tclk;

其中:tclk:tim3 的輸入時鐘頻率(單位為 mhz)。

tout:tim3 溢位時間(單位為 us)。

而arr和psc兩個最大取到65535,最大計時約為51秒多一點,因此單個中斷不能實現,這裡就設定6秒進一次中斷,在中斷裡用乙個變數進行計數,當計數到10時再去執行其他操作。tim3配置和中斷函式如下:

//通用定時器3中斷初始化

//arr:自動重灌值。

//psc:時鐘預分頻數

//定時器溢位時間計算方法:tout=((arr+1)*(psc+1))/ft us.

//ft=定時器工作頻率,單位:mhz

//這裡使用的是定時器3!

void tim3_int_init(u16 arr, u16 psc)

u16 cnt=0;

u8 count=0;

//定時器3中斷服務函式

void tim3_irqhandler(void)

tim_clearitpendingbit(tim3, tim_it_update); //清除中斷標誌位

}

脈衝計數採用tim5,每個下降沿計數一次,tim配置如下:

void tim5_etr_init(u16 arr)

void tim5_irqhandler()

}

主函式:

int main(void)

led0=!led0;

delay_ms(1000);

}}

本次傳送的波形頻率為100hz,週期為10ms,第一分鐘的計數值誤差較大,後續計數穩定在5917負脈衝,理論上應該6000個負脈衝,最初以為是計數器精度問題,後用示波器實際測量輸出波形,發現其頻率為10.14ms左右,60s內的負脈衝個數算出來約為5917,因此判斷問題是由於pwm波傳送的實際週期大於設定週期導致。

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學習 SysTick定時器

systick定時器是乙個簡單的定時器,cm3和cm4核心晶元都有systick定時器。systick定時器是乙個24位的倒計數定時器,計到0時,將從reload暫存器中自動重裝載定時初值。只要不把它在systick控制及狀態暫存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。systick...

STM32學習 定時器(通用定時器)

如圖所示,輸出理解時注意兩種訊號ocxref和ocx,ocx是直接連到埠的訊號,ocxref是輸出控制的輸出訊號。一般在參考手冊中大多數講ocxref。ocx與ocxref可由ccxp控制是否反向,由ccxe控制訊號輸出。比較輸出功能 輸出乙個波形 指示一段給定時間已到。它的原理是通過計數器的值cn...