voidMX_TIM4_Init(void){/* USER CODE BEGIN TIM4_Init 0 *//* USER CODE END TIM4_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig ={0};
TIM_MasterConfigTypeDef sMasterConfig ={0};
TIM_OC_InitTypeDef sConfigOC ={0};/* USER CODE BEGIN TIM4_Init 1 *//* USER CODE END TIM4_Init 1 */
htim4.Instance = TIM4;
htim4.Init.Prescaler =72-1;//分频系数72分频
htim4.Init.CounterMode = TIM_COUNTERMODE_UP;//向上计数方式
htim4.Init.Period =500-1;
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;//时钟不分频
htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;//分频系数72分频if(HAL_TIM_Base_Init(&htim4)!= HAL_OK)//初始化定时器{Error_Handler();}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;if(HAL_TIM_ConfigClockSource(&htim4,&sClockSourceConfig)!= HAL_OK){Error_Handler();}if(HAL_TIM_PWM_Init(&htim4)!= HAL_OK){Error_Handler();}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if(HAL_TIMEx_MasterConfigSynchronization(&htim4,&sMasterConfig)!= HAL_OK){Error_Handler();}
sConfigOC.OCMode = TIM_OCMODE_PWM2;//TIMx_CNT>TIMx_CCRn时,输出有效电平
sConfigOC.Pulse =0;//占空比
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;//输出极性:TIM输出比较极性高
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;//快速比较使能if(HAL_TIM_PWM_ConfigChannel(&htim4,&sConfigOC, TIM_CHANNEL_3)!= HAL_OK){Error_Handler();}
sConfigOC.OCMode = TIM_OCMODE_PWM1;//TIMx_CNT<TIMx_CCRn时,输出有效电平if(HAL_TIM_PWM_ConfigChannel(&htim4,&sConfigOC, TIM_CHANNEL_4)!= HAL_OK){Error_Handler();}/* USER CODE BEGIN TIM4_Init 2 *//* USER CODE END TIM4_Init 2 */HAL_TIM_MspPostInit(&htim4);}
📑Keil中开启定时器4以及设置占空比
在tim.c中,定时器初始化函数中开启定时器计时。
voidHAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle){
GPIO_InitTypeDef GPIO_InitStruct ={0};if(timHandle->Instance == TIM4){/* USER CODE BEGIN TIM4_MspPostInit 0 *//* USER CODE END TIM4_MspPostInit 0 */__HAL_RCC_GPIOB_CLK_ENABLE();/**TIM4 GPIO Configuration
PB8 ------> TIM4_CH3
PB9 ------> TIM4_CH4
*/
GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);/* USER CODE BEGIN TIM4_MspPostInit 1 */HAL_TIM_PWM_Start(timHandle, TIM_CHANNEL_3);//开启PWM输出通道3,PB8 -->2KHzHAL_TIM_PWM_Start(timHandle, TIM_CHANNEL_4);//开启PWM输出通道4,PB9 -->2KHz/* USER CODE END TIM4_MspPostInit 1 */}}
在main主函数中设置或重新更新改变占空比的比较值。
intmain(void){/* USER CODE BEGIN 1 */// uint8_t flag,i;/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM4_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while(1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */
htim4.Instance->CCR4=250;//输出固定占空比
htim4.Instance->CCR3=350;// __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_4, 250); //设置CH4->PWM脉冲宽度,同上// __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, (150)); //设置CH3->PWM脉冲宽度}/* USER CODE END 3 */}