STM32學(xué)習(xí)筆記time定時器
無疑STM32的定時器是復(fù)雜的,主要有定時,捕獲,PWM產(chǎn)生功能。我花了點時間看通用定時器2,3,4的框圖,tim1則在通用定時器的基礎(chǔ)上多加了些功能,稱為高級定時器。
////////////////////////////////////////////////////////////////////////////////
根據(jù)程序來分析:
/////////////定時器2配置500ms///////////////////////////////////////////////////////
TIM_DeInit(TIM2);//TIM2,3,4:SystemClk=APB1(Max36Mhz)
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; //使能TIM2的時鐘
//////////定時器2配置///////////////////////////////
//計劃:PSC = 349 則 CK_CNT = 36Mhz/(349+1) =>10us
// ARR = 50 000 1us * 50 000 =50ms
m_TIM_TimeBaseInitTypeDef.TIM_Prescaler = 349; //預(yù)分頻 PSC(0-65535)
m_TIM_TimeBaseInitTypeDef.TIM_CounterMode = TIM_CounterMode_Up; //計數(shù)模式
m_TIM_TimeBaseInitTypeDef.TIM_Period = 50000; //自動重載 ARR(0-65535)
m_TIM_TimeBaseInitTypeDef.TIM_ClockDivision = TIM_CKD_DIV1; //時鐘分頻因子1,2,4
m_TIM_TimeBaseInitTypeDef.TIM_RepetitionCounter = 0;//循環(huán)計數(shù)次數(shù)(只是TIM1,8有)
TIM_TimeBaseInit(TIM2,&m_TIM_TimeBaseInitTypeDef);
////////////////////////////////////////////////////
//使能配置中斷=>:使能更新事件中斷
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//Enables or disables the specified TIM interrupts.
//注意TIM_UpdateDisableConfig 用DISABLE函數(shù)處才將對應(yīng)為清零而達(dá)到使能(UDIS=0:使能更新事件)
TIM_UpdateDisableConfig(TIM2,DISABLE);//Enables or Disables the TIMx Update event.
NVIC->ISER[0] |= (1 << (TIM2_IRQChannel & 0x1F)); // enable interrupt
//開始計數(shù)
TIM_Cmd(TIM2,ENABLE);//Enables or disables the specified TIM peripheral.
首先在在定時功能上和傳統(tǒng)的51,avr比,多了些功能,其他的一樣。其輸入時鐘源為APB1/2,等同51,avr的系統(tǒng)時鐘。忘了51,至少avr有時鐘分頻功能,stm32也有在函數(shù)配置中TIM_ClockDivision = TIM_CKD_DIV1; //(時鐘分頻因子1,2,4)在時鐘輸入上,時鐘多了個選擇TIM_Prescaler(預(yù)分頻),這個的加入靈活性加大,它可以是0-65535的任意值,則預(yù)傳統(tǒng)的只能幾個選擇則體現(xiàn)了配置的靈活和實用。
//m_TIM_TimeBaseInitTypeDef.TIM_Prescaler = 349;
//m_TIM_TimeBaseInitTypeDef.TIM_ClockDivision = TIM_CKD_DIV1;
再說:51,avr的計數(shù)器初值,也是決定定時大小的一個因素。具體實現(xiàn):就是計數(shù)器計數(shù)自減或者增加到某個值,發(fā)生溢出中斷,在自加的時候是從初值加到滿值 溢出。自減時,是從初值減到0溢出,發(fā)生中斷,在每次定時完畢的定時器溢出后,其初值需要在中斷函數(shù)中重新賦值給計數(shù)器。
在stm32中也是有個同樣的功能,但是這兒是不同的。在自加的時候,從0開始,直到寄存器TIMx_ARR值大小產(chǎn)生溢出中斷,自減是從TIMx_ARR值大小開始自動減直到0溢出,不通點1。在進(jìn)入中斷后,中斷函數(shù)一個更新事件,這個更新事件將自動重載TIMx_ARR到計數(shù)器,這一點與51中的自動重載類似.
//m_TIM_TimeBaseInitTypeDef.TIM_Period = 50000;
評論