STM32F4——定時器原理及應(yīng)用中斷、輸入捕獲、PWM輸出
不同的STM32系列有不同數(shù)量的定時器,針對現(xiàn)在學(xué)習(xí)的STM32F40x系列總共有14個定時器,針對這14個定時器可以將其分為3類,高級定時器、通用定時器和基本定時器,三種定時器大同小異,下邊會針對通用定時器來介紹定時器的原理和應(yīng)用。對于通用定時器根據(jù)位數(shù)和計數(shù)方式的不同又可以分為3類,相關(guān)分類的圖表如下:
本文引用地址:http://m.butianyuan.cn/article/201611/318489.htm二、應(yīng)用:
1、更新:計數(shù)器的上溢或下溢。2、事件觸發(fā)。3、輸入捕獲。4、輸出比較。5、支持針對定位的增量編碼和霍爾傳感器電路。5、觸發(fā)輸入作為外部時鐘或按周期電源管理。下邊會針對部分應(yīng)用做相關(guān)介紹和代碼分析。
三、框圖:
下圖是通用定時器TIM2~TIM5的框圖,其他定時器的框圖和該框圖是類似的,只不過是在該框圖的基礎(chǔ)上做相應(yīng)的裁剪做出小的變動。
下邊對定時器的框圖做相關(guān)拆解,并對各個部分做相關(guān)分析。
四、時鐘選擇及分頻:
這部分的功能由框圖的如下圖部分產(chǎn)生:
由圖中可以發(fā)現(xiàn)時鐘來源有:1、內(nèi)部時鐘(CK_INT)。2、外部時鐘模式1;外部引腳TIx,由輸入捕獲部分產(chǎn)生。3、外部時鐘模式2;外部觸發(fā)輸入ETR。4、內(nèi)部觸發(fā)輸入ITRx,該時鐘是由另一個定時器輸出產(chǎn)生的,對應(yīng)到框圖中的TRGO。經(jīng)過相應(yīng)的選擇后產(chǎn)生時鐘CK_PSC。
這部分同時會在相關(guān)寄存器設(shè)定計時器的計數(shù)模式、復(fù)位和使能等相關(guān)操作。
五、時基單元
時基單元框圖如下:
其中包括:1、PSC預(yù)分頻器;負責(zé)對選擇的時鐘CK_PSC分頻,產(chǎn)生最終計數(shù)器用到的時鐘CK_CNT。2、CNT計數(shù)器:負責(zé)計數(shù),做為定時器的核心單元。3、自動重載寄存器:負責(zé)在相關(guān)事件觸發(fā)后,將寄存器中的值裝載到計時器中。
六、輸入捕獲
對輸入捕獲功能的基本描述就是;通過檢測TIM_CHx上的邊沿信號,在信號跳變時,將當(dāng)前計數(shù)器的值存放到相應(yīng)的捕獲/比較寄存器中。該功能部分在框圖中如下圖所示:
其實這是定時器的4個相關(guān)通道,拿出其中一個做相關(guān)分析,其中一個通道的框圖如下:
TI1為通道輸入信號,經(jīng)過濾波后產(chǎn)生TI1F,再經(jīng)過邊沿檢測(上升沿或下降沿),再經(jīng)過相關(guān)選擇后產(chǎn)生的信號通過分頻器分頻后產(chǎn)生最后需要捕獲的信號。
對于輸入捕獲相關(guān)庫函數(shù)介紹如下;
void TIM_ICInit(TIM_TypeDef* TIMx,TIM_ICInitTypeDef* TIM_ICInitStruct); //設(shè)置通道的相關(guān)參數(shù)。void TIM_OCxPolarityConfig(TIM_TpeDef* TIMx,uint16_t TIM_OCPolarity); //通道極性設(shè)置。uint32_t TIM_GetCapturex(TIM_TypeDef* TIMx); //獲取通道捕獲值。
七、輸出比較
對輸出比較功能的描述:在CCRx寄存器中設(shè)定相應(yīng)的值,計數(shù)器中的值與該值做比較,根據(jù)比較結(jié)果和相應(yīng)的極性和有效性設(shè)定,確定輸出電壓的高低電平狀態(tài)。和輸入捕獲相同,拿出其中一個通道進行分析,其中一個通道的框圖如下:
通道信號經(jīng)過輸出模式控制器,做出模式、極性以及開關(guān)等設(shè)置后獲得需要的輸出信號。CCRx:捕獲比較寄存器,用于設(shè)定比較值。CCMRx:設(shè)置PWM的模式。CCER:CC1P位設(shè)置極性有效性。CCER:CC1E位輸出使能設(shè)定。
對輸出比較相關(guān)庫函數(shù)介紹如下:
void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) //設(shè)置相關(guān)通道的參數(shù)。void TIM_SetComparex(TIM_TypeDef* TIMx, uint32_t Comparex); //設(shè)置比較值。
TIM_OCxPreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); //使能輸出比較預(yù)裝載。
TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, ENABLE);//使能自動重裝載預(yù)裝載寄存器
八、相關(guān)初始化實例——輸入捕獲
//定時器5通道1輸入捕獲配置//arr:自動重裝值(TIM2,TIM5是32位的!!)//psc:時鐘預(yù)分頻數(shù)void TIM5_CH1_Cap_Init(u32 arr,u16 psc){GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); //TIM5時鐘使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能PORTA時鐘 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIOA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//復(fù)用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽復(fù)用輸出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA0GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5); //PA0復(fù)用位定時器5TIM_TimeBaseStructure.TIM_Prescaler=psc; //定時器分頻TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計數(shù)模式TIM_TimeBaseStructure.TIM_Period=arr; //自動重裝載值TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);//初始化TIM5輸入捕獲參數(shù)TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 選擇輸入端 IC1映射到TI1上TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕獲TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置輸入分頻,不分頻 TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置輸入濾波器 不濾波TIM_ICInit(TIM5, &TIM5_ICInitStructure);TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允許更新中斷 ,允許CC1IE捕獲中斷 TIM_Cmd(TIM5,ENABLE ); //使能定時器5NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//搶占優(yōu)先級3NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子優(yōu)先級3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根據(jù)指定的參數(shù)初始化VIC寄存器、 }
九、相關(guān)初始化實例——PWM輸出
//TIM14 PWM部分初始化 //PWM輸出初始化//arr:自動重裝值//psc:時鐘預(yù)分頻數(shù)void TIM14_PWM_Init(u32 arr,u32 psc){ //此部分需手動修改IO口設(shè)置GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //TIM14時鐘使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF時鐘 GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9復(fù)用為定時器14GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIOF9GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //復(fù)用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽復(fù)用輸出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化PF9TIM_TimeBaseStructure.TIM_Prescaler=psc; //定時器分頻TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計數(shù)模式TIM_TimeBaseStructure.TIM_Period=arr; //自動重裝載值TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定時器14//初始化TIM14 Channel1 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈沖寬度調(diào)制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性:TIM輸出比較極性低TIM_OC1Init(TIM14, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設(shè)TIM1 4OC1TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); //使能TIM14在CCR1上的預(yù)裝載寄存器TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能 TIM_Cmd(TIM14, ENABLE); //使能TIM14 }
評論