stm32 定时器_STM32定时器(TIM)之预分频器(PSC)详解

在STM32的定时器中,预分频器(Prescaler-PSC)用来将定时器时钟源进行分频输出。
预分频器的值由寄存器TIMx_PSC设定,是一个16位正整数值。

87d4de8063c306fa055e36f14f01ced3.png
STM32CubeMX中的TIM预分频设置


在STM32系统中,定时器的时钟源为内部时钟时,其频率一般都比较高,以STM32F103的TIM1为例,其总线时钟最大为72MHz,体现在16位的定时器上的效果就是从0计数到65535上溢只需要0.9毫秒。如果我们需要更长时间的定时间隔,那么就需要预分频器对时钟进行分频处理,以降低定时器时钟(CK_CNT)的频率。
除此之外,也可以通过配置预分频器,来获取想要的定时器时钟频率。依然以上边的TIM1为例,如果我们想获取一个精确的1ms中断,如果不分频,72MHz的时钟对应每周期1/72us,十分不利于计算。这时候使用预分频器将其72分频后为1MHz,每周期1us,1000个计时周期即为1ms,这样既便于计算,定时也更加精确。
预分频器的工作的工作原理是,定时器时钟源每tick一次,预分频器计数器值+1,直到达到预分频器的设定值,然后再tick一次后计数器归零,同时,CNT计数器值+1。
由此可以看出,因为达到最大值后还要再tick一次才归零,所以定时器时钟频率应该为Fosc/(PSC+ 1)。其中Fosc是定时器的时钟源。比如想对时钟源进行72分频,那么预分频器的值就应该设置为71。
预分频器值寄存器TIMx_PSC存在影子寄存器(官方翻译为缓冲功能),所以在定时器启动后更改TIMx_PSC的值并不会立即影响当前定时器的时钟频率。要等到下一个更新事件(UEV)发生时才会生效。比如下边这张图就体现了将分频系数由1修改为2(即TIMx_PSC由0更改为1)时整个定时器的时序图。

458542eb7ac3057724a1eb616b346078.png
预分频器值更改时的定时器时序图


更新事件(UEV)则由TIMx_CR1寄存器中的UDIS位控制,在启用时,会通过以下两种方式触发 :

  • 计数器上溢
  • 手动将 TIMx_EGR 寄存器中的UG 位置 1
  • 12
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32中,可以使用通用定时器来实现精确的延时。在非中断方式下,我们需要使用定时器的计数来实现精确的计时。 下面是一个使用TIM2定时器实现精确延时的例子: ```c #include "stm32f10x.h" void TIM2_Delay_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //使能TIM2时钟 TIM_TimeBaseInitStruct.TIM_Period=arr; //自动重装载值 TIM_TimeBaseInitStruct.TIM_Prescaler=psc; //分 TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1; //时钟分割 TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct); TIM_Cmd(TIM2,DISABLE); //关闭定时器2 } void TIM2_Delay_us(u32 us) { TIM_SetCounter(TIM2,0); //计数清0 TIM_Cmd(TIM2,ENABLE); //使能定时器2 while(TIM_GetCounter(TIM2)<us); //等待计数计满us TIM_Cmd(TIM2,DISABLE); //关闭定时器2 } int main(void) { TIM2_Delay_Init(72-1,72-1); //初始化定时器2,分系数为72,则计数时钟为1MHz TIM2_Delay_us(1000); //延时1ms while(1); return 0; } ``` 在上述代码中,我们使用TIM2定时器来实现延时。在初始化函数`TIM2_Delay_Init()`中,我们配置了定时器的自动重装载值和分,以及向上计数模式。在延时函数`TIM2_Delay_us()`中,我们首先将计数清零,然后使能定时器开始计数。接着,我们不断检查计数是否达到了指定的延时时间,如果没有,则继续等待。当计数计满指定的时间后,我们关闭定时器,延时结束。 需要注意的是,这种方式并不是非常精确,因为延时过程中可能会有其他中断干扰计数的计数。如果需要更精确的延时,可以考虑使用硬件定时器中断方式实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值