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
沒有留言:
張貼留言