STM32F401xB/C开发板PA15引脚无PWM信号输出求助
STM32F401 PA15(TIM2_CH1)无PWM输出问题排查
核心问题分析
你的代码存在3个关键错误,导致PA15无法输出PWM:
- TIM2时钟使能寄存器错误:TIM2属于APB1总线外设,时钟使能需操作
RCC->APB1ENR,但你错误写入了RCC->AHB1ENR(GPIO等AHB1外设的时钟寄存器),等于未给TIM2开启时钟。 - PA15复用功能配置不完整:PA15作为TIM2_CH1需要配置为AF1,但你仅设置了AFSEL15的第0位,未先清除原有默认值,可能导致复用功能配置失效。正确做法是先清零对应位段,再设置目标复用功能。
- PA15默认绑定JTAG引脚未释放:PA15默认是JTAG的JTDI引脚,必须先禁用JTAG功能释放引脚,否则引脚被调试功能占用,无法输出PWM。
修复后的代码
#include "stm32f4xx.h" // 初始化GPIO引脚 void GPIO_Init(){ // 给GPIOA、GPIOB开时钟 RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN | RCC_AHB1ENR_GPIOAEN; // 给SYSCFG开时钟,用于配置JTAG引脚释放 RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; // 释放PA15:配置为SWD模式(保留SWD调试,释放JTAG的PA15、PB3、PB4) SYSCFG->CFGR1 |= SYSCFG_CFGR1_JTAGSWD_CFG_1; // 配置PA15为复用模式 GPIOA->MODER &= ~GPIO_MODER_MODER15_Msk; // 先清零两位 GPIOA->MODER |= GPIO_MODER_MODER15_1; // 设置为复用模式(10) // 配置PA15复用为TIM2_CH1(AF1) GPIOA->AFR[1] &= ~GPIO_AFRH_AFSEL15_Msk; // 清零引脚15的AF位段 GPIOA->AFR[1] |= (1 << GPIO_AFRH_AFSEL15_Pos); // 设置为AF1 } // 初始化TIM2定时器 void TIM2_Init(){ // 给TIM2开时钟(APB1总线) RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // 设置预分频器:16MHz /16 =1MHz(1us计数周期) TIM2->PSC = 16-1; // 自动重装载值:20000*1us=20ms周期 TIM2->ARR = 20000; // 计数器清零 TIM2->CNT = 0; // 配置CCMR1为PWM模式1 TIM2->CCMR1 &= ~TIM_CCMR1_OC1M_Msk; TIM2->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; // PWM模式1(OC1M=110) TIM2->CCMR1 |= TIM_CCMR1_OC1PE; // 使能预装载寄存器 // 使能通道1输出,极性为高 TIM2->CCER |= TIM_CCER_CC1E; // 设置占空比:10000*1us=10ms(50%占空比) TIM2->CCR1 = 10000; } void setup(){ // 设置系统时钟为16MHz(默认内部HSI) RCC->CFGR &= ~RCC_CFGR_SW_Msk; RCC->CFGR |= RCC_CFGR_SW_HSI; GPIO_Init(); TIM2_Init(); // 启动TIM2计数器 TIM2->CR1 |= TIM_CR1_CEN; }
额外说明
- 释放PA15时选择SWD模式,既能保留调试功能,又能释放PA15引脚;若无需调试,也可直接禁用所有JTAG/SWD功能。
- 配置寄存器时建议先清零对应位段再设置,避免默认值干扰配置结果。
内容的提问来源于stack exchange,提问作者Cristian Cutitei
相关产品推荐
相关产品推荐

