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一次;
本人初學,以上理解若有錯誤,望各位指正交流。