关注、星标公众号,不错过精彩内容
定时器最基本的功能就是定时处理事情。比如定时发送USART数据、定时采集AD数据、定时检测IO口电位、还可以通过IO口输出波形等。可以实现非常丰富的功能。定时器是一个很强大的外设,不同行业使用的方式不同,知识面很广。
0 1定时器介绍首先我们可以在STM32F207数据手册找到定制器的资源,从下图可以看到STM32F207一共10个通用定时器,2个高级定时器,2个基本定时器。
不同定时器的区别
由上图看出,不同寄存器具有不同的参数,位数的区别,计数模式的区别,DMA请求的区别,通道得的区别,互补输出的区别和其他。在具体项目中选择哪个定时器,需要看具体的应用场景。下文主要讲解定时器的基础定时功能,选择定时器3。其他定时器原理是相同的,理解定时器3的定时功能,其他定时器也就能理解了。对于STM32系列的单片机,外设基本都是一致的,并且其他家的MCU也是类似的,国内的有兆易创新、新唐科技、上海灵动微电子等等。
0 2时钟源定时器基本定时功能框图。
①CK_PSC是定时器时钟TIMxCLK,经APB1预分频器后分频提供。
②定时器时钟经过PSC 预分频器之后,即CK_CNT,用来驱动计数器计数。
③计数器CNT 是一个16 位的计数器,向上,向下,向上/下计数模式,最大计数值为65535。当计数达到自动重装载寄存器的时候产生更新事件,并清零从头开始计数。
④自动重装载寄存器ARR 是一个16位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。
定时器说白了就是个计数器,就像我们用心跳粗略估算时间一样,心脏跳动粗略可以认为是1s,那么我们计时60次心跳就过了60秒。其中CK_CNT时钟就类似心跳,CNT计数器就类似心跳次数。举一个极端简单的例子,我们要实现60秒定时,CK_CNT是1s,我们设置CNT计数器向上计数开启中断,因为只有溢出时,也就是计数到65535时才会有中断,那么我们设置CNT计数器为65535-60=65475,开始及时,那么60秒后就会产生中断。我们设置自动重装载寄存器ARR也为65475,当CNT计数器溢出时,自动重装载寄存器ARR就会自动装载到CNT计数器中,就能实现自动循环定时60秒。
经过上面分析,精确定时的关键在于CK_CNT的频率,而CK_CNT是由定时器时钟分频而来的。那么我们就要知道timer3的定时器时钟。我们就要看时钟系统部分,具体看文章《STM32F207时钟系统解析》,这篇文章主要讲解了系统的120M时钟如何从外部的25M的晶振得到的。其中说到APB外设时钟的问题。
定时器在APB定时器时钟下,具体在APB1还是在APB2时钟下我们可以从STM32F207数据手册上看到,图片名字STM32F20xblock diagram。
从上文我们看timer3是在APB1下的。
那么我们来分析APB1的频率
<