圖1 定時器內部架構圖
圖2 Cubemx 可視化定時器配置
工作流程:
內部或外部驅動時鍾CK_PSC驅動預分頻器PSC計數分頻,產生CK_CNT驅動計數器CNT計數。自動重裝載寄存器在發生更新事件時將值傳到計數器CNT中作為初始計數值,REP寄存器則控制CNT溢出次數,當重復次數計數器從REP寄存器的數值遞減至0是計數器CNT停止計數。
1. 根據上述CubeMx工具自動產生如下代碼,定時周期s = (Period + 1) * (Prscaler +1) /(Tclk定時器時鍾頻率Hz) = (99+1)*(63+1)/64MHz=100*10^(-6)秒=100us
/* USER CODE BEGIN TIM1_Init 1 */
/* USER CODE END TIM1_Init 1 */
htim1.Instance = TIM1; // 選擇所使用的的定時器
htim1.Init.Prescaler = 63; // 對定時器輸入的時鍾源進行分頻的分頻系數,對應於圖1中的1,例如輸入時鍾源時鍾頻率為64MHz,此處分頻系數為63,則定時器時鍾=64MHz/64 = 1MHz
htim1.Init.CounterMode = TIM_COUNTERMODE_UP; // 定時器計數方式選擇為從下往上
htim1.Init.Period = 99; // 計時周期=定時器時鍾*(period+1) 自動重裝載值(默認值)
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0; // 代表計數值滿溢出幾次才進入中斷,對應於圖1中的3,RepetitionCounter = 0則代表一個定時周期便產生中斷;RepetitionCounter =1 代表需要兩個定時周期才產生中斷
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; // 關閉自動重載功能
if (HAL_TIM_OC_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
2.常用術語
2.1 計數模式--對應於htim1.Init.CounterMode
向上計數模式:
在向上計數模式中,計數器從0計數到自動加載值(TIMx_ARR計數器的內容),然后重新從0開始計數並且產生一個計數器溢出事件。
向下計數模式:
在向下模式中,計數器從自動裝入的值(TIMx_ARR計數器的值)開始向下計數到0,然后從自動裝入的值重新開始並且產生一個計數器向下溢出事件。
中央對齊模式:
在中央對齊模式,計數器從0開始計數到自動加載的值(TIMx_ARR寄存器)-1,產生一個計數器溢出事件,然后向下計數到1並且產生一個計數器下溢事件;然后再從0開始重新計數。
2.2 重復計數器功能
如果使用了重復計數器功能,在向上計數達到設置的重復計數次數(TIMx_RCR)時,產生更新事件(UEV);否則每次計數器溢出時才產生更新事件。對應於htim1.Init.RepetitionCounter