Stm32定时器输出PWM
- 互联网
- 2025-08-29 15:00:02

下面为你提供使用 STM32 标准库实现定时器初始化、输出 PWM 以及添加定时器中断功能的详细代码及解释。此示例以 STM32F103 系列芯片为例,使用定时器 3 输出 PWM 信号并添加定时器更新中断。
代码示例 #include "stm32f10x.h" // 函数声明 void RCC_Configuration(void); void GPIO_Configuration(void); void TIM3_Configuration(void); void NVIC_Configuration(void); // 中断服务函数声明 void TIM3_IRQHandler(void); int main(void) { // 配置系统时钟、GPIO、定时器和NVIC RCC_Configuration(); GPIO_Configuration(); TIM3_Configuration(); NVIC_Configuration(); // 使能定时器3 TIM_Cmd(TIM3, ENABLE); // 使能定时器3的PWM输出通道1 TIM_CtrlPWMOutputs(TIM3, ENABLE); while (1) { // 主循环可处理其他任务 } } // 配置系统时钟 void RCC_Configuration(void) { // 使能GPIOA和TIM3的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); } // 配置GPIO void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; // 配置PA6为复用推挽输出,用于TIM3_CH1的PWM输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } // 配置定时器3 void TIM3_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // 定时器基本参数配置 TIM_TimeBaseStructure.TIM_Period = 999; // 自动重载值,PWM周期为1ms TIM_TimeBaseStructure.TIM_Prescaler = 71; // 预分频器,将系统时钟72MHz分频为1MHz TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // PWM模式配置 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 500; // 初始占空比为50% TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure); // 使能定时器3的更新中断 TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); } // 配置NVIC void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; // 配置TIM3中断 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } // 定时器3中断服务函数 void TIM3_IRQHandler(void) { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { // 清除中断标志位 TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // 在这里编写定时器中断触发时要执行的代码 // 例如动态改变PWM占空比 static uint16_t pulse = 0; pulse += 10; if (pulse > 1000) { pulse = 0; } TIM_SetCompare1(TIM3, pulse); } } 代码详解 1. RCC_Configuration函数此函数的作用是使能相关外设的时钟。具体而言,使能了 GPIOA 和 AFIO(复用功能)的 APB2 总线时钟,以及定时器 3 的 APB1 总线时钟。因为使用 GPIOA 的引脚输出 PWM 信号,且定时器 3 作为 PWM 信号的发生源,所以需要先开启它们的时钟。
2. GPIO_Configuration函数该函数用于配置 GPIO 引脚。将 PA6 引脚配置为复用推挽输出模式,速度为 50MHz。这是因为 PA6 要作为定时器 3 的通道 1(TIM3_CH1)的 PWM 输出引脚,复用推挽输出模式能让引脚输出定时器产生的 PWM 信号。
3. TIM3_Configuration函数 定时器基本参数配置: TIM_Period:设置自动重载值为 999,结合预分频器,使得 PWM 信号的周期为 1ms。TIM_Prescaler:预分频器的值设为 71,将系统时钟 72MHz 分频为 1MHz。TIM_ClockDivision:时钟分频系数设为 0。TIM_CounterMode:计数器模式设置为向上计数模式。 PWM 模式配置: TIM_OCMode:选择 PWM 模式 1。TIM_OutputState:使能 PWM 输出。TIM_Pulse:初始占空比设为 50%。TIM_OCPolarity:输出极性为高电平有效。 使能定时器更新中断:调用TIM_ITConfig函数使能定时器 3 的更新中断,当定时器计数器溢出时会触发中断。 4. NVIC_Configuration函数该函数用于配置嵌套向量中断控制器(NVIC)。设置定时器 3 的中断优先级,包括抢占优先级和子优先级,并使能该中断通道。
5. TIM3_IRQHandler函数这是定时器 3 的中断服务函数。当定时器 3 发生更新中断时,会自动调用此函数。首先通过TIM_GetITStatus函数检查是否是更新中断触发,若是则清除中断标志位TIM_ClearITPendingBit,避免重复触发。在中断服务函数中,我们实现了动态改变 PWM 占空比的功能,每触发一次中断,占空比增加 10,当占空比达到 1000 时重新归零。
6. main函数在主函数中,依次调用上述配置函数完成系统时钟、GPIO、定时器和 NVIC 的初始化。然后使能定时器 3 和其 PWM 输出通道 1,最后进入一个无限循环,主循环可用于处理其他任务。
通过以上代码和解释,你可以使用 STM32 标准库实现定时器初始化、输出 PWM 信号并添加定时器中断功能。
Stm32定时器输出PWM由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Stm32定时器输出PWM”