PWM输出实验:STM32+HAL+CubeMX


1 步骤:

1.1 初始化PWM

TIM_HandleTypeDef htim3;  //定时器3PWM句柄
TIM_OC_InitTypeDef TIM3_CH3Handler;  //定时器3通道3句柄

void TIM3_PWM_Init(void)
{
  htim3.Instance = TIM3;  //定时器3
  htim3.Init.Prescaler = 16-1;  //分频PSC
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;  //向上计数模式
  htim3.Init.Period = 1000-1;  //自动重装载值
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  HAL_TIM_PWM_Init(&htim3);  //初始化PWM

  sConfigOC.OCMode = TIM_OCMODE_PWM1;  //模式选择PWM1
  sConfigOC.Pulse = 0;  //此值用来设置占空比,若占空比变化次处可先不设置
  sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;  //输出比较极性为低
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  
  HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) ;  //配置TIM3通道3
}

1.2  使能TIM时钟、配置复用功能引脚

void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_GPIOB_CLK_ENABLE();  //使能GPIOB时钟
    __HAL_RCC_TIM3_CLK_DISABLE();  //使能定时器3时钟

    GPIO_InitStruct.Pin = GPIO_PIN_0;  //PB0
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;  //复用推挽输出
    GPIO_InitStruct.Pull = GPIO_PULLUP;  //上拉
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;  //高速
    GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;  //PB0复用TIM3_CH3,根据芯片选择,此处需要改
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

1.3 设置TIM的占空比

HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);  //在main函数中,开启PWM通道3

if(dir) dutycycle++;
else dutycycle--;
if(dutycycle>499) dir=0;
if(dutycycle==0) dir=1;
TIM3->CCR3=dutycycle;  //用来设置占空比

//__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,dutycycle);  //用来设置占空比,同上

 2 使用CubeMX配置