
定时器的相关寄存器.docx
11页定时器在 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-base unit),对时基单元进行设置,就可以完成基础的定时器的使用设置。
计数器时钟可由下列时钟源提供:● 内部时钟(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=012.配置通道 2 检测 TI2 输入的上升沿3.配置 TIMx_CCMR1 寄存器的 IC2F[3:0],选择输入滤波器带宽(如果不需要滤波器,保持 IC2F=0000)4.配置 TIMx_CCER 寄存器的 CC2P=0,选定上升沿极性5.配置 TIMx_SMCR 寄存器的 SMS=111,选择定时器外部时钟模式 16.配置 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]=00002.设置预分频器,置 TIMx_SMCR 寄存器中的 ETPS[1:0]=013.选择 ETR 的上升沿检测,置 TIMx_SMCR 寄存器中的 ETP=04.开启外部时钟模式 2,写 TIMx_SMCR 寄存器中的 ECE=15.启动计数器,写 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 的时钟频率。
能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷高级定时器寄存器简介可编程高级控制定时器的主要部分是一个 16 位计数器和与其相关的自动装载寄存器这个计数器可以向上计数、向下计数或者向上向下双向计数此计数器时钟由预分频器分频得到 计数器、自动装载寄存器和预分频器寄存器可以由软件读写,即使计数器还在运行读写仍然有效时基单元,也就是决定了定时器的基本功能的模块包含:1.计数器寄存器(Counter register,简写为 TIMx_CNT)2.预分频器寄存器 (Prescaler register,简写为 TIMx_PSC)3.自动装载寄存器 (Auto-reload register,简写为 TIMx_ARR)4.重复次数寄存器 (Repetition counter register,简写为 TIMx_RCR)1.影子寄存器这张图是高级定时器框图的一部分,细心的人可以发现预分频器寄存器、自动重载寄存器和捕捉/比较寄存器下面有一个阴影,其他的寄存器有些也有阴影这表示在物理上这个寄存器对应 2 个寄存器:一个是我们可以可以写入或读出的寄存器,称为预装载寄存器,另一个是我们看不见的、无法真正对其读写操作的,但在使用中真正起作用的寄存器,称为影子寄存器.数据手册介绍预装载寄存器的内容可以随时传送到影子寄存器,即两者是连通的(permanently),或者在每一次更新事件(UEV)时才把预装载寄存器的内容传送到影子寄存器。
原文如下:The auto-reload register is preloaded. Writing to or reading from the auto-reload register accesses the preload register. The content of the preload register are transferred into the shadow register permanently or at each update event (UEV), depending on the auto-reload preload enable bit (ARPE) in TIMx_CR1 register. The update event is sent when the counter reaches the overflow (or underflow when downcounting) and if the UDIS bit equals 0 in the TIMx_CR1 register. It can also be generated by software. The generation of the update event is described in detailed for each configuration.在图中的,表示对应寄存器的影子寄存器可以在发生更新事件时,被更新为它的预装载寄存器的内容;而图中的部分,表示对应的自动重载寄存器可以产生一个更新事件(U)或更新事件中断(UI)。
设计预装载寄存器和影子寄存器的好处是,所有真正需要起作用的寄存器(影子寄存器)可以在同一个时间(发生更新事件时)被更新为所对应的预装载寄存器的内容,这样可以保证多个通道的操作能够准确地同步如果没有影子寄存器,软件更新预装载寄存器时,则同时更新了真正操作的寄存器,因为软件不可能在一个相同的时刻同时更新多个寄存器,结果造成多个通道的时序不能同步,如果再加上例如中断等其它因素,多个通道的时序关系有可能会混乱,造成是不可预知的结果2.预分频寄存器预分频器可以将计数器的时钟频率按 1 到 65536 之间的任意值分频它是基于一个在 TIMx_PSC 寄存器中的 16 位寄存器控制的 16 位计数器因为这个控制寄存器带有缓冲器,它能够在运行时被改变新的预分频器的参数在下一次更新事件到来时被采用下面给出了在预分频器运行时,更改计数器参数的例子当预分频器的参数从 1 变到 2 时,计数器的时序图如下:当预分频器的参数从 1 变到 4 时,计数器的时序图如下:预分频寄存器各位的描述如下:位 15:0 PSC[15:0]:预分频值计数器的时钟频率(CK_CNT)等于 fCK_PSC / (PSC[15:0] + 1)。












