完整代码示例(以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);
} |
|