welcom ! Handel home

2014年6月24日 星期二

S​T​M​3​2​的​P​W​M​精​讲 百度經典文章!

http://wenku.baidu.com/view/edcde519227916888486d710.html?re=view

1.STM32通用計時器的基本用法,即簡單的定時功能。支援向上計數、向下計數、中央對其模式,這裡僅以向上計數講解。
2.向上計數原理:從0開始,每經過一個時鐘脈衝1,直到到達通過TIMx_ARR寄存器設置的值時為止,至此產生更新事件(中斷或DMA產生)
3.時鐘頻率計算:上述時鐘脈衝的間隔是多少?



   首先獲得TIMXCLK,然後

 然後TIMXCLK再經過PSC預分頻器分頻,最後才傳給CNT計數器進行計數,所以時鐘頻率為:TIMxCLK/TIMx_PSC+1
4.如何選擇計時器模式呢?


TIMx_CR14-6位元指定了其模式:CMS0DIR0,向上計數
5.剩下的,我們只要開啟中斷,裝入TIMx_ARR中所需要的值,開啟計數器即可。

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


TIMx_CR1寄存器位0:計數器開始計數。
6.注意:計時器可能存在時間偏差問題:


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


TIMx_EGR的位0:手動產生一個更新事件。
7.修改預分頻寄存器時,也會產生6中的問題:


解決方法,同6.

8.通用計時器234部分代碼------------------下面為設定檔,可對其進行參數的配置進行移植
//**************************************************************************
//Author:Kill_SeaMan
//Date:2013-09-18 1441
//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


沒有留言: