您的位置 首页 电源

STM32定时器详解 —–影子寄存器,预装寄存器

定时器在STM32F10xxx系列的32位MCU上,定时器资源十分丰富,包括高级控制定时器,通用定时器和基本定时器。此外,还有能够实现定时功能的系

守时器

在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=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的时钟频率。能够运用更高的时钟频率,无疑提高了守时器的分辨率,这也正是规划这个倍频器的初衷。
高档守时器寄存器简介
可编程高档操控守时器的首要部分是一个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)。
PSC的值保存在预分频寄存器的预装载寄存器中,在每次更新事情时加载至影子寄存器.
3.计数器寄存器
高档守时器计数形式:在向上计数形式中,计数器从0计数到主动加载值(TIMx_ARR计数器的内容),然后从头从0开端计数而且产生一个计数器溢出事情。
假如运用了重复计数器功用,在向上计数到达设置的重复计数次数(TIMx_RCR)时,产生更新事情(UEV);不然每次计数器溢出时才产生更新事情。
在事情产生寄存器寄存器中(经过软件方法或许运用从形式操控器)设置UG位也相同能够产生一个更新事情。 设置TIMx_CR1寄存器中的UDIS位,能够制止更新事情;这样能够防止在向预装载寄存器中写入新值时更新影子寄存器。在UDIS位被清’0’之前,将不产生更新事情。但是在应该产生更新事情时,计数器仍会被清’0’,一起预分频器的计数也被请0(但预分频器的数值不变)。此外,假如设置了TIMx_CR1寄存器中的URS位(挑选更新恳求),设置UG位将产生一个更新事情UEV,但硬件不设置UIF标志(即不产生中止或DMA恳求)。这是为了防止在捕获形式下铲除计数器时,一起产生更新和捕获中止。
当产生一个更新事情时,一切的寄存器都被更新,硬件一起(依据URS位)设置更新标志位(TIMx_SR寄存器中的UIF位)。
● 重复计数器被从头加载为TIMx_RCR寄存器的内容。
● 主动装载影子寄存器被从头置入预装载寄存器的值(TIMx_ARR)。
● 预分频器的缓冲区被置入预装载寄存器的值(TIMx_PSC寄存器的内容)。
下面给出一些比如,当TIMx_ARR=0x36时计数器在不一起钟频率下的动作。
内部时钟分频因子为1 时的计数器时序图如下:
内部时钟分频因子为2 时的计数器时序图如下:
内部时钟分频因子为4时的计数器时序图如下:
内部时钟分频因子为N时的计数器时序图如下:
当ARPE=0时的更新事情(TIMx_ARR没有预装入) 时的计数器时序图如下:
当ARPE=1时的更新事情(TIMx_ARR预装入) 时的计数器时序图如下:
在向下形式中,计数器从主动装入的值(TIMx_ARR计数器的值)开端向下计数到0,然后从主动装入的值从头开端而且产生一个计数器向下溢出事情。
假如运用了重复计数器,当向下计数重复了重复计数寄存器(TIMx_RCR)中设定的次数后,将产生更新事情(UEV),不然每次计数器下溢时才产生更新事情。
在TIMx_EGR寄存器中(经过软件方法或许运用从形式操控器)设置UG位,也相同能够产生一个更新事情。
设置TIMx_CR1寄存器的UDIS位能够制止UEV事情。这样能够防止向预装载寄存器中写入新值时更新影子寄存器。因而UDIS位被清为0之前不会产生更新事情。但是,计数器仍会从当时主动加载值从头开端计数,而且预分频器的计数器从头从0开端(但预分频系数不变)。
此外,假如设置了TIMx_CR1寄存器中的URS位(挑选更新恳求) ,设置UG位将产生一个更新事情UEV但不设置UIF标志(因而不产生中止和DMA恳求),这是为了防止在产生捕获事情并铲除计数器时,一起产生更新和捕获中止。
当产生更新事情时,一切的寄存器都被更新,而且(依据URS位的设置)更新标志位(TIMx_SR寄存器中的UIF位)也被设置。
● 重复计数器被重置为TIMx_RCR寄存器中的内容
● 预分频器的缓存器被加载为预装载的值(TIMx_PSC寄存器的值)。
● 当时的主动加载寄存器被更新为预装载值(TIMx_ARR寄存器中的内容)。
注:主动装载在计数器重载入之前被更新,因而下一个周期将是预期的值。
下面是一些当TIMx_ARR=0x36时,计数器在不一起钟频率下的动作。
内部时钟分频因子为1 时的计数器时序图如下:
内部时钟分频因子为2 时的计数器时序图如下:
内部时钟分频因子为4时的计数器时序图如下:
内部时钟分频因子为N时的计数器时序图如下:
当没有运用重复计数器时的更新事情时的计数器时序图:
中心对齐形式(up/down counting) 在中心对齐形式,计数器从0开端计数到主动加载的值(TIMx_ARR寄存器)−s211,产生一个计数器溢出事情,然后向下计数到1而且产生一个计数器下溢事情;然后再从0开端从头计数。
在此形式下,不能写入TIMx_CR1中的DIR方向位。它由硬件更新并指示当时的计数方向。
能够在每次计数上溢和每次计数下溢时产生更新事情;也能够经过(软件或许运用从形式操控器)设置TIMx_EGR寄存器中的UG位产生更新事情。然后,计数器从头从0开端计数,预分频器也从头从0开端计数。
设置TIMx_CR1寄存器中的UDIS位能够制止UEV事情。这样能够防止在向预装载寄存器中写入新值时更新影子寄存器。因而UDIS位被清为0之前不会产生更新事情。但是,计数器仍会依据当时主动重加载的值,持续向上或向下计数。 此外,假如设置了TIMx_CR1寄存器中的URS位(挑选更新恳求) ,设置UG位将产生一个更新事情UEV但不设置UIF标志(因而不产生中止和DMA恳求),这是为了防止在产生捕获事情并铲除计数器时,一起产生更新和捕获中止。
当产生更新事情时,一切的寄存器都被更新,而且(依据URS位的设置)更新标志位(TIMx_SR寄存器中的UIF位)也被设置。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/258397.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部