一、前言
在学习Cube时发现有一个参数auto-reload preload,在实验的时候感受不到设置成Enable和Disable有什么不同,所以查看开发手册了解有什么区别。在这里把学习心得分享给大家。
影子寄存器是真正发挥作用的寄存器,我们修改PSC、ARR都是在操作预装载寄存器,需要根据相关控制位决定是否立即生效或是等待更新事件发生生效。
关键词:影子寄存器、预分频器、预装载寄存器
二、影子寄存器介绍
2.1影子寄存器
影子寄存器在框图表示上下面有一个阴影。这表示在物理上这个寄存器对应2个寄存器:一个是我们可以写入或读出的寄存器,称为预装载寄存器,另一个是我们看不见的、无法真正对其读写操作的,但在使用中真正起作用的寄存器,称为影子寄存器.
数据手册介绍预装载寄存器的内容可以随时传送到影子寄存器,即两者是连通的(permanently),或者在每一次更新事件(UEV)时才把预装载寄存器的内容传送到影子寄存器。
2.2影子寄存器有什么好处?
设计预装载寄存器和影子寄存器的好处是,所有真正需要起作用的寄存器(影子寄存器)可以在
同一个时间(发生更新事件时)被更新为所对应的预装载寄存器的内容
,这样可以保证多个通道的操作能够准确地同步
。如果没有影子寄存器,软件更新预装载寄存器时,则同时更新了真正操作的寄存器
,因为软件不可能在一个相同的时刻同时更新多个寄存器,结果造成多个通道的时序不能同步,如果再加上例如中断等其它因素,多个通道的时序关系有可能会混乱,造成是不可预知的结果。
这部分引用自这位博主写的影子寄存器
三、基本定时器框图解读
预分频器和自动重载寄存器有一个阴影,那个阴影就是手册里面说的
影子寄存器
。当你启用缓冲功能后,你修改PSC(分频系数)和ARR(计数寄存器)的值不会立马生效,而是当更新事件触发
后修改的值才会生效,生效的值会被传递到影子寄存器中。
3.1关闭预装载(ARPE=0)
当ARPE=0时,在这里可以看到自动重载寄存器值发生改变后,自动重载影子寄存器的值立马发生改变,也就是没有预先的过程,而是直接装载。(手册里面没有画自动重载影子寄存器,我这里补画了一个。)
3.2启用预装载(ARPE=1)
当ARPE=1时,自动重载寄存器的值发生改变后,自动重载
影子
寄存器的值并没有马上发生改变,而是等到本次时钟周期结束,也就是定时器发生更新事件(计数器的值到达上次设定的值)后才发生改变。
总结来说,ARPE=1时就像手机卡套餐一样,本月修改,下个月生效。 ARPE=0时,就是立马生效,就比如流量加油包。
四、如果不开启会有什么问题?
假设现在ARR=0xFF,计数器的值为0x36,这时如果突然将ARR改为0x40。那么ARPE=0 or 1会有什么区别?
当ARPE=0时,由于ARR的影子寄存器的值马上被修改为0x40,所以在来4个时钟信号,就会发生定时中断。
当ARPE=1时,ARR不会马上把值传递到影子寄存器,而是等待计数器到达0xFF后再将值传递过去。也就是必须先完成本次计数周期才能更改定时器的时钟周期。不会出现一个计数周期不是0xFF又不是0x40的情况。
这只是一个细节问题,我在应用的时候并没有因为这个细节出现什么大问题。可能是我没有经常修改ARR,感受不到区别。