首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32定时器的预装载寄存器与影子寄存器之间的关系

STM32定时器的预装载寄存器与影子寄存器之间的关系

定时器在STM32F10xxx系列的32位MCU上,定时器资源十分丰富,包括高级控制定时器,通用定时器和基本定时器。此外,还有能够实现定时功能的系统滴答定时器,实时时钟以及看门狗。关于这些定时器的介绍,占据了STM32F10xxx参考手册1/5的篇幅,可见其功能的强大。

在低容量和中容量的STM32F103xx产品,以及互联型产品STM32F105xx和STM32F107xx中,只有一个高级控制定时器TIM1。而在高容量和超大容量的STM32F103xx产品中,有两个高级控制定时器TIM1和TIM8。

在所有STM32F10xxx系列产品中,都有通用定时器TIM2~TIM5,除非另有说明。除此之外,在超大容量产品中,还有通用定时器TIM9~TIM14。

在高容量和超大容量的STM32F101xx和STM32F103xx产品,以及互联型产品STM32F105xx和STM32F107xx中,有两个基本定时器TIM6和TIM7。

其中,高级控制定时器的功能最为强大,可以实现所有其他定时器的所有功能。TrailBreaker开发板使用的是高容量的STM32F103ZE,因此有两个高级控制定时器TIM1和TIM8。下面我们就着重介绍这两个高级控制定时器。

TIM1和TIM8简介高级控制定时器(TIM1和TIM8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、PWM、嵌入死区时间的互补PWM等)。使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。
关于实验中用到的LED部分原理图和GPIO跑马灯实验所用到的相同,在此不再多做介绍。
TIM1和TIM8定时器的功能包括:
16位向上、向下、向上/下自动装载计数器
16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
多达4个独立通道: ─ 输入捕获 ─ 输出比较 ─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出
死区时间可编程的互补输出
使用外部信号控制定时器和定时器互联的同步电路
允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器
刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态
如下事件发生时产生中断/DMA:
─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
─ 输入捕获
─ 输出比较
─ 刹车信号输入
支持针对定位的增量(正交)编码器和霍尔传感器电路
触发输入作为外部时钟或者按周期的电流管理

高级定时器框图和时钟简介

如框图中的红框所示,红框中的部分,也是时基单元(Time-baseunit),对时基单元进行设置,就可以完成基础的定时器的使用设置。
计数器时钟可由下列时钟源提供:
● 内部时钟(CK_INT)
● 外部时钟模式1:外部输入引脚
● 外部时钟模式2:外部触发输入ETR
●内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器。如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。详见数据手册的通用定时器部分。

内部时钟源(CK_INT):如果禁止了从模式控制器(SMS=000),则CEN、DIR(TIMx_CR1寄存器)和UG位(TIMx_EGR寄存器)是事实上的控制位,并且只能被软件修改(UG位仍被自动清除)。只要CEN位被写成’1’,预分频器的时钟就由内部时钟CK_INT提供。下图显示控制电路和向上计数器在一般模式下,不带预分频器时的操作。

外部时钟源模式1当TIMx_SMCR寄存器的SMS=111时,此模式被选中。计数器可以在选定输入端的每个上升沿或下降沿计数。下图为TI2外部时钟连接例子

例如,要配置向上计数器在T12输入端的上升沿计数,使用下列步骤:
1.配置TIMx_CCMR1寄存器CC2S=01
2.配置通道2检测TI2输入的上升沿
3.配置TIMx_CCMR1寄存器的IC2F[3:0],选择输入滤波器带宽(如果不需要滤波器,保持IC2F=0000)
4.配置TIMx_CCER寄存器的CC2P=0,选定上升沿极性
5.配置TIMx_SMCR寄存器的SMS=111,选择定时器外部时钟模式1
6.配置TIMx_SMCR寄存器中的TS=110,选定TI2作为触发输入源
7.设置TIMx_CR1寄存器的CEN=1,使能计数器
注: 捕获预分频器不用作触发,所以不需要对它进行配置
当上升沿出现在TI2,计数器计数一次,且TIF标志被设置。在TI2的上升沿和计数器实际时钟之间的延时,取决于在TI2输入端的重新同步电路。
下图为外部时钟模式1下的控制电路

外部时钟源模式2选定此模式的方法为:令TIMx_SMCR寄存器中的ECE=1。
计数器能够在外部触发ETR的每一个上升沿或下降沿计数。
下图是外部触发输入的框图

设置从模式控制寄存器的ETP位选择选择是用ETR还是ETR的反相来作为触发操作
例如,要配置在ETR下每2个上升沿计数一次的向上计数器,使用下列步骤:
1.本例中不需要滤波器,置TIMx_SMCR寄存器中的ETF[3:0]=0000
2.设置预分频器,置TIMx_SMCR寄存器中的ETPS[1:0]=01
3.选择ETR的上升沿检测,置TIMx_SMCR寄存器中的ETP=0
4.开启外部时钟模式2,写TIMx_SMCR寄存器中的ECE=1
5.启动计数器,写TIMx_CR1寄存器中的CEN=1
计数器在每2个ETR上升沿计数一次。
在ETR的上升沿和计数器实际时钟之间的延时取决于在ETRP信号端的重新同步电路。
下图为外部时钟模式2下的控制电路


如图,该图为STM32的时钟树,结合高级控制定时器框图,我们可以看出,高级定时器的时钟不是直接来自APB2,而是来自于输入为APB2的一个倍频器。
当APB2的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB2的频率;当APB2的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个分频器起作用,定时器的时钟频率等于APB2的频率相应倍数。
假定AHB=36MHz,因为APB2允许的最大频率为72MHz,所以APB2的预分频系数可以取任意数值;当预分频系数=1时,APB2=72MHz,TIM1和TIM8的时钟频率=72MHz(分频器不起作用);当预分频系数=2时,APB1=36MHz,在倍频器的作用下,TIM1和TIM8的时钟频率=72MHz。
有人会问,既然需要TIM1和TIM8的时钟频率为72MHz,为什么不直接取APB2的预分频系数=1?答案是:APB2不但要为TIM1和TIM8提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM1和TIM8仍能得到较高的时钟频率。
再举个例子:当AHB=72MHz时,APB2因为其他设备需要,时钟为36MHZ,因为这个倍频器,TIM1和TIM8仍然能够得到72MHz的时钟频率。能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。
继承事业,薪火相传
返回列表