你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 影子寄存器

[复制链接]
STMCU 发布时间:2020-9-10 09:57
01 概述

在定时器框图中,有个小细节,有些寄存器下有个阴影
1.png

有这些阴影的表示这些寄存器存在影子寄存器。

在图例中也有对影子寄存器的说明:
2.png

根据控制位,在发生U事件后,预装载寄存器内容转移到有效寄存器。这也就是对影子寄存器的说明。

有阴影的寄存器(AutoReloadRegister),表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preloadregister(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadowregister(影子寄存器)。

这里有3个寄存器名称
  • AutoReloadRegister。
  • preloadregister。
  • shadowregister。


在这里我的理解是,AutoReloadRegister自动重装载寄存器是一个概念寄存器,可以在寄存器表中找到每一位的定义,它是由preloadregister预装载寄存器和shadowregister影子寄存器组成。我们用户能接触到,能修改或读取的都是预装载寄存器,ST只是把它们开放出来(影子寄存器并没有开放给用户),其实就是ARR寄存器。

设计preloadregister和shadowregister的好处是:

所有真正需要起作用的寄存器(shadowregister)可以在同一个时间(发生更新事件时)被更新为所对应的preloadregister的内容,这样可以保证多个通道的操作能够准确地同步。如果没有shadowregister,或者preloadregister和shadowregister是直通的,即软件更新preloadregister时,同时更新了shadowregister,因为软件不可能在一个相同的时刻同时更新多个寄存器,结果造成多个通道的时序不能同步,如果再加上其它因素(例如中断),多个通道的时序关系有可能是不可预知的。


看到有阴影寄存器共三种:
1、PSC(Prescaler)
2、ARR(AutoReloadRegister)
3、CCR(Capture/Comparex Register)
4、REPRegister

02 PSC(Prescaler)
在预分频器的描述中:

It is based on a 16-bit counter controlled through a 16-bit register(in the TIMx_PSC register).It can be changed on the fly as thiscontrol register is buffered. The new prescaler ratio is taken intoaccount at the next update event.

节选自STM32F207 Reference manual手册

由于该控制寄存器具有缓冲功能,因此可对预分频器进行实时更改。而新的预分频比将在下一更新事件发生时被采用。
预分频器分频由1 变为2 时的计数器时序图

3.png

在这里看到预分频器寄存器存在影子寄存器,但是没有控制位控制它,它的预装载寄存器和影子寄存器是相连的。
工作模式如下图:

4.png

注意:
在ST的手册中,影子寄存器被描述成缓冲,在对预分频器的影子寄存器描述成寄存器具有缓冲功能。其中

5.png

在这里又被描述成TIMx_ARR寄存器不进行缓冲。

03 ARR(AutoReloadRegister)
控制位:

在时基单位中有说明如下

The content of the preload register are transferred into theshadowregister permanently or at each update event (UEV), depending on theauto-reloadpreload enable bit (ARPE) in TIMx_CR1 register.节选自STM32F207 Reference manual手册
预装载寄存器的内容既可以直接传送到影子寄存器,也可以在每次发生更新事件(UEV)时传送到影子寄存器,这取决于TIMx_CR1 寄存器中的自动重载预装载使能位(ARPE)。

也就是TIMx_CR1的ARPE位决定了预装寄存器数据传入影子寄存器的时间先后顺序。

计数器时序图,ARPE=0 时更新事件(TIMx_ARR 未预装载)。

6.png

从上面两图看出,向上计数,还没有到达0x36,就把自动重载寄存器修改为0x36,就会在计数到0x36时产生动作。
计数器时序图,ARPE=1 时更新事件(TIMx_ARR 预装载)。

7.png

从上面两图看出,向上计数,还没有到达0x36,就把自动重载预装载寄存器修改为0x36,就不会在计数到0x36时产生动作,会在这个时将自动重载预装载寄存器值赋给自动重载影子寄存器。

从预装载寄存器ARR传送到影子寄存器,有两种方式,一种是立刻更新,一种是等触发事件之后更新;这两种方式主要取决于寄存器TIMx->CR1中的“ARPE”位;

  • ARPE=0,当ARR值被修改时,同时马上更新影子寄存器的值;
  • ARPE=1,当ARR值被修改时,必须在下一次事件UEV发生后才能更新影子寄存器的值;


怎么样马上立刻更改影子寄存器的值,而不是下一个事件;方法如下
1、将ARPE=0。
  1. TIM_ARRPreloadConfig(ch1_Master_Tim,  DISABLE );
复制代码

2、在ARPE=1。
  1. TIM_ARRPreloadConfig(ch1_Master_Tim,  ENABLE);
复制代码


我们更改完预装载寄存器后,立刻设置UEV事件,即更改EGR寄存的UG位,如下


  1. TIM1->ARR   =    period-1;    //设置周期
  2. TIM1->CCR1  =    period>>1;  //设置占空比50%
  3. TIM_GenerateEventTIM1,TIM_EventSource_Update);//主动发生UEV事件,UG=1
复制代码


工作模式如下图:
8.png

04 CCR(Capture/Comparex Register)
还有计数器模式中有文字说明:

The UEV event can be disabled by software by setting the UDIS bit inthe TIMx_CR1 register. This is to avoid updating the shadow registerswhile writing new values in the preload registers。
节选自STM32F207 Reference manual手册

通过软件将TIMx_CR1寄存器中的UDIS位置1可禁止更新事件UEV事件。这可避免向预装载寄存器写入新值时更新影子寄存器。

也就是TIMx_CR1寄存器中UDIS位间接决定了预装寄存器数据是否传入影子寄存器。



收藏 1 评论0 发布时间:2020-9-10 09:57

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版