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

【经验分享】STM32 影子寄存器

[复制链接]
STMCU小助手 发布时间:2022-4-18 09:37
01、概述1 d) t* J9 x" v5 |; c4 w  t
在定时器框图中,有个小细节,有些寄存器下有个阴影
7 ?- T) v) t$ K4 P! m
0 D8 s8 g& s+ q) k; { aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlZySEZiSzl0QzFhY2N2MTJ5.png
/ d" R2 {7 A2 P- \# b/ T9 y
. d6 K! B3 g: [- G有这些阴影的表示这些寄存器存在影子寄存器。* ~8 U+ A% m  Q+ n" H
9 d& l, |. W/ F$ A+ I6 E! W
在图例中也有对影子寄存器的说明:; J2 e2 f  s3 N0 j& g0 I" q' n9 y( H

8 z) _2 Z& y0 W0 d aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlZySEZiSzl0QzFhY2N2MTJ5.png & l$ o& x6 P: N1 y' R9 m  O
  I" U/ ^4 Y/ s2 A4 D1 S+ w
根据控制位,在发生U事件后,预装载寄存器内容转移到有效寄存器。这也就是对影子寄存器的说明。7 z: ?( @7 A4 N: m' C

; [3 {- s, p+ W/ w9 e* y有阴影的寄存器(AutoReloadRegister),表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preloadregister(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadowregister(影子寄存器)。2 @3 g* y& P8 e6 k) j
* G9 S% T/ w% N8 b, K
这里有3个寄存器名称% N8 U; o. \) ^) s; {/ K( v
, K" P) Z6 w- J6 W" ]4 M2 Y! j9 }
AutoReloadRegister。0 W) U3 _6 w  R7 D

+ m: C" S4 M# h* p3 hpreloadregister。) f) `: m' O, j# U2 Y' p, g
, c/ q. ~$ |! p+ C
shadowregister。
8 ]% O3 E) k! M/ b( O' M$ X' _, P6 E0 j7 I4 Z: x; l2 Q
在这里我的理解是,AutoReloadRegister自动重装载寄存器是一个概念寄存器,可以在寄存器表中找到每一位的定义,它是由preloadregister预装载寄存器和shadowregister影子寄存器组成。我们用户能接触到,能修改或读取的都是预装载寄存器,ST只是把它们开放出来(影子寄存器并没有开放给用户),其实就是ARR寄存器。/ k1 a5 w% D* q; |" w4 `! S

4 ~( d* y0 ?- q1 k- l$ @; y* D设计preloadregister和shadowregister的好处是:: ]" w" {+ D7 z6 T# H6 ^

5 z9 ?$ s0 o: L! p: F所有真正需要起作用的寄存器(shadowregister)可以在同一个时间(发生更新事件时)被更新为所对应的preloadregister的内容,这样可以保证多个通道的操作能够准确地同步。如果没有shadowregister,或者preloadregister和shadowregister是直通的,即软件更新preloadregister时,同时更新了shadowregister,因为软件不可能在一个相同的时刻同时更新多个寄存器,结果造成多个通道的时序不能同步,如果再加上其它因素(例如中断),多个通道的时序关系有可能是不可预知的。8 c  V0 E! V- q2 ?
, X! _) |8 F; F2 U1 j. H0 \% O
看到有阴影寄存器共三种:
: D( Q8 ^) g9 J8 H# E5 a" h; {
! h8 Y. ]/ M; S8 Y+ j2 H7 K+ T1、PSC(Prescaler)+ n4 P$ E( N$ N) Q6 H5 ]6 L( q
8 o! i/ ]5 t- K! k
2、ARR(AutoReloadRegister)8 l; t4 v8 R9 g( g
7 j# z* E2 ^: ]9 m
3、CCR(Capture/Comparex Register)
9 t! o3 F* r2 |2 w0 i1 A. e" G
- ^2 u6 v6 _0 c4、REPRegister% d! r4 r) R* d& D7 _
9 S0 s$ q' Y3 V( r7 _/ c
02、PSC(Prescaler)
% x/ h& h& M' k, e, L8 r" f- A% [) Z7 w: e在预分频器的描述中:: b& a3 \3 W2 q8 \: J$ G
' a" N) |0 o) a& u; c+ q
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.7 w6 \2 T/ G+ P* F  f; l# l4 r

; \9 n- [8 p% E6 R5 G' B3 _节选自STM32F207 Reference manual手册; s/ v# a$ ?0 E* u/ h/ {

7 l: w1 |' Z4 }# c2 W! j# w由于该控制寄存器具有缓冲功能,因此可对预分频器进行实时更改。而新的预分频比将在下一更新事件发生时被采用。
  ~4 ^1 b! o3 U3 s& f3 |$ ?1 ?) `' r' \( |, v% h" R
预分频器分频由1 变为2 时的计数器时序图
/ s6 r$ Z! y9 j# }6 g0 s1 }
% e" [8 A9 ^  X7 W; g, ~: R/ ^0 o1 t' b& N aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlZySEZiSzl0QzFhY2N2MTJ5.png
% |" p& }( \7 C6 s( Y, I) C& y; H* w6 n# x
在这里看到预分频器寄存器存在影子寄存器,但是没有控制位控制它,它的预装载寄存器和影子寄存器是相连的。
2 c# h0 @) X* ?  d& V
4 H6 [, Y$ c& ~4 T工作模式如下图:/ m" d3 m4 A/ D# M

6 b  D0 q7 C2 T6 Y( ~$ l, u8 a aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlZySEZiSzl0QzFhY2N2MTJ5.png
! q6 i) l5 Z9 ]5 Q  w) A5 ?$ G6 \* e3 V$ j9 M2 A0 _7 j
注意:5 p# f& W+ S) I" @

4 P8 @- ?$ k& X- ^2 `在ST的手册中,影子寄存器被描述成缓冲,在对预分频器的影子寄存器描述成寄存器具有缓冲功能。其中4 k: K- W+ E7 \- H
$ I0 }+ d' r& k. L; c( G2 ~" R
aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlZySEZiSzl0QzFhY2N2MTJ5.png 2 m' Y& S. Z) L" L  n" u4 V

1 i+ z5 L) j: b$ J$ [5 L7 k在这里又被描述成TIMx_ARR寄存器不进行缓冲。* V* x1 |, ^0 m: u
3 i/ {$ \: ^  a/ X  Y. _  T
03、ARR(AutoReloadRegister)7 u' R* A. m* w+ J% }
控制位:8 M5 b. G$ j9 t% B% @% K
5 V5 v/ \& n3 f& G! Q
在时基单位中有说明如下
( P( W0 H# R9 r- K4 p9 a: g* @9 Q. z
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.
, M+ g# a1 q: ^, ?/ I$ Q
( z! I# u2 m! J- [" P1 D节选自STM32F207 Reference manual手册5 O7 c7 P7 ~- S4 i
/ N5 P0 ?8 H2 z) K$ H
预装载寄存器的内容既可以直接传送到影子寄存器,也可以在每次发生更新事件(UEV)时传送到影子寄存器,这取决于TIMx_CR1 寄存器中的自动重载预装载使能位(ARPE)。, p9 c+ p% R7 Y
$ U8 ]' }! U& r' W: _0 k* X
也就是TIMx_CR1的ARPE位决定了预装寄存器数据传入影子寄存器的时间先后顺序。: a1 ~. c  _) z) m& G' X
8 x& m& p6 B, E% ]
计数器时序图,ARPE=0 时更新事件(TIMx_ARR 未预装载)。* {2 A- C& e+ K- k( \
* E, w. o8 p$ G9 X  N  j
aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlZySEZiSzl0QzFhY2N2MTJ5.png * ^7 M6 m( S( ~
6 ], v0 t0 e- R/ v
从上面两图看出,向上计数,还没有到达0x36,就把自动重载寄存器修改为0x36,就会在计数到0x36时产生动作。
4 b7 V! [+ [; l3 h8 v& i
" r3 ]/ t' y/ q6 @计数器时序图,ARPE=1 时更新事件(TIMx_ARR 预装载)。$ M! F4 {' K  t# X

3 I4 Q( t" |/ g1 x6 K" p$ E2 c+ M aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlZySEZiSzl0QzFhY2N2MTJ5.png " z$ |- j. Q0 C% s4 K
4 l% }8 H( P1 C' |
从上面两图看出,向上计数,还没有到达0x36,就把自动重载预装载寄存器修改为0x36,就不会在计数到0x36时产生动作,会在这个时将自动重载预装载寄存器值赋给自动重载影子寄存器。
6 |7 ]: n! E& x9 k$ F, f8 Y
2 ]' B8 l% v# {  X% w从预装载寄存器ARR传送到影子寄存器,有两种方式,一种是立刻更新,一种是等触发事件之后更新;这两种方式主要取决于寄存器TIMx->CR1中的“ARPE”位;& b4 `; |# {' c1 T9 K

! S4 ]. U& Q$ z1 i4 z8 a% y6 IARPE=0,当ARR值被修改时,同时马上更新影子寄存器的值;
" c; K2 I* t- o
5 b/ T5 n0 S- }; aARPE=1,当ARR值被修改时,必须在下一次事件UEV发生后才能更新影子寄存器的值;. P# i" c/ D' ]4 e5 J6 ^
* m" Q' M  w5 @  |2 C- k
怎么样马上立刻更改影子寄存器的值,而不是下一个事件;方法如下3 H# h. x7 g( \$ |, a

3 r  ?; f/ H! f5 _7 m. ^6 E1、将ARPE=0。
  1. TIM_ARRPreloadConfig(ch1_Master_Tim,  DISABLE );
复制代码
8 S) i9 J. w: v( X4 _
2、在ARPE=1。
5 l, ?7 n* |& y1 U& H* e  p* H0 }& U
  1. TIM_ARRPreloadConfig(ch1_Master_Tim,  ENABLE);
复制代码

7 d: D4 c, z% t* q) Q) o5 o我们更改完预装载寄存器后,立刻设置UEV事件,即更改EGR寄存的UG位,如下
: B' {8 G+ X9 p2 {. w% q2 l* y% v* Q& W; w7 z: ^
  1. TIM1->ARR   =    period-1;    //设置周期  ^, a! Y. O5 a
  2. TIM1->CCR1  =    period>>1;  //设置占空比50%  `3 d8 {9 {( t, ?3 X* X3 D
  3. TIM_GenerateEventTIM1,TIM_EventSource_Update);//主动发生UEV事件,UG=1
复制代码
7 N, n1 b! M* Y& v, F% O$ _
工作模式如下图:
9 e9 R" W9 r3 q  q; R
/ U9 c; E' G/ X9 N+ I3 }8 D" g aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlZySEZiSzl0QzFhY2N2MTJ5.png
4 u3 W' L7 C+ X# D2 ^' y* j, r& D9 D. ^% t; T* w, r
04、CCR(Capture/Comparex Register)
% S( _& V" P) f% `. q% p0 c5 f还有计数器模式中有文字说明:/ Z& R  a4 }& H' C
! ]) e/ N1 a& v& m
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。
  n, y  m# I; `6 }3 L( Q" p: p  R3 w4 z# j
节选自STM32F207 Reference manual手册
' O. a5 D0 \% z; R
/ A0 n9 i3 M2 C5 s- Q' c通过软件将TIMx_CR1寄存器中的UDIS位置1可禁止更新事件UEV事件。这可避免向预装载寄存器写入新值时更新影子寄存器。
  _/ J0 J( `; G, d4 e/ r) g+ C/ i; Y
也就是TIMx_CR1寄存器中UDIS位间接决定了预装寄存器数据是否传入影子寄存器。% @9 ^( t" E0 H( q/ O8 c

4 a) J+ f: L* i
& F+ y- E4 [3 B
赞 收藏 评论0 发布时间:2022-4-18 09:37

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版