1. 程式人生 > >高階定時器/TIM1/TIM8 定時時間不準的問題/TIM_TimeBaseStructure.TIM_RepetitionCounter

高階定時器/TIM1/TIM8 定時時間不準的問題/TIM_TimeBaseStructure.TIM_RepetitionCounter

配置定時器遇到的問題

舉例1:

/*TIM1時鐘配置*/
TIM_TimeBaseStructure.TIM_Prescaler = 2;       //預分頻(時鐘分頻)72M/(2+1)=24M
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //向上計數
TIM_TimeBaseStructure.TIM_Period = 65535;        //裝載值18k/144=125hz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);

有必要知道一下定時時間的計算:(以前只是知道大概現在寫個帖子以防又忘了)

                                                    \mathbf{T_{up(S)} =\frac{(1+TIM_{Prescaler})\times (1+TIM_{period}))}{72Mhz}}


TIM_TimeBaseStructure.TIM_Prescaler = 2;//分頻2      72M/(2+1)=24MHz
TIM_TimeBaseStructure.TIM_Period = 65535; //計數值65535
((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+2)/72M)*(1+65535)=0.00273秒=366.2Hz */

以下就要注意一點啦!
(1)TIMx(1-8),在庫設定預設的情況下,都是72M的時鐘;
(2)TIM_TimeBaseStructure.TIM_RepetitionCounter=0;是重複計數,就是重複溢位多少次才給你來一個溢位中斷,
如果初始化為0的話,計數器溢位一次,中斷一次!問題就解決啦!

它對應的暫存器叫TIM1 RCR.如果這個值不配置,上電的時候暫存器值可是隨機的,本來1秒中斷一次,可能變成N 秒中斷一次,讓你超級頭大!

如果想知道為什麼?那我們 來談談這個TIM1 裡面的是重複計數吧(個人見解)

 

上圖說明: 當計數器溢位產生更新事件的時候,重灌載值會在計數器重新整理之前更新,這就不會出現計數器重新整理重灌載之前的值!

有請看下圖: