日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32----通用定时器TIM2~TIM5的三种功能

發布時間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

對于通用定時器主要有三個功能:

  • 基本的定時器功能,和基本定時器相同
  • PWM脈沖輸出
  • 測量輸入脈沖的頻率和脈沖寬度
  • 基本定時器功能

    TIM2~5的基本定時器功能與基本定時器TIM6和TIM7類似,不過不同的是,對于基本定時器中的計數器只能向上計數,而通用定時器的計數器可以配置計數模式向上或者向下。
    向上計數模式:從零開始向上計數,當達到TIMx_ARR中的值時,計數器清零,然后產生一個計數器溢出中斷
    向下計數模式:從TIMx_ARR中的數值開始向下計數,當計數器中數為0時,自動將TIMx_ARR中的數重裝入計數器,同時產生一個向下溢出事件。

    PWM脈沖輸出

    對應于上面的GPIO口,將對應的GPIO配置為推挽復用輸出。對于TIM的配置主要包括兩個結構TIM_TimeBaseInitTypeDef和TIM_OCInitTypeDef,對于第一個結構體就是配置基本定時器時所使用的,對于第二結構體是輸出捕獲(Output Capture),只要用來配置輸出PWM的占空比,高低電平等信息。

    對于TIM_TimeBaseInitTypeDef的配置

    類似于基本定時器的配置:

  • .TIM_Period:定時的周期,該值存儲在ARR中,計數器從0自增到該值,或者從該值自減到0
  • .TIM_Prescaler:對TIMxCLK的預分頻系數,分頻后作為計數器的驅動時鐘,驅動時鐘=TIMxCLK/(分頻系數+1)驅動時鐘=TIMxCLK/(分頻系數+1)=TIMxCLK/(+1)
  • .TIM_ClockDivision:時鐘分頻因子,這個與上一個不同,這個也是對TIMxCLK進行分頻,但分頻后的時鐘被輸送到定時器的ETRP數字濾波器,會影響濾波器的采樣頻率。ETRP數字濾波器是對外部時鐘TIMxETR進行濾波。一般使用內部時鐘,該值沒有任何影響。
  • .TIM_CounterMode:配置計數器的技術模式,常用的是向上計數或者向下計數。
    具體的配置,如下代碼:
  • tim_s.TIM_ClockDivision = TIM_CKD_DIV1;tim_s.TIM_CounterMode = TIM_CounterMode_Up;tim_s.TIM_Period = 9999;tim_s.TIM_Prescaler = 0;TIM_TimeBaseInit(TIM2,&tim_s);

    對于TIM_OCInitTypeDef的配置

    對于TIM_OCInitTypeDef結構體在通用定時器中的用處來看,就是配置輸出PWM的相關信息:

  • .TIM_OCMode:配置PWM輸出的模式,總共有兩種模式PWM1和PWM2,。
    PWM1:向上計數時,當計數器中的數值小于CCR中的數值(也就是后面配置的TIM_Pulse的值)時輸出為有效電平,當計數器中的數值大于CCR中的數值且小于ARR中的數值時,輸出為無效電平。向下計數時,計數器中的數值大于CCR中的值輸出為無效電平。
    PWM2:向上計數時,當計數器中的數值小于CCR中的數值(也就是后面配置的TIM_Pulse的值)時輸出為無效電平,當計數器中的數值大于CCR中的數值且小于ARR中的數值時,輸出為有效電平。向下計數時,計數器中的數值大于CCR中的值輸出為有效電平。
  • .TIM_OutputState:配置輸出模式的狀態,使能輸出。
  • .TIM_OCPolarity:(polarity n.極性)該配置有效電平的極性,可以將有效電平配置高電平,也可以配置為低電平。
  • .TIM_Pulse:該參數記為CCR中的數值,由它來控制PWM的占空比。
    具體的配置代碼如下:
  • 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_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); }

    測量輸入脈沖的頻率和脈沖寬度

    對于測量輸入脈沖的頻率和脈沖寬度,需要配置對應通道的GPIO。將對應的GPIO配置為下拉輸入。對于輸入脈沖測量主要配置兩個結構體和書寫中斷函數。具體的工作過程,假設使用通道1來進行脈沖測量,首先在配置中將捕獲設為上升沿捕獲,則當捕獲到上升沿時,觸發中斷,在中斷中將觸發方式改為下降沿觸發,并將計數器中的數清0。當下降沿到來,再次觸發中斷,計數器中的數自動存入到CCR中,則在中斷中將觸發方式再次更改為上升沿觸發,且可以讀出CCR中的值即為輸入PWM的高電平時間。當上升沿再次到來,計數器中的數自動存入到CCR中,并觸發中斷,在中斷中將CCR的值讀出即為PWM的周期(以上的過程,默認為PWM的周期小于定時器溢出的時間)

    配置兩個結構體

    在測量輸入脈沖時需要配置TIM_TimeBaseInitTypeDef和TIM_ICInitTypeDef,對于TIM_TimeBaseInitTypeDef來說和之前的PWM配置相似,不同的是關于預分頻系數和周期的配置,這個按照需要自己配置。

    TIM_ICInitTypeDef的配置
  • .TIM_Channel:進行采用的通道,例TIM_Channel_3。
  • .TIM_ICPolarity:觸發中斷的電平,可以設置為上升沿,也可設置成下降沿。
  • .TIM_ICPrescaler:輸入分頻器,對輸入的PWM可以進行相應的分頻,例如2分頻,就是兩個周期采樣一次。(個人理解)
  • .TIM_ICFilter:輸入的濾波器,沒用,設為0x00
  • .TIM_ICSeclection:設置是否直連如下圖中對于TI1來說,后面有TIFP1和TIFP2,對于TIFP1是直接連,對于TIFP2是間接連接。

    具體的配置代碼:
  • ic_s.TIM_Channel = TIM_Channel_3;ic_s.TIM_ICPolarity = TIM_ICPolarity_Rising;ic_s.TIM_ICPrescaler = TIM_ICPSC_DIV1;ic_s.TIM_ICFilter = 0x00;ic_s.TIM_ICSelection = TIM_ICSelection_DirectTI;TIM_ICInit(TIM2,&ic_s);

    在結構配置完成以后,需要對中斷控制器進行配置:

    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:計數器溢出中斷
    TIM_IT_CC3:通道3的捕獲中斷
    TIM_IT_CC4:通道4的捕獲中斷

    中斷函數的編寫

    對于中斷函數的編寫流程如下(以上的過程,默認為PWM的周期小于定時器溢出的時間):
    首次上升沿捕獲成功觸發中斷,進入中斷,在中斷中使用TIM_SetCounter(TIMx,0)將對應的定時器中計數器清0.然后將對應的通道設置為下降沿捕獲TIM_OCnPolarityConfig(TIMx,TIM_ICPolarity_Falling);,同時需要標記上升沿第一次來。對應通道捕獲到下降沿,自動的將計數器CNT中的數值賦值到CCR中,同時觸發中斷,在中斷中可以將CCR的值讀出,該值就是所測波形的高電平時間,然后再將該通道設置為上升沿捕獲。再次捕獲到上升沿,判斷是否是第二次捕獲上升沿,如果是就將CCR中的值讀出,該值是第一個上升沿到第二個上升沿的時間,如果是周期性PWM的話,該值就是PWM的周期時間。如果不是第二次捕獲,就重復之前第一捕獲的流程。
    具體的代碼為:

    void TIM2_IRQHandler(void) {if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)//計數器溢出中斷判斷{}if(TIM_GetITStatus(TIM2,TIM_IT_CC3) == SET)//定時器通道3捕獲中斷判斷{if(C3_flag == 0)// 第一次上升沿到來{TIM_SetCounter(TIM2,0);TIM_OC3PolarityConfig(TIM2,TIM_ICPolarity_Falling);C3_flag = 1;}else if(C3_flag == 1)//第一次下降沿到來{c3_high = (uint32_t)TIM_GetCapture3(TIM2);TIM_OC3PolarityConfig(TIM2,TIM_ICPolarity_Rising);C3_flag = 2;}else if(C3_flag == 2)//第二次上升沿到來{c3_proide = (uint32_t)TIM_GetCapture3(TIM2);C3_flag = 0;}}TIM_ClearITPendingBit(TIM2,TIM_IT_Update | TIM_IT_CC3|TIM_IT_CC4); }

    注意到在上面提到兩次PWM的周期小于定時器的溢出時間,是為中斷函數的編寫和便于把原理敘述清楚,如果沒有這個假設,那就要考慮所有的情況
    所有的情況大致有以下幾類

    • PWM周期 = 定時器的溢出時間:此時對于上升沿的讀取時間是沒有問題的,對于周期的讀取值會是0.
    • PWM周期 >定時器的溢出時間:此時又分為兩種情況:定時器溢出發生在上升沿和下降沿之間,或者發生在下降沿和上升沿之間。這種情況因為發生定時器溢出時,計數器會被清0,所以需要統計定時器溢出的次數,在最后將對應的時間加上(計數器溢出次數*計數器溢出時間。)

    總結

    以上是生活随笔為你收集整理的STM32----通用定时器TIM2~TIM5的三种功能的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。