前言
- 定时器,字面意思——能够计时的工具,51的时候已经初步学过,当然了,32也有定时器,功能相对来说比51的更完善,高级。
系统架构
F103是大容量产品 因此通过系统架构图,我们可以知道TIMx处于不同的总线桥。TIM(2-7)在APB1(36MHz),TIM(1,8)在APB2(72MHz),那么可知TIM(1,8)比较特殊,不跟其他定时器在一起。那么就先了解一下,定时器之间的功能区别。
定时器类型的基本介绍:
stm32F103一共有8个定时器,分为三种类型。分别为高级定时器(TIM1,TIM8),通用定时器(TIM2-TIM5),普通定时器(TIM6,TIM7),更高级的定时器继承了低级定时器的所有功能,手册中有他们的功能区别。
浅讲一下相关功能概念:
计数模式:
计数位数都是16位的定时器,但计数器模式有区别,高级与通用定时器模式相同且比普通定时器多。
up,down :可以理解为0 --> x, x --> 0,x代表的是你设置在自动重装载寄存器的值,这个寄存器后面会提到。
up/down:中央对齐模式(1,2,3),计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。
而他们的小弟普通定时器功能就只能up 向上计数。
当然了这只是F103这块,其他系列的TIMx相关功能不同。
预分频系数:
三种预分频系数都为1-65536,对频率进行分频处理,这预分频系数后面也会提到,我们先知道有这个。
DMA请求:
DMA我的理解是,CPU的小助手,我们都知道CPU无时无刻都在处理任务,但有些事情并不是很重要或者很简单,这时候小助手DMA就出现了,她可以帮助CPU处理事务,例如数据的复制啥的,实现了数据的直接传输,省略了经过CPU参与。
捕获/比较通道:
捕获就是可以检测通道的边缘信号跳变(上升沿/下降沿)将当前定时器的(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCR)里面,完成一次捕获。测PWM的输入时,就可以先测下降沿,为t1,测到后,将CNT清零,且设置为上升沿捕获,因此当下一次上升沿时,为t2,(t2-t1) 就可以测出为低电平的时间。
比较就是计数器的值与转载的值比较,我们可以用这个来输出一个PWM,假设定时器是向上计数,当CNT<CCRx时输出0,当CNT>=CCRx输出1。这样我们就可以改变PWM的占空比。当然了CCRx的值要小于ARR(计数器自动重装值),不然还没到CCRx就清零了。
互补输出:
输出上具备NPN和PNP两种输出晶体管的输出电路。高级定时器有互补输出,通用与普通定时器没有。
时钟
了解完三种定时器的区别后,就迈向下一步,了解定时器相关时钟控制。首先我们先查询手册,查看一下时钟树。
饭要一口一口吃,女孩子要一步一步追,所以学习得一步一步来。先学习定时器相关部分。
AHB总线架构配置成72MHz,经过AHB预分频器后,APB1和APB2的源头就是72MHz了。然后就到APB1预分频器,看树可知APB1最大也就36MHz,因此APB1预分频器最小值为“2”,这是输入到APB1其他外设上面的时钟源。定时器:处于预分频器后面,连在APB1预分频器下面。注意看分频器下面那个框框,“如果预分频器系数=1,频率不变,否则频率x2”,由此可知到输入到定时器的TIMxCLK频率为72MHz。(定时器2-7)
APB2最大为72MHz,因此APB2预分频器可以设置为1,因为设置为1的话,就不用×2了,直接就是72MHz输入到TIMxCLK.(定时器1,8)。由此所有定时器的TIMxCLK相同,也就是内部时钟都为72MHz。知道这内部时钟后,就拿到了钥匙进入定时器框架。
通用定时器框架
此关卡以通用定时器框架为主,在前期学习先了解到时基及以上部分。
通过开局的学习,知道了CK_INT内部时钟为72MHz,经过触发控制器时,设置复位,使能,向上还是向下计数模式,在没有对时钟进行分频处理后,那么它出来后,CK_PSC还是为72MHz ,出来后就得经过PSC预分频器,将改变时钟频率了。
预分频器寄存器
那么PSC预分频器的大小就由寄存器的值来决定。
寄存器有16位,2^16 = 65536,但因为是二进制所以取值范围是0-65535,但预分频器的值是分母,分母不能为0,因此每一次设置预分频器的值后,还需加1。例如:设置为71,那么CK_CNT=72MHz/(71+1)= 1MHz,然后时间t = 1/f,因此 t = 1/1MHz = 1μs。
CNT计数器寄存器
经过PSC预分频器后,就来到CNT计数器,这个就比较简单通过CK_CNT时钟线的频率,来计算当前值,比如当预分频器设置为71后,1μs后计数器将会+1。
自动重装载寄存器
设置上文提到的上限值(X),这个值大小范围0-65535。如果设置为0,计数器不工作。如果达到上限值时,表示定时完成,产生一个中断服务函数。那么就可以在中断服务函数里面处理相应任务了。
总结一下,通用定时器的基本工作流程。首先在预分频器(TIMx_PSC)设置值,将时钟进行分频,后在自动重转载寄存器设置上限值(TIMx_ARR) X,后以时钟频率CNT计数器每次加1,到达自动重转载设的值后进入中断服务函数干活,嘿嘿!
以上便是最基础的定时器功能,实现计时的效果从而产生函数来实现相应功能。前面提到捕获/比较通道便是后面的学习内容,他将用于PWM的输入与输出,这次就先提前了解一下。
TIMx_CH(1-4)对应的是相应的通用和高级定时器的引脚,在引脚图当中,我们可以找到相对应的引脚然后配置输入捕获,我们就可以捕获到脉冲的宽度。
将引脚配置为输入模式后,通过引脚的输入,在边沿检测器下可以捕获到一个脉冲的边沿(上升沿或下降沿),自动重转载器设置一个上限值后,cnt就从0——上限值变化,因此,当测到后(假设下降沿)CNT计数器里面的值 t1 会存放到捕获/比较寄存器。当我们捕获到边沿时,便会产生一个中断,这时我们可以在中断服务函数里面,设置边沿检测器为上升沿捕获,当脉冲上升沿时,捕获时间值t2 ,这时我们用t2 - t1 便可以得到脉冲的低电平脉宽时间。
输入功能了解完后,就了解输出功能。
输出引脚是和输入引脚一样的,GPIO嘛可输入/输出。将引脚配置为输出模式后,在捕获/比较寄存器写入一个值 Z 处于0-X(自动重装载寄存器里写的值),因此,将计数范围分为2个阶段,0 - Z,Z - X。通过捕获/比较寄存器可以将输出模式可配置成6种模式,以PWM1模式讲解,在0 - Z这个阶段,我们可以理解成处于有效阶段,PWM1模式呢,处于有效阶段为输出高电平,Z - X为无效阶段配置为0。PWM2模式就相反,有效阶段为低电平,无效阶段为高电平。这样我们就可以输出一个我们想要的脉宽。
总结
以上便最基本的通用定时器的相关知识,我主要是以标准固件库来学习的,通过相应的固件库函数,来配置定时器相应的功能,达到计时的效果。