定時器的開啟需要手動開啟,例如在driver_capature.c開啟,該文件主要寫了具體的函數實現,與driver_can.c一樣,同時還有回調函數等一些高級的自定義函數。
這段代碼是 STM32 HAL 庫中用于初始化 定時器 2 (TIM2
) 的函數 MX_TIM2_Init
。它配置了定時器的基礎功能,時鐘源,輸入捕獲通道以及中斷功能。以下是逐行解釋:
1. 函數開始部分
void MX_TIM2_Init(void)
{/* USER CODE BEGIN TIM2_Init 0 *//* USER CODE END TIM2_Init 0 */
這部分是用戶自定義代碼的區域,通常用于在初始化代碼執行之前添加自定義操作。USER CODE
區域通常是可以修改的區域。
2. 定時器配置結構體定義
TIM_ClockConfigTypeDef sClockSourceConfig = {0};TIM_MasterConfigTypeDef sMasterConfig = {0};TIM_IC_InitTypeDef sConfigIC = {0};
這里定義了三個結構體,用于定時器配置:
TIM_ClockConfigTypeDef
:用于配置定時器的時鐘源。TIM_MasterConfigTypeDef
:用于配置定時器的主/從模式。TIM_IC_InitTypeDef
:用于配置定時器的輸入捕獲通道。
3. 定時器實例配置
htim2.Instance = TIM2;htim2.Init.Prescaler = 167;htim2.Init.CounterMode = TIM_COUNTERMODE_UP;htim2.Init.Period = 65535;htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
這里配置了定時器 2 (TIM2
) 的一些基本參數:
Instance = TIM2
:指定定時器 2。Prescaler = 167
:設置定時器預分頻器值。它決定定時器的計數頻率。具體計數頻率為系統時鐘頻率除以(預分頻器 + 1)。CounterMode = TIM_COUNTERMODE_UP
:設置計數模式為遞增模式(計數從 0 到Period
)。Period = 65535
:設置定時器的自動重載值,即計數器從 0 增加到 65535 后重載(溢出)。ClockDivision = TIM_CLOCKDIVISION_DIV1
:定時器時鐘分頻因子。AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE
:禁用自動重載預加載。
4. 初始化定時器
if (HAL_TIM_Base_Init(&htim2) != HAL_OK){Error_Handler();}
這行代碼調用 HAL_TIM_Base_Init
函數來初始化定時器。若初始化失敗,則調用 Error_Handler()
來處理錯誤。
5. 配置定時器時鐘源
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK){Error_Handler();}
- 設置定時器時鐘源為內部時鐘源 (
TIM_CLOCKSOURCE_INTERNAL
)。 - 調用
HAL_TIM_ConfigClockSource
來配置時鐘源,如果配置失敗,則調用Error_Handler()
。
6. 初始化定時器的輸入捕獲功能
if (HAL_TIM_IC_Init(&htim2) != HAL_OK){Error_Handler();}
- 調用
HAL_TIM_IC_Init
來初始化定時器的輸入捕獲功能。如果失敗,則調用Error_Handler()
。
7. 配置定時器的主模式
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK){Error_Handler();}
- 配置定時器的主輸出觸發為復位信號(
TIM_TRGO_RESET
)。 - 設置主從模式為禁用(
TIM_MASTERSLAVEMODE_DISABLE
)。 - 使用
HAL_TIMEx_MasterConfigSynchronization
來配置同步。如果配置失敗,則調用Error_Handler()
。
8. 配置輸入捕獲通道
sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;sConfigIC.ICFilter = 0;if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1) != HAL_OK){Error_Handler();}if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_2) != HAL_OK){Error_Handler();}if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_3) != HAL_OK){Error_Handler();}if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_4) != HAL_OK){Error_Handler();}
這些代碼為 TIM2 的 4 個輸入捕獲通道進行配置:
ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING
:設置輸入捕獲的極性為上升沿觸發。ICSelection = TIM_ICSELECTION_DIRECTTI
:選擇直接連接輸入信號。ICPrescaler = TIM_ICPSC_DIV1
:設置輸入捕獲的預分頻器(沒有分頻)。ICFilter = 0
:設置輸入濾波器。
這些配置分別應用于定時器 2 的通道 1、2、3 和 4。
9. 配置中斷和啟動輸入捕獲
/* USER CODE BEGIN TIM2_Init 2 *//* Add by xinggaoyong */__HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_UPDATE|TIM_FLAG_CC1|TIM_FLAG_CC2);__HAL_TIM_ENABLE_IT(&htim2, TIM_IT_UPDATE);__HAL_TIM_ENABLE_IT(&htim2, TIM_IT_CC1);__HAL_TIM_ENABLE_IT(&htim2, TIM_IT_CC2);__HAL_TIM_ENABLE_IT(&htim2, TIM_IT_CC3);__HAL_TIM_ENABLE_IT(&htim2, TIM_IT_CC4);HAL_TIM_IC_Start(&htim2,TIM_CHANNEL_1);HAL_TIM_IC_Start(&htim2,TIM_CHANNEL_2);HAL_TIM_IC_Start(&htim2,TIM_CHANNEL_3);HAL_TIM_IC_Start(&htim2,TIM_CHANNEL_4); __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING);__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_FALLING);__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_4, TIM_INPUTCHANNELPOLARITY_FALLING);/* USER CODE END TIM2_Init 2 */
__HAL_TIM_CLEAR_FLAG
:清除定時器的標志位,如溢出標志和輸入捕獲標志。__HAL_TIM_ENABLE_IT
:使能定時器的中斷(溢出中斷、輸入捕獲中斷)。HAL_TIM_IC_Start
:啟動輸入捕獲功能。__HAL_TIM_SET_CAPTUREPOLARITY
:設置捕獲極性為下降沿,意味著輸入信號的下降沿觸發捕獲事件。
10. 函數結束
}
函數結束,所有初始化工作完成。
總結
這段代碼主要用于初始化 TIM2 定時器,配置輸入捕獲功能并啟用中斷。它設置了定時器的時鐘、輸入捕獲的配置、定時器的主從模式、并啟用了多通道的輸入捕獲中斷。