1. 程式人生 > >STM32F1 高階定時器TIM1定時不準確

STM32F1 高階定時器TIM1定時不準確

問題:

配置:使用高階定時器TIM1設定定時器 5ms進入一次中斷  實現LED1s閃爍。

根據公式可求出頻率:72000000/(7199+1)/(49+1) = 200Hz ~ 5ms;

理論上是LED每1s改變一次狀態,但實際上卻是每2s改變一次。 

 

解決:

對於這個問題反覆檢查了時鐘配置、定時器配置都沒問題,於是搜尋到在定時器配置中加一句TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;  就可以解決。

果然  加入之後LED每1s改變一次狀態。

原因:

TIM_RepetitionCounter為重複計數器的值,只對TIM1和TIM8起作用,每次RCR向下計數到0,將會生成一個更新事件且將從RCR暫存器值N重新計數。

對於我的程式,我的理解為                                                                                                                                                                當TIM_RepetitionCounter=1時;計時5ms,  TIM_RepetitionCounter ! = 0,不進入中斷,TIM_RepetitionCounter值減1; 計時5ms,  TIM_RepetitionCounter==0,  進入中斷,實現10ms進入一次中斷,因此程式實 現LED(200*10)s = 2s 進行一次狀態改變。   

當TIM_RepetitionCounter = 2時;計時5ms,  TIM_RepetitionCounter ! = 0,不進入中斷,TIM_RepetitionCounter值減1; 計時5ms,  TIM_RepetitionCounter ! = 0,不進入中斷,TIM_RepetitionCounter值減1; 計時5ms,  TIM_RepetitionCounter == 0,   進入中斷,   實現15ms進入一次中斷,  因此程式實現LED(200 *15)s = 3s進行一次狀態改變。

當TIM_RepetitionCounter = 3時;按上述規律, 實現20ms進入一次中斷,  因此程式實LED(200 * 20)s = 4s進行一次狀態改變。  當TIM_RepetitionCounter = 4時;按上述規律, 實現25ms進入一次中斷,  因此程式實LED(200 * 25)s = 5s進行一次狀態改變

               

 

在TIM1初始化時不配置TIM_RepetitionCounter, 預設為1.  即使得我程式LED2s改變一次狀態。

於是試驗了當TIM_RepetitionCounter為

0時,LED狀態改變為每 1s一次;                             1時,LED狀態改變為每 2s一次;                                                                  2時,LED狀態改變為每 3s一次;                             3時,LED狀態改變為每 4s一次;                                                                  4時,LED狀態改變為每 5s一次;

 

本人初學,以上理解若有錯誤,望各位指正交流。