TIM定時器(TIM3為例)
初始化:
A:結構體TIM_HandleTypeDef的成員:
1、*Instance:類型為TIM_TypeDef,即對TIM的寄存器的映射,通過這個成員可以操作寄存器
2、Init:類型為TIM_Base_InitTypeDef,對定時器特性進行配置,成員有
Prescaler:定時器預分頻
CounterMode:向上計數、向下計數、中間對齊
Period:周期
ClockDivision:
RepetitionCounter:
AutoReloadPreload:自動重裝立即有效/中斷更新有效
故Tout=(Period+1) * ((Prescaler+1)/Ft) us:Ft步長,即TIM依賴的時鍾頻率
3、Channel:類型為HAL_TIM_ActiveChannel,設置定時器通道
4、*hdma[7]:DMA相關
5、Lock:定時器鎖,為HAL_LOCK和HAL_UNLOCK一般和State搭配用
6、State:定時器狀態,常用HAL_TIM_STATE_BUSY和HAL_TIM_STATE_READY
上述參數配置后通過HAL_TIM_Base_Init(&htim3)傳入完成配置
B:結構體TIM_ClockConfigTypeDef與TIM_MasterConfigTypeDef
1、TIM_ClockConfigTypeDef是對TIM依賴的時鍾進行配置,默認情況下TIM 掛在APB時鍾上,若需要使用外部時鍾,可對成員ClockSource進行配置
2、TIM_MasterConfigTypeDef是當需要使用到定時器的級聯時內部輸出通道及SlaveMode的配置,默認都是否
TIM_HandleTypeDef htim3; void MX_TIM3_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; htim3.Instance = TIM3; htim3.Init.Prescaler = 8999; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 4999; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_Base_Init(&htim3) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) { Error_Handler(); } }
C:HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
1、使能TIM時鍾,設置並使能中斷NVIC
2、如果有輸出的話,配置對應GPIO輸出
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) { if(tim_baseHandle->Instance==TIM3) { __HAL_RCC_TIM3_CLK_ENABLE(); HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM3_IRQn); } }
啟動並觸發:
啟動:HAL_TIM_Base_Start_IT(&htim3):主函數中直接調用啟動定時器或直接htim->State = HAL_TIM_STATE_READY
觸發:同樣的有中斷服務函數TIM3_IRQHandler(void),內調用公用的HAL_TIM_IRQHandler(&htim3)在這將htim3的參數傳入
回調:
重寫weak函數void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim),在Callback里判斷定時器類型以及寫需要執行的內容,實際上從這個Callback的命名可以看出,TIM有很多種Callback