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