STM32F103定时器2计数始终为0问题排查求助
嘿,我之前调试STM32定时器的时候也踩过一模一样的坑!你的问题根源其实就在初始化配置里,咱们一步步拆解解决:
核心问题:Period(自动重装载值)设为0了
看你CubeMX生成的初始化代码,htim2.Init.Period = 0;这行是关键。在向上计数模式下,TIM2的计数器会从0开始递增,当达到ARR(自动重装载寄存器)的值时,会触发更新事件并重置计数器回到0。如果ARR是0,计数器刚到0就立刻触发重置,根本没机会往上计数,所以你读CNT永远是0。
解决方案步骤
修改CubeMX中的TIM2配置
打开STM32CubeMX,找到TIM2的配置界面,把**Period(自动重装载值)**改成一个大于0的数值。比如如果只是测试计数,可以设为0xFFFFFFFF(TIM2是32位定时器,最大值),或者根据你的需求设置合适的周期值,然后重新生成代码。手动修正初始化代码(可选)
如果你不想重新打开CubeMX,直接修改MX_TIM2_Init里的Period值即可:htim2.Init.Period = 0xFFFF; // 示例值,可根据需求调整去掉多余的时钟使能代码
你主函数里的__TIM2_CLK_ENABLE();;完全没必要,甚至多了一个无效分号。HAL库的HAL_TIM_Base_Init函数内部已经自动调用了对应的时钟使能宏(比如__HAL_RCC_TIM2_CLK_ENABLE()),手动调用反而画蛇添足,直接删掉这行就行。验证定时器启动状态
为了确保定时器确实启动成功,可以给HAL_TIM_Base_Start加个返回值判断:if (HAL_TIM_Base_Start(&htim2) != HAL_OK) { Serial.println("TIM2启动失败!"); while(1); // 启动失败就死等,方便排查问题 }
额外检查点(如果仍有问题)
如果做完上面的步骤还是不行,再确认两个点:
- 时钟源配置:你用的
TIM_CLOCKSOURCE_INTERNAL是正确的,STM32F103的TIM2默认挂载在APB1总线,CubeMX会自动配置总线时钟,无需手动调整。 - 计数器模式:
TIM_COUNTERMODE_UP是正常的向上计数模式,没有问题。
按照这个流程改完,再去读取__HAL_TIM_GetCounter(&htim2),应该就能看到计数器正常递增了!
内容的提问来源于stack exchange,提问作者John Gaby




