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

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

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

高级定时器寄存器简介可编程高级控制定时器的主要部分是一个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 fromthe auto-reload register accesses the preload register. The contentof the preload register are transferred into the shadow registerpermanently or at each update event (UEV), depending on theauto-reload preload enable bit (ARPE) in TIMx_CR1 register. Theupdate event is sent when the counter reaches the overflow (orunderflow when downcounting) and if the UDIS bit equals 0 in theTIMx_CR1 register. It can also be generated by software. Thegeneration of the update event is described in detailed for eachconfiguration.
在图中的,表示对应寄存器的影子寄存器可以在发生更新事件时,被更新为它的预装载寄存器的内容;而图中的部分,表示对应的自动重载寄存器可以产生一个更新事件(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位)也被设置。
● 重复计数器被重置为TIMx_RCR寄存器中的内容
● 预分频器的缓存器被加载为预装载(TIMx_PSC寄存器)的值。
●当前的自动加载寄存器被更新为预装载值(TIMx_ARR寄存器中的内容)。注:如果因为计数器溢出而产生更新,自动重装载将在计数器重载入之前被更新,因此下一个周期将是预期的值(计数器被装载为新的值)。
下面是一些计数器在不同时钟频率下的操作的例子:
内部时钟分频因子为1,TIMx_ARR=0x6时的计数器时序图:

内部时钟分频因子为2时的计数器时序图:

内部时钟分频因子为4,TIMx_ARR=0x36时的计数器时序图:

注:在此无论是中心对齐模式2或3都是在溢出时与UIF标志一起使用
内部时钟分频因子为N,计数器时序图如下:

ARPE=1时的更新事件(计数器下溢),计数器时序图如下:

计数器寄存器各位的描述如下:

位15:0 ARR[15:0]: 自动重装载的值 (Prescaler value)
ARR包含了将要装载入实际的自动重装载寄存器的值。 详细参考数据手册13.3.1节:有关ARR的更新和动作。当自动重装载的值为空时,计数器不工作。
继承事业,薪火相传
返回列表