You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

STM32F103定时器2计数始终为0问题排查求助

STM32F103 TIM2 Counter Stuck at 0 After Starting with HAL Library

嘿,我之前调试STM32定时器的时候也踩过一模一样的坑!你的问题根源其实就在初始化配置里,咱们一步步拆解解决:

核心问题:Period(自动重装载值)设为0了

看你CubeMX生成的初始化代码,htim2.Init.Period = 0;这行是关键。在向上计数模式下,TIM2的计数器会从0开始递增,当达到ARR(自动重装载寄存器)的值时,会触发更新事件并重置计数器回到0。如果ARR是0,计数器刚到0就立刻触发重置,根本没机会往上计数,所以你读CNT永远是0。

解决方案步骤

  1. 修改CubeMX中的TIM2配置
    打开STM32CubeMX,找到TIM2的配置界面,把**Period(自动重装载值)**改成一个大于0的数值。比如如果只是测试计数,可以设为0xFFFFFFFF(TIM2是32位定时器,最大值),或者根据你的需求设置合适的周期值,然后重新生成代码。

  2. 手动修正初始化代码(可选)
    如果你不想重新打开CubeMX,直接修改MX_TIM2_Init里的Period值即可:

    htim2.Init.Period = 0xFFFF; // 示例值,可根据需求调整
    
  3. 去掉多余的时钟使能代码
    你主函数里的__TIM2_CLK_ENABLE();;完全没必要,甚至多了一个无效分号。HAL库的HAL_TIM_Base_Init函数内部已经自动调用了对应的时钟使能宏(比如__HAL_RCC_TIM2_CLK_ENABLE()),手动调用反而画蛇添足,直接删掉这行就行。

  4. 验证定时器启动状态
    为了确保定时器确实启动成功,可以给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

火山引擎 最新活动