STM32學習筆記time定時器


 STM32的定時器是個強大的模塊,定時器使用的頻率也是很高的,定時器可以做一些基本的定時,還可以做PWM輸出或者輸入捕獲功能。從系統框架圖下看,名爲TIMx的有八個,其中TIM1和TIM8掛在APB2總線上,而TIM2-TIM7則掛在APB1總線上。其中TIM1&TIM8稱爲高級控制定時器(advancedcontroltimer).他們所在的APB2總線也比APB1總線要好。APB2可以工作在72MHz下,而APB1最大是36MHz。

STM32通用定時器(TIM2-5)基本用法


   由上圖可知,當APB1的預分頻係數爲1 時,這個倍頻器不起作用,定時器的時鐘頻率等於APB1的頻率;當APB1的預分頻係數爲其它數值(即預分頻係數爲2、4、8 或16)時,這個倍頻器起作用,定時器的時鐘頻率等於APB1的頻率兩倍。也就是,當APB1不分頻,TIM3的時鐘速度爲36MHz,當2分頻是,APB1變成18MHz,但是TIM又會倍頻,即TIM時鐘等於18*2=36MHz。這裏我們用向上計數的方式,即TIMx_CNT中的計數值達到TIMx_ARR中的值時,產生中斷,TIMx_CNT又從0開始計。


無疑STM32的定時器是複雜的,主要有定時,捕獲,PWM產生功能。我花了點時間看通用定時器2,3,4的框圖,tim1則在通用定時器的基礎上多加了些功能,稱爲高級定時器。
////////////////////////////////////////////////////////////////////////////////
根據程序來分析:
/////////////定時器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; //預分頻    PSC(0-65535)
   m_TIM_TimeBaseInitTypeDef.TIM_CounterMode       = TIM_CounterMode_Up; //計數模式
   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;//循環計數次數(只是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函數處纔將對應爲清零而達到使能(UDIS=0:使能更新事件)
   TIM_UpdateDisableConfig(TIM2,DISABLE);//Enables or Disables the TIMx Update event.     
   NVIC->ISER[0] |= (1 << (TIM2_IRQChannel & 0x1F));     // enable interrupt
   //開始計數
   TIM_Cmd(TIM2,ENABLE);//Enables or disables the specified TIM peripheral.
首先在在定時功能上和傳統的51,avr比,多了些功能,其他的一樣。其輸入時鐘源爲APB1/2,等同51,avr的系統時鐘。忘了51,至少avr有時鐘分頻功能,stm32也有在函數配置中TIM_ClockDivision       = TIM_CKD_DIV1; //(時鐘分頻因子1,2,4)在時鐘輸入上,時鐘多了個選TIM_Prescaler(預分頻,這個的加入靈活性加大,它可以是0-65535的任意值,則預傳統的只能幾個選擇則體現了配置的靈活和實用。
//
m_TIM_TimeBaseInitTypeDef.TIM_Prescaler           = 349;
// m_TIM_TimeBaseInitTypeDef.TIM_ClockDivision       = TIM_CKD_DIV1;

   再說:51,avr的計數器初值,也是決定定時大小的一個因素。具體實現:就是計數器計數自減或者增加到某個值,發生溢出中斷,在自加的時候是從初值加到滿值 溢出。自減時,是從初值減到0溢出,發生中斷,在每次定時完畢的定時器溢出後,其初值需要在中斷函數中重新賦值給計數器
在stm32中也是有個同樣的功能,但是這兒是不同的。在自加的時候,從0開始,直到寄存器TIMx_ARR值大小產生溢出中斷,自減是從TIMx_ARR值大小開始自動減直到0溢出,不通點1。在進入中斷後,中斷函數一個更新事件,這個更新事件自動重載TIMx_ARR到計數器,這一點與51中的自動重載類似.
//
m_TIM_TimeBaseInitTypeDef.TIM_Period               = 50000;

以上轉自:http://bbs.ednchina.com/BLOG_ARTICLE_252634.HTM

 

還有個不錯的例子:http://blog.sina.com.cn/s/blog_7d4550b5010178ee.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章