使用STM32也有很多年了,現(xiàn)在畢業(yè)臨近了,就想寫寫,做做記錄也希望能幫助到可以幫助的人。
STM32定時器有很多的用途,我也不一一舉例,我最常用的就是輸出PWM,定時器,輸入捕獲以及編碼盤模式等等。
第一 : 用STM32高級定時器1控制伺服直流電機
///////////////////////////////////////////
//定時器1PWM初始化 共4路可變掌控比/////////
//輸入?yún)?shù)PWM1/2/3/4掌控比參數(shù)30000-60000//
//////////////////////////////////////////
void TIM1_PWM(unsigned int PWM1_Val,unsigned int PWM2_Val,unsigned int PWM3_Val,unsigned int PWM4_Val )
{
vu16 CCR1_Val = PWM1_Val;
vu16 CCR2_Val = PWM2_Val;
vu16 CCR3_Val = PWM3_Val;
vu16 CCR4_Val = PWM4_Val;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1 , ENABLE); //打開相應(yīng)的定時器時鐘和復(fù)用推挽輸出對應(yīng)I/O口時鐘
//這里是定時器對應(yīng)的是TOP值是60000
TIM_TimeBaseStructure.TIM_Period = 60000;//計數(shù)器向上最大計數(shù)到65535后產(chǎn)生更新事件,計數(shù)值歸零
TIM_TimeBaseStructure.TIM_Prescaler = 2; //設(shè)置預(yù)分頻器分頻系數(shù)2 TIM_TimeBaseStructure.TIM_ClockDivision = 0;//設(shè)置了時鐘分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//選擇向上計數(shù)
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);//根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2 ;//PWM2模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//輸出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//TIM輸出比較極性
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;//配著相對應(yīng)的I/O
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//復(fù)用推挽輸出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //翻轉(zhuǎn)頻率為50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;//比較數(shù)
TIM_OC1Init(TIM1, &TIM_OCInitStructure);//初始化定時1
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
TIM_OC2Init(TIM1, &TIM_OCInitStructure);//初始化定時1
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
TIM_OC3Init(TIM1, &TIM_OCInitStructure);//初始化定時1
TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
TIM_OC4Init(TIM1, &TIM_OCInitStructure);//初始化定時1
TIM_Cmd(TIM1, ENABLE);//使能定時器
TIM_CtrlPWMOutputs(TIM1,ENABLE);
}
在這個函數(shù)中我已經(jīng)把STM32定時器輸出PWM的模板寫好了,你可以去改進(jìn)也可以去深入的學(xué)習(xí),即使有了程序還是不夠的,你必須了解定時器工作的原理和它為什么能達(dá)到這樣的效果,不然你僅僅只會使用而不能得心應(yīng)手把它很好應(yīng)用到你自己的項目中。
對于定時器你去學(xué)習(xí)單片機時肯定會遇到的一個很重要的問題,在視頻教學(xué)里面有很多的講解和看法,在這里我也來說說自己的看法。
定時器我認(rèn)為就是一個只要你使能它,它就一直在計數(shù)的一個16位的計數(shù)器,從0到65535,當(dāng)你配置了相應(yīng)的定時器模式、TOP值、匹配值時,它就會在計數(shù)到相應(yīng)的位置產(chǎn)生中斷或者從新計數(shù)也就是說發(fā)生更新事件。就拿輸出PWM來做解釋,在上面我設(shè)定了TOP值為60000,設(shè)置了為PWM2模式,使定時器的輸出極性為低。通俗的說就是當(dāng)我在主函數(shù)中配置該定時器時,高級定時器TIM1就會啟動,這里如果我設(shè)定比較值為30000,那么定時器一直計數(shù),從0開始對應(yīng)的I/O口為高電平,一旦定時器計數(shù)到30000,對應(yīng)I/O口出現(xiàn)下降沿,電平發(fā)生改變,從高電平轉(zhuǎn)變成低電平,然后計數(shù)到60000,定時器出現(xiàn)更新事件,對應(yīng)的I/O出現(xiàn)上升沿,電平發(fā)生改變,從低電平轉(zhuǎn)變成高電平。由此反復(fù),從而形成50%占空比的PWM,這個函數(shù)可以自定義占空比,但是不能改變頻率。
這里我只是很隨意的講解了定時器的比較簡單的應(yīng)用,如果你想深入的了解,就一定要去看芯片手冊,看懂它,熟透它,只有這樣你才能對它使用的得心應(yīng)手,如果想做好就一定要去努力。
當(dāng)然定時器的時鐘這塊很是重要,也可以說STM32的時鐘樹是一定要了解,精通和熟透的東西,在這個我不講解,在后面的過程中我會用一個比較大的篇幅去講解STM32時鐘樹,還有一些我自己的看法。
希望能對有些初入的學(xué)者有所幫助,我也是記錄我自己的學(xué)習(xí)歷程,一起努力。