| pwm.c #include "pwm.h"
 
TIM_HandleTypeDef TIM3_PWM_Struct;   // TIM_PWM句柄
TIM_OC_InitTypeDef TIM3_OC_Sturct;   // TIM_OC句柄
 
void TIM3_PWM_Init()         // PWM初始化
{
 
    TIM3_PWM_Struct.Instance = TIM3;
    TIM3_PWM_Struct.Init.Prescaler = 90 - 1;                  // 预分频系数  
    TIM3_PWM_Struct.Init.Period = 500 - 1;                     // 自动装载值  
    TIM3_PWM_Struct.Init.CounterMode = TIM_COUNTERMODE_UP;      // 计数模式:向上计数
 
    HAL_TIM_PWM_Init(&TIM3_PWM_Struct);                     // TIM_PWM初始化
 
    TIM3_OC_Sturct.OCMode = TIM_OCMODE_PWM1;                // 选择PWM1,还是PWM2
    TIM3_OC_Sturct.Pulse = 250;                             // 占空比:为Period(ARR)一半
    TIM3_OC_Sturct.OCPolarity = TIM_OCPOLARITY_LOW;         // 因为小灯是低电平有效 选择低电平
 
    HAL_TIM_PWM_ConfigChannel(&TIM3_PWM_Struct, &TIM3_OC_Sturct, TIM_CHANNEL_4);    // 初始化PWM通道参数
    
    HAL_TIM_PWM_Start(&TIM3_PWM_Struct, TIM_CHANNEL_4);     // 使能定时器PWM
 
}
 
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
 
    if (htim->Instance == TIM3)
    {
        
        GPIO_InitTypeDef GPIO_Struct;           // GPIO句柄
        
        GPIO_Struct.Pin = GPIO_PIN_1;           // PB1
        GPIO_Struct.Mode = GPIO_MODE_AF_PP;     // 推挽输出
        GPIO_Struct.Pull = GPIO_PULLUP;         // 上拉
        GPIO_Struct.Speed = GPIO_SPEED_FAST;    // 高速
        GPIO_Struct.Alternate = GPIO_AF2_TIM3;  // 复用为TIM3
 
        HAL_GPIO_Init(GPIOB, &GPIO_Struct);  
 
        __HAL_RCC_TIM3_CLK_ENABLE();            // TIM3时钟使能
        __HAL_RCC_GPIOB_CLK_ENABLE();           // GPIOB时钟使能
 
    }
 
}
 
void TIM3_PWM_SetValue(TIM_HandleTypeDef *htim, uint32_t value)      // 改变PWM占空比的值
{
 
    htim->Instance->CCR4 = value;                        // 占空比大亮度亮,占空比小亮度暗
 
}
 |