1. 程式人生 > >STM32通用定時器TIM2、3、4

STM32通用定時器TIM2、3、4

STM32通用定時器用法

---附原始碼

1.STM32通用定時器的基本用法,即簡單的定時功能。支援向上計數、向下計數、中央對其模式,這裡僅以向上計數講解。

2.向上計數原理:從0開始,每經過一個時鐘脈衝加1,直到到達通過TIMx_ARR暫存器設定的值時為止,至此產生更新事件(中斷或DMA產生)

3.時鐘頻率計算:上述時鐘脈衝的間隔是多少?

   首先獲得TIMXCLK,然後

 然後TIMXCLK再經過PSC預分頻器分頻,最後才傳給CNT計數器進行計數,所以時鐘頻率為:TIMxCLK/(TIMx_PSC+1)

4.如何選擇定時器模式呢?

TIMx_CR1的4-6位指定了其模式:CMS:0,DIR:0,向上計數

5.剩下的,我們只要開啟中斷,裝入TIMx_ARR中所需要的值,開啟計數器即可。

TIMx_DIER暫存器的位0:開啟UIE中斷,這樣計數器上溢時,便會產生中斷。

TIMx_CR1暫存器位0:計數器開始計數。

6.注意:計時器可能存在時間偏差問題:

 可見:即使你更新了TIMx_ARR暫存器的值,但其要等到更新事件發生時,才會被裝入到自動載入暫存器中,所以會存在短暫的延時問題,為解決此問題,可以在寫入TIMx_ARR時,手工產生更新事件!方法如下:

TIMx_EGR的位0:手動產生一個更新事件。

7.修改預分頻暫存器時,也會產生6中的問題:

解決方法,同6.

8.通用定時器2、3、4部分程式碼:------------------下面為配置檔案,可對其進行引數的配置進行移植

//**************************************************************************
//Author:Kill_SeaMan
//Date:2013-09-18 14:41
//Version:0.10
//Function: 通用TIMx介面(採用韌體函式庫編寫)
//**************************************************************************

//注意:該檔案僅可以被mytime.c呼叫,且僅可呼叫1次

//******************************************************************************
//定時器選擇-----------------------------------只可以選擇一個定時器,若想選擇多個定時器,需修改原始碼,想用哪個定時器把相應的註釋去掉即可
#define TIMER2       //使用定時器2
//#define TIMER3      //使用定時器3
//#define TIMER4       //使用定時器4

//******************************************************************************

#define TIMXCLK    72   //TIMxCLK時鐘頻率(單位MHz)
#define CFG_TIM_Prescaler (TIMXCLK-1)  //預分頻值
#define CFG_COUNTER   1000    //自動過載暫存器值,使得中斷間隔為1ms

#if defined(TIMER2)
#define CFG_TIM    TIM2     // 定時器類別
#define CFG_TIM_IRQChannel TIM2_IRQChannel    // 定時器中斷
#define CFG_NVIC_IRQChannelPreemptionPriority 1  // 搶佔優先順序
#define CFG_NVIC_IRQChannelSubPriority    1  // 子優先順序
#define CFG_RCC_APB1Periph_TIM   RCC_APB1Periph_TIM2  // 定時器時鐘

#elif defined(TIMER3)
#define CFG_TIM    TIM3     // 定時器類別
#define CFG_TIM_IRQChannel TIM3_IRQChannel    // 定時器中斷
#define CFG_NVIC_IRQChannelPreemptionPriority 1  // 搶佔優先順序
#define CFG_NVIC_IRQChannelSubPriority    1  // 子優先順序
#define CFG_RCC_APB1Periph_TIM   RCC_APB1Periph_TIM3  // 定時器時鐘

#elif defined(TIMER4)
#define CFG_TIM    TIM4     // 定時器類別
#define CFG_TIM_IRQChannel TIM4_IRQChannel    // 定時器中斷
#define CFG_NVIC_IRQChannelPreemptionPriority 1  // 搶佔優先順序
#define CFG_NVIC_IRQChannelSubPriority    1  // 子優先順序
#define CFG_RCC_APB1Periph_TIM   RCC_APB1Periph_TIM4  // 定時器時鐘

#endif

9.完整原始碼下載地址:

10.如有錯誤,歡迎大家指正,不勝感激。。。