NUCLEO-F042K6开发板TIM2_CH2无法输出PWM信号问题排查
问题分析与解决办法
针对你在NUCLEO-F042K6上使用TIM2_CH2输出PWM失败的问题,代码中有两处关键错误:
1. GPIO复用功能配置错误
TIM2_CH2对应PA1引脚的复用功能是AF1,但你的代码中错误地配置为AF2:
// 错误代码:配置为AF2 GPIOA->AFR[0] |= (0x2UL << GPIO_AFRL_AFSEL1_Pos);
需要修正为AF1(0x1UL):
// 正确配置:AF1对应TIM2_CH2 GPIOA->AFR[0] |= (0x1UL << GPIO_AFRL_AFSEL1_Pos);
2. TIM_CR1的CMS位配置错误
你直接使用TIM2->CR1 |= TIM_CR1_CMS,这会将CMS的两位同时置1(对应中央对齐模式3)。如果你的应用不需要中央对齐模式,应该保持默认的边缘对齐模式(CMS=00),否则会导致定时器计数行为异常,影响PWM输出。
如果不需要中央对齐,删除该行;如果确实需要中央对齐,需明确设置具体模式(比如TIM_CR1_CMS_0对应模式1,TIM_CR1_CMS_1对应模式2)。
修正后的完整代码
void TIM2_setup(void){ // Enable Timer 2 clock RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // I/O port A clock enable RCC->AHBENR |= RCC_AHBENR_GPIOAEN; // Configure PA1 to Alternate function mode GPIOA->MODER |= (0x2UL << GPIO_MODER_MODER1_Pos); // Correct AF1 selection for TIM2_CH2 on PA1 GPIOA->AFR[0] |= (0x1UL << GPIO_AFRL_AFSEL1_Pos); // Optional: Remove or adjust CMS if you don't need center-aligned mode // TIM2->CR1 |= TIM_CR1_CMS; TIM2->CR1 |= TIM_CR1_ARPE; // PWM mode 1 for CH2 TIM2->CCMR1 |= (0x6UL << TIM_CCMR1_OC2M_Pos); TIM2->CCMR1 |= TIM_CCMR1_OC2PE; TIM2->CCER |= TIM_CCER_CC2E; TIM2->ARR = 8; TIM2->CCR2 = 6; TIM2->PSC = 0; TIM2->CNT = 0; TIM2->CR1 |= TIM_CR1_CEN; }
额外验证建议
- 确认PA1引脚在NUCLEO板上的连接:NUCLEO-F042K6的PA1对应Arduino引脚A1,可直接用示波器测量该引脚的输出。
- 检查TIM2的时钟源:APB1时钟默认是48MHz(STM32F042的系统时钟),PSC=0时定时器时钟为48MHz,ARR=8对应PWM周期为(8+1)/48MHz = 187.5ns,CCR2=6对应占空比约66.7%。
内容的提问来源于stack exchange,提问作者Nemanja
相关产品推荐
相关产品推荐

