经常有人被定时器溢出时间搞糊涂,看完技术手册对定时器这里也是糊里糊涂的,不知道到底TIM_Period和TIM_Prescaler到底怎么赋值,ARR,PSC等等到底怎么回事。 我决定对定时器这里浅析一下,方便搞懂定时器这两个重要参数。当然定时器的具体基本理论就不叙述了(给大家个连接学习:http://blog.sina.com.cn/s/blog_49cb42490100s6ud.html)我直接从定时器溢出时间公式开始说起: Tout={(ARR+1)*(PSC+1)}/Tclk 其中Tout代表定时器溢出时间,Tclk代表定时器的时钟频率,ARR是自动重装载值,PSC是分频系数。
通过这个公式可以得到我们想要的定时器溢出时间,也就是定时器更新时间,如果开启了定时器中断,那么Tout时间到了我们就可以在定时器中断做一些事情。可以会有人问这个ARR的意思不就是自动装载计数值吗,每计数到我们设定的自动重装载值就产生一个溢出时间,或者也可以叫更新时间。STM32中文参考手册上明明写着向上计数到自动加载值就会溢出了啊,也就是如果选择了向上计数模式,从0计数到了我设置的ARR就会溢出了啊,为什么还要有其他的参数呢? 那你可能忽略了一个问题,你要明确你所说的计数所依据的这个脉冲是哪一个?是外来的时钟脉冲没有经过我们处理过的吗?答案显然是错的,我们得到的脉冲是外部时钟脉冲经过分频系数PSC分频后得到的,所以我们所计数的脉冲也是分频系数分频后得到的脉冲。 这里我们再来分析一下上面的公式: Tout={(ARR+1)*(PSC+1)}/Tclk ARR:自动重装载值,每计数到我们设定的脉冲数值就产生一个更新事件,在这之前我们赋值都是ARR-1,PSC-1,所以这里赋值完就是APP和PSC了。 我们都知道求这段溢出时间是多少,只要知道:多少个脉冲数X每个脉冲的时间,就可以了 那用上边的多少个脉冲ARR乘以每个脉冲的时间不就是溢出时间了吗?那么每个脉冲时间是多少呢,我们知道频率的倒数就是时间,也就是1/f,即1/Tclk,当然我们使用的脉冲是分频过的,变成了每PSC个外部脉冲产生一个我们定时器的脉冲,也就是脉冲周期被改变了,变成了(PSC+1)}/Tclk。
到这里我们就可以总结一下了,定时器的外部时钟脉冲来了会被分频系数PSC改造成我们想要周期的时钟脉冲,然后接着自动重装载数值ARR就自动装载数值,计数到了ARR,就会产生更新事件也就是溢出时间到了。
|