STM32----通用定时器TIM2~TIM5的三种功能
通用定時器TIM2~5
引腳定義
TIM2_CH1------PA0
TIM2_CH2------PA1
TIM2_CH3------PA2
TIM2_CH4------PA3
TIM3_CH1------PA6
TIM3_CH2------PA7
TIM3_CH3------PB0
TIM3_CH4------PB1
對于通用定時器主要有三個功能:
基本定時器功能
TIM2~5的基本定時器功能與基本定時器TIM6和TIM7類似,不過不同的是,對于基本定時器中的計數(shù)器只能向上計數(shù),而通用定時器的計數(shù)器可以配置計數(shù)模式向上或者向下。
向上計數(shù)模式:從零開始向上計數(shù),當(dāng)達(dá)到TIMx_ARR中的值時,計數(shù)器清零,然后產(chǎn)生一個計數(shù)器溢出中斷
向下計數(shù)模式:從TIMx_ARR中的數(shù)值開始向下計數(shù),當(dāng)計數(shù)器中數(shù)為0時,自動將TIMx_ARR中的數(shù)重裝入計數(shù)器,同時產(chǎn)生一個向下溢出事件。
PWM脈沖輸出
對應(yīng)于上面的GPIO口,將對應(yīng)的GPIO配置為推挽復(fù)用輸出。對于TIM的配置主要包括兩個結(jié)構(gòu)TIM_TimeBaseInitTypeDef和TIM_OCInitTypeDef,對于第一個結(jié)構(gòu)體就是配置基本定時器時所使用的,對于第二結(jié)構(gòu)體是輸出捕獲(Output Capture),只要用來配置輸出PWM的占空比,高低電平等信息。
對于TIM_TimeBaseInitTypeDef的配置
類似于基本定時器的配置:
具體的配置,如下代碼:
對于TIM_OCInitTypeDef的配置
對于TIM_OCInitTypeDef結(jié)構(gòu)體在通用定時器中的用處來看,就是配置輸出PWM的相關(guān)信息:
PWM1:向上計數(shù)時,當(dāng)計數(shù)器中的數(shù)值小于CCR中的數(shù)值(也就是后面配置的TIM_Pulse的值)時輸出為有效電平,當(dāng)計數(shù)器中的數(shù)值大于CCR中的數(shù)值且小于ARR中的數(shù)值時,輸出為無效電平。向下計數(shù)時,計數(shù)器中的數(shù)值大于CCR中的值輸出為無效電平。
PWM2:向上計數(shù)時,當(dāng)計數(shù)器中的數(shù)值小于CCR中的數(shù)值(也就是后面配置的TIM_Pulse的值)時輸出為無效電平,當(dāng)計數(shù)器中的數(shù)值大于CCR中的數(shù)值且小于ARR中的數(shù)值時,輸出為有效電平。向下計數(shù)時,計數(shù)器中的數(shù)值大于CCR中的值輸出為有效電平。
具體的配置代碼如下:
對于同一個定時器的不同通道需要單獨初始化TIM_OCxInit(TIMx,&oc_s)
并且對于每個通道初始化之后,需要將CCR中的值存入寄存器TIM_OCxPreloadConfig(TIMx,TIM_OCPreload_Enable)
在開啟TIM之前需要將ARR的也存入寄存器TIM_ARRPreloadConfig(TIMx,ENABLE)
對于PWM輸出的TIM完整配置代碼如下:
void TIM2_Config(void) {TIM_TimeBaseInitTypeDef tim_s;TIM_OCInitTypeDef oc_s; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);oc_s.TIM_OCMode = TIM_OCMode_PWM1;oc_s.TIM_OutputState = TIM_OutputState_Enable;oc_s.TIM_OCPolarity = TIM_OCPolarity_High;oc_s.TIM_Pulse = 1000;TIM_OC1Init(TIM2,&oc_s);TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);oc_s.TIM_Pulse = 8000;TIM_OC2Init(TIM2,&oc_s);TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);TIM_ARRPreloadConfig(TIM2,ENABLE);TIM_Cmd(TIM2,ENABLE); }測量輸入脈沖的頻率和脈沖寬度
對于測量輸入脈沖的頻率和脈沖寬度,需要配置對應(yīng)通道的GPIO。將對應(yīng)的GPIO配置為下拉輸入。對于輸入脈沖測量主要配置兩個結(jié)構(gòu)體和書寫中斷函數(shù)。具體的工作過程,假設(shè)使用通道1來進(jìn)行脈沖測量,首先在配置中將捕獲設(shè)為上升沿捕獲,則當(dāng)捕獲到上升沿時,觸發(fā)中斷,在中斷中將觸發(fā)方式改為下降沿觸發(fā),并將計數(shù)器中的數(shù)清0。當(dāng)下降沿到來,再次觸發(fā)中斷,計數(shù)器中的數(shù)自動存入到CCR中,則在中斷中將觸發(fā)方式再次更改為上升沿觸發(fā),且可以讀出CCR中的值即為輸入PWM的高電平時間。當(dāng)上升沿再次到來,計數(shù)器中的數(shù)自動存入到CCR中,并觸發(fā)中斷,在中斷中將CCR的值讀出即為PWM的周期(以上的過程,默認(rèn)為PWM的周期小于定時器溢出的時間)
配置兩個結(jié)構(gòu)體
在測量輸入脈沖時需要配置TIM_TimeBaseInitTypeDef和TIM_ICInitTypeDef,對于TIM_TimeBaseInitTypeDef來說和之前的PWM配置相似,不同的是關(guān)于預(yù)分頻系數(shù)和周期的配置,這個按照需要自己配置。
TIM_ICInitTypeDef的配置
具體的配置代碼:
在結(jié)構(gòu)配置完成以后,需要對中斷控制器進(jìn)行配置:
void NVIC_Config(void) {NVIC_InitTypeDef nvic_s;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);nvic_s.NVIC_IRQChannel = TIM2_IRQn;nvic_s.NVIC_IRQChannelPreemptionPriority = 0;nvic_s.NVIC_IRQChannelSubPriority = 2;nvic_s.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&nvic_s); }配置完成以后打開中斷TIM_ITConfig(TIM2,TIM_IT_Update | TIM_IT_CC3|TIM_IT_CC4,ENABLE);
TIM_IT_Update:計數(shù)器溢出中斷
TIM_IT_CC3:通道3的捕獲中斷
TIM_IT_CC4:通道4的捕獲中斷
中斷函數(shù)的編寫
對于中斷函數(shù)的編寫流程如下(以上的過程,默認(rèn)為PWM的周期小于定時器溢出的時間):
首次上升沿捕獲成功觸發(fā)中斷,進(jìn)入中斷,在中斷中使用TIM_SetCounter(TIMx,0)將對應(yīng)的定時器中計數(shù)器清0.然后將對應(yīng)的通道設(shè)置為下降沿捕獲TIM_OCnPolarityConfig(TIMx,TIM_ICPolarity_Falling);,同時需要標(biāo)記上升沿第一次來。對應(yīng)通道捕獲到下降沿,自動的將計數(shù)器CNT中的數(shù)值賦值到CCR中,同時觸發(fā)中斷,在中斷中可以將CCR的值讀出,該值就是所測波形的高電平時間,然后再將該通道設(shè)置為上升沿捕獲。再次捕獲到上升沿,判斷是否是第二次捕獲上升沿,如果是就將CCR中的值讀出,該值是第一個上升沿到第二個上升沿的時間,如果是周期性PWM的話,該值就是PWM的周期時間。如果不是第二次捕獲,就重復(fù)之前第一捕獲的流程。
具體的代碼為:
注意到在上面提到兩次PWM的周期小于定時器的溢出時間,是為中斷函數(shù)的編寫和便于把原理敘述清楚,如果沒有這個假設(shè),那就要考慮所有的情況
所有的情況大致有以下幾類
- PWM周期 = 定時器的溢出時間:此時對于上升沿的讀取時間是沒有問題的,對于周期的讀取值會是0.
- PWM周期 >定時器的溢出時間:此時又分為兩種情況:定時器溢出發(fā)生在上升沿和下降沿之間,或者發(fā)生在下降沿和上升沿之間。這種情況因為發(fā)生定時器溢出時,計數(shù)器會被清0,所以需要統(tǒng)計定時器溢出的次數(shù),在最后將對應(yīng)的時間加上(計數(shù)器溢出次數(shù)*計數(shù)器溢出時間。)
總結(jié)
以上是生活随笔為你收集整理的STM32----通用定时器TIM2~TIM5的三种功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bitdock系统错误_BitDock比
- 下一篇: 交通银行软件中心编制_国家标准研究项目区