You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32F103C8T6(蓝 pill)TIM1寄存器周期值设置问询

如何通过寄存器设置STM32F103C8T6 TIM1的周期值实现1秒定时

嘿,我来帮你搞定这个TIM1周期寄存器的问题!你要找的周期值对应的寄存器其实就是你已经用到的TIM1->ARR——也就是Auto-Reload Register(自动重装载寄存器),它就是用来定义计数器溢出周期的核心寄存器。

核心问题解析

你之前用HAL库的公式(period)*(prescaler)/(clock Speed)=second是对的,但要注意STM32寄存器层面的一个细节:预分频器PSC寄存器的值是分频系数减1,也就是实际分频倍数 = TIM1->PSC + 1。

结合你的需求:

  • 时钟频率72MHz
  • 目标1秒定时
  • 若想让预分频后计数器时钟为72kHz(这样72000个计数周期刚好是1秒),那TIM1->PSC应该设为999(因为72MHz/(999+1)=72kHz),而不是你当前写的1000——如果设1000的话,实际分频是1001倍,定时会略超过1秒。

修改后的配置函数

直接把你原来写的TIM1->ARR = 0x0064;替换成TIM1->ARR = 72000;即可,同时优化寄存器操作顺序(先关计数器再配置,避免异常触发):

void TIM1_Config(){
    RCC->APB2ENR |= 0x00000400; //TIM1 时钟使能
    
    TIM1->CR1 &= ~0x0001; //先关闭计数器(清除CEN位)
    
    TIM1->CR1 |= 0x0082; //配置自动重装载、更新请求源(暂不开启计数器)
    TIM1->DIER |= 0x0003; //使能CC1中断、更新中断
    TIM1->PSC = 999; //预分频器值:对应分频1000倍,计数器时钟72kHz
    TIM1->ARR = 72000; //自动重装载值:72000个周期刚好1秒
    
    TIM1->CR1 |= 0x0001; //最后开启计数器(置位CEN位)
}

额外注意事项

  • 不要用TIM1->PSC |= 0x03E8;这种方式赋值预分频器,直接用=覆盖默认值更稳妥,避免残留的默认值影响分频结果
  • 修改ARR/PSC这类关键参数时,优先关闭计数器,配置完成后再开启,能避免中途触发异常的更新中断

内容的提问来源于stack exchange,提问作者RasimGök

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 11:32:30