[综合信息] 用TIM1输出普通PWM完整代码示例

[复制链接]
9|1
classroom 发表于 2026-5-22 15:38 | 显示全部楼层 |阅读模式
完整代码示例(以PA7作为TIM1_CH2输出为例)
c
/*
* 功能:TIM1_CH2(PWM输出) 初始化
* 参数:period   - 自动重装载值(决定PWM周期)
*       pulse    - 比较值(决定PWM占空比)
*       prescaler- 预分频值
* 输出频率计算公式:PWM_Freq = 定时器时钟 / (prescaler + 1) / (period + 1)
*/

static void TIM1_PWM_Init(uint16_t period, uint16_t pulse, uint16_t prescaler)
{
    GPIO_InitType GPIO_InitStructure;
    TIM_TimeBaseInitType TIM_TimeBaseStructure;
    OCInitType TIM_OCInitStructure;

    /* ========== 1. 使能相关时钟 ========== */
    /* 使能GPIOA时钟 */
    RCC_APB_Peripheral_Clock_Enable(RCC_APB_PERIPH_IOPA);
    /* 使能AFIO时钟(复用功能必须) */
    RCC_APB_Peripheral_Clock_Enable(RCC_APB_PERIPH_AFIO);
    /* 配置TIM1时钟源为PCLK */
    RCC_TIM1_Clock_Config(RCC_TIM1_CLKSRC_PCLK);
    /* 使能TIM1外设时钟 */
    RCC_APB_Peripheral_Clock_Enable(RCC_APB_PERIPH_TIM1);

    /* ========== 2. 配置GPIO为复用推挽输出 ========== */
    GPIO_Structure_Initialize(&GPIO_InitStructure);
    GPIO_InitStructure.Pin        = GPIO_PIN_7;                    // PA7对应TIM1_CH2
    GPIO_InitStructure.GPIO_Mode  = GPIO_MODE_AF_PP;               // 复用推挽输出
    GPIO_InitStructure.GPIO_Alternate = GPIO_AF4_TIM1;             // 查手册确认AF编号!
    GPIO_InitStructure.GPIO_Current = GPIO_HIGH_DREIVE;
    GPIO_Peripheral_Initialize(GPIOA, &GPIO_InitStructure);

    /* ========== 3. 配置定时器时基 ========== */
    TIM_TimeBaseStructure.Period    = period;                      // 自动重装载值
    TIM_TimeBaseStructure.Prescaler = prescaler;                   // 预分频系数
    TIM_TimeBaseStructure.ClkDiv    = 0;
    TIM_TimeBaseStructure.CntMode   = TIM_CNT_MODE_UP;             // 向上计数模式
    TIM_Base_Initialize(TIM1, &TIM_TimeBaseStructure);

    /* ========== 4. 配置PWM输出通道 ========== */
    TIM_OCInitStructure.OcMode      = TIM_OCMODE_PWM1;             // PWM模式1
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;     // 使能输出
    TIM_OCInitStructure.OcPolarity  = TIM_OC_POLARITY_HIGH;        // 高电平有效
    TIM_OCInitStructure.Pulse       = pulse;                       // 比较值(决定占空比)
    TIM_OCInitStructure.OcIdleState = TIM_OC_IDLE_STATE_RESET;
   
    /* 初始化通道2(PA7对应CH2)*/
    TIM_Output_Channel2_Initialize(TIM1, &TIM_OCInitStructure);
   
    /* 使能通道2的预装载寄存器 */
    TIM_Output_Channel2_Preload_Set(TIM1, TIM_OC_PRELOAD_ENABLE);
   
    /* 使能自动重装载预装载 */
    TIM_Auto_Reload_Preload_Enable(TIM1);

    /* ========== 5. 启动定时器 ========== */
    TIM_On(TIM1);                              // 使能TIM1计数器
   
    /* ========== 6. ★★★ 关键步骤:使能主输出 ★★★ ========== */
    TIM_PWM_Output_Enable(TIM1);               // 高级定时器专属,不能省!
}

/* 调用示例:输出20kHz、占空比50%的PWM */
/* 假设定时器时钟 = 48MHz */
/* 频率 = 48MHz / (48) / (50) = 20kHz */
/* 占空比 = pulse / period = 25 / 50 = 50% */
void demo(void)
{
    TIM1_PWM_Init(50-1, 25, 48-1);
}
tpgf 发表于 2026-5-22 16:37 | 显示全部楼层
使用高级定时器TIM1输出普通PWM,需结合其硬件特性和寄存器配置实现
您需要登录后才可以回帖 登录 | 注册

本版积分规则

713

主题

5105

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部
0