STM32F0引脚PA1、PA5编码器模式配置后TIM2->CNT无变化问题
编码器模式下TIM2->CNT始终为0的问题排查与解决
问题场景
已将增量编码器连接至PA1、PA5引脚,配置TIM2为编码器模式后,读取TIM2->CNT始终为0,无法随编码器旋转更新数值。
核心问题与修正方案
1. GPIO与TIM初始化顺序颠倒
TIM模块初始化时,对应的GPIO引脚尚未配置为复用功能模式,导致TIM无法捕获引脚输入信号。必须先完成GPIO的模式、复用功能配置,再初始化TIM。
2. 未配置GPIO上下拉电阻
编码器引脚默认处于浮空状态,无法稳定采集A/B相的电平变化,需根据编码器输出类型配置上拉或下拉电阻(多数增量编码器为推挽输出,建议配置上拉)。
3. GPIO MODER配置未清除原有状态
直接使用|=操作符配置MODER寄存器,若引脚原有模式非输入(如模拟模式),会导致最终模式错误。需先清零对应位,再设置复用功能模式。
4. 可选:编码器极性匹配(按需调整)
若编码器A/B相的电平变化与TIM配置的极性不匹配,也会导致计数异常。可根据编码器 datasheet,调整TIM2->CCER中的CC1P/CC2P位(置1表示反转极性)。
修正后的完整代码
void init_hardware_timer_version(void) { // 1. 启用GPIOA和TIM2时钟 RCC->AHBENR |= RCC_AHBENR_GPIOAEN; RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // 2. 配置GPIO引脚 // 先清除PA1和PA5的MODER原有配置 GPIOA->MODER &= ~(GPIO_MODER_MODER1_Msk | GPIO_MODER_MODER5_Msk); // 设置为复用功能模式(10) GPIOA->MODER |= GPIO_MODER_MODER1_1 | GPIO_MODER_MODER5_1; // 配置AF1对应TIM2_CH2(PA1)和TIM2_CH1(PA5) GPIOA->AFR[0] &= ~((0xF << (1*4)) | (0xF << (5*4))); GPIOA->AFR[0] |= (1 << (1*4)) | (1 << (5*4)); // 配置上拉电阻,稳定引脚电平 GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR1_Msk | GPIO_PUPDR_PUPDR5_Msk); GPIOA->PUPDR |= GPIO_PUPDR_PUPDR1_0 | GPIO_PUPDR_PUPDR5_0; // 3. 初始化TIM2编码器模式 TIM2->ARR = 12; // 自动重载值可按需调整 // 配置CC1和CC2为输入模式,映射到TI1/TI2 TIM2->CCMR1 &= ~(TIM_CCMR1_CC1S_Msk | TIM_CCMR1_CC2S_Msk); TIM2->CCMR1 |= TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0; // 配置捕获极性(根据编码器调整,此处为默认不反转) TIM2->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC2P); // 编码器模式3:TI1和TI2的边沿都触发计数 TIM2->SMCR &= ~TIM_SMCR_SMS_Msk; TIM2->SMCR |= TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1; // 启用计数器 TIM2->CR1 |= TIM_CR1_CEN; }
验证步骤
- 检查编码器硬件连接:确认A相接PA5、B相接PA1,电源和地线连接正确
- 烧录修正后的代码,旋转编码器后读取
TIM2->CNT,观察数值是否随旋转方向递增/递减 - 若仍无变化,可尝试反转
CC1P或CC2P位,调整极性匹配编码器输出
内容的提问来源于stack exchange,提问作者BIRD
相关产品推荐
相关产品推荐

