一、常用的定時功能
(1)基本、通用、高級定時器都有最基本的定時功能,定時功能用到的函數如下:
HAL_TIM_Base_Init 初始化定時,包括分頻、 預裝值等。
HAL_TIM_ConfigClockSource 選擇定時器的時鍾源
HAL_TIM_Base_Start_IT 開始定時器
HAL_TIM_PeriodElapsedCallback 超時后的回調函數
(2)Cubemx的配置,不管什么定時器,都是這個配置,注意開啟中斷,計算好最終的定時器時鍾
(3)代碼片段
1 void MX_TIM12_Init(void) 2 { 3 TIM_ClockConfigTypeDef sClockSourceConfig = {0}; 4 5 htim12.Instance = TIM12; 6 htim12.Init.Prescaler = 199; 7 htim12.Init.CounterMode = TIM_COUNTERMODE_UP; 8 htim12.Init.Period = 999; 9 htim12.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; 10 htim12.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; 11 if (HAL_TIM_Base_Init(&htim12) != HAL_OK) 12 { 13 Error_Handler(); 14 } 15 sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; 16 if (HAL_TIM_ConfigClockSource(&htim12, &sClockSourceConfig) != HAL_OK) 17 { 18 Error_Handler(); 19 } 20 21 } 22 23 int main(void) 24 { 33 HAL_Init(); 34 35 /* USER CODE BEGIN Init */ 36 37 /* USER CODE END Init */ 38 39 /* Configure the system clock */ 40 SystemClock_Config(); 47 MX_GPIO_Init(); 48 MX_TIM12_Init(); 49 /* USER CODE BEGIN 2 */ 50 HAL_TIM_Base_Start_IT(&htim12); 51 /* USER CODE END 2 */ 52 53 /* Infinite loop */ 54 /* USER CODE BEGIN WHILE */ 55 while (1) 56 { 57 /* USER CODE END WHILE */ 58 HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_13); 59 HAL_Delay(1000); 60 /* USER CODE BEGIN 3 */ 61 } 62 /* USER CODE END 3 */ 63 } 64 65 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 66 { 67 if(htim->Instance == TIM12) 68 { 69 static uint16_t cnt = 0; 70 if(++cnt >= 1000) 71 { 72 cnt = 0; 73 HAL_GPIO_TogglePin(GPIOH,GPIO_PIN_9); 74 } 75 } 76 77 }
二、使用通用定時器或者高級定時器來生產PWM波形
(1)使用通用定時器生成1路PWM
a.使用到的定時器API
HAL_TIM_PWM_Init
HAL_TIM_PWM_ConfigChannel
HAL_TIM_PWM_Start
__HAL_TIM_SET_COMPARE
b.Cubemx的配置
選擇內部始終,Channel 1 為PWM生成。
根據配置信息,可知:
定義定時器預分頻,定時器實際時鍾頻率為:200MHz/(GENERAL_TIMx_PRESCALER+1)
實際時鍾頻率為:20MHz
定義定時器周期,當定時器開始計數到GENERAL_TIMx_PERIOD值是更新定時器並生成對應事件和中斷
定時器產生中斷頻率為:20MHz/(999+1)=20KHz,即50us定時周期
GENERAL_TIM_CH1_PULSE/GENERAL_TIM_PERIOD*100%
所以,以上配置生成的PWM的頻率為20KHz,占空比為50%。
c. 代碼實現
int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM2_Init(); HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); while (1) { } } void MX_TIM2_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; htim2.Instance = TIM2; htim2.Init.Prescaler = 9; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 999; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 500; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } HAL_TIM_MspPostInit(&htim2); }