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
相关产品推荐
相关产品推荐

