在定时器的框图(STM32F4xx中文参考手册 330页)中我们可以看到,有些寄存器框图底下带了阴影。
这些带了阴影的寄存器表示该寄存器存在影子寄存器,这些有阴影的寄存器在物理上对应了两个寄存器,一个是开放出来给程序员可以写入和读出的预装载寄存器(preloadregister),比如ARR寄存器;另一个并没有开放出来,即程序员看不见的、但在操作中真正起作用的影子寄存器(shadowregister)。
关于有阴影的寄存器,图例中有做了以下说明:
设计预装载寄存器 (preloadregister) 和影子寄存器 (shadowregister)的好处:
每次发生更新事件(UEV)时,所有真正起作用的影子寄存器(shadowregister)可以同时被更新为预装载寄存器 (preloadregister)里面的值,这样可以保证多个通道的操作能够准确同步;如果没有影子寄存器(shadowregister),或者预装载寄存器 (preloadregister) 和影子寄存器 (shadowregister)是直通的,当软件更新了预装载寄存器 (preloadregister),也就立即更新了影子寄存器 (shadowregister),由于软件不能同时更新多个影子寄存器,这就会导致多个通道的时序不能同步。
在定时器中,有阴影的寄存器如下:
- PSC(Prescaler)
- ARR(AutoReloadRegister)
- CCR(Capture/Comparex Register)
以ARR寄存器为例分析:
在芯片手册中有介绍到:自动重载寄存器是预装载的。对自动重载寄存器执行写入或读取操作时会访问预装载寄存 器。预装载寄存器的内容既可以直接传送到影子寄存器,也可以在每次发生更新事件 (UEV) 时传送到影子寄存器,这取决于 TIMx_CR1 寄存器中的自动重载预装载使能位 (ARPE)。当 计数器达到上溢值(或者在递减计数时达到下溢值)并且 TIMx_CR1 寄存器中的 UDIS 位为 0 时,将发送更新事件。该更新事件也可由软件产生。
也就是说TIMx_CR1寄存器中的 ARPE 位可以控制ARR寄存器的预装载寄存器中的内容更新到影子寄存器中的时间节点; TIMx_CR1 寄存器中的 UDIS 位控制当产生上溢/下溢时,是否发送更新事件。
- 计数器时序图,ARPE=0 时更新事件(TIMx_ARR 未预装载)。
从上述时序图中可看出,计数模式为向上计数,当配置ARR寄存器为未预装载时,在计数器的计数值达到0x36前,往TIMx_ARR寄存器中写入新值,就会在计数到0x36时产生上溢动作。
- 计数器时序图,ARPE=1 时更新事件(TIMx_ARR 预装载)
从上述时序图中可看出,计数模式为向上计数,当配置ARR寄存器为预装载时,在计数器的计数值达到0x36前,就把自动重载预装载寄存器修改为0x36,就不会在计数到0x36时产生动作,会在产生更新事件(UEV)时才将自动重载预装载寄存器值赋给自动重载影子寄存器。
从预装载寄存器ARR传送到影子寄存器,有两种方式,一种是立刻更新,一种是等触发事件之后更新;这两种方式主要取决于寄存器TIMx->CR1中的“ARPE”位;
-
ARPE=0,当ARR值被修改时,同时马上更新影子寄存器的值;
-
ARPE=1,当ARR值被修改时,必须在下一次事件UEV发生后才能更新影子寄存器的值
ARR寄存器工作模式如下: