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

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

[复制链接]
STMCU小助手 发布时间:2022-4-18 09:37
01、概述6 |( ]7 l4 }- F" v. [) k
在定时器框图中,有个小细节,有些寄存器下有个阴影
* ?+ e$ e3 Q4 X! r- D" H) S6 J$ h8 M$ Q2 F7 e, q$ T
aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlZySEZiSzl0QzFhY2N2MTJ5.png
1 N$ |* F9 f& U% |4 y2 S8 r: f6 }, ~
有这些阴影的表示这些寄存器存在影子寄存器。
5 j0 J  B  }$ _" ?2 {- b
; ^% z3 \0 }0 [. e' E+ d+ _在图例中也有对影子寄存器的说明:
" U) `5 J3 ]3 A8 ~6 C9 B! M' v9 G( A6 c
aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlZySEZiSzl0QzFhY2N2MTJ5.png
7 j7 R6 O3 p2 n& b2 A7 t0 z& @( t
$ l8 U& K6 L9 t6 P. ^根据控制位,在发生U事件后,预装载寄存器内容转移到有效寄存器。这也就是对影子寄存器的说明。% W# n& O. [6 D5 o$ S) G1 Y5 _
, s& q6 n0 g% A: Q! q& j7 [# o
有阴影的寄存器(AutoReloadRegister),表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preloadregister(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadowregister(影子寄存器)。( g. Y5 @, [% j; l
  S3 o3 O; M/ U. L
这里有3个寄存器名称
+ I+ C9 G( v6 w2 R5 N
: [* T9 S5 L0 D, }2 ~' {. zAutoReloadRegister。/ L% Q9 t& g- P  j) ^9 B
" H  Z  r, ~- h% ]2 U! z% {
preloadregister。
0 q' Q9 |1 _; _. O& S( `
* p: b: y) C" Q$ Ushadowregister。! ^- F) v- t: W( @4 x' ~# w( S& [
- ]  G- o0 s% f, b7 c
在这里我的理解是,AutoReloadRegister自动重装载寄存器是一个概念寄存器,可以在寄存器表中找到每一位的定义,它是由preloadregister预装载寄存器和shadowregister影子寄存器组成。我们用户能接触到,能修改或读取的都是预装载寄存器,ST只是把它们开放出来(影子寄存器并没有开放给用户),其实就是ARR寄存器。
# d0 j. n3 S& y: j- z9 g' q8 G4 X9 ]7 {. Y2 T6 U8 P8 q* H
设计preloadregister和shadowregister的好处是:
; W3 E  N' K) L0 _# ^5 C& u- v% d6 L
所有真正需要起作用的寄存器(shadowregister)可以在同一个时间(发生更新事件时)被更新为所对应的preloadregister的内容,这样可以保证多个通道的操作能够准确地同步。如果没有shadowregister,或者preloadregister和shadowregister是直通的,即软件更新preloadregister时,同时更新了shadowregister,因为软件不可能在一个相同的时刻同时更新多个寄存器,结果造成多个通道的时序不能同步,如果再加上其它因素(例如中断),多个通道的时序关系有可能是不可预知的。
- {4 C% ~( ~9 V0 H+ y+ \6 G8 @0 K9 `( U+ ^
看到有阴影寄存器共三种:  L9 H& D, C: y& j) A
0 u7 e- \( k! e5 T: m
1、PSC(Prescaler)
7 X1 S4 u' `. G) u& M/ J2 _  G* F1 X7 i; ]9 S! c# J
2、ARR(AutoReloadRegister)& b  ~7 s. W/ }  r8 u7 {+ ^& I
1 R' A* E3 @* x9 e& I* c  @
3、CCR(Capture/Comparex Register)( l5 |6 r! ^! w* Q; \

$ V: R+ r, i9 g" U9 O8 d: `- b4、REPRegister
& y% G" J: U- J( U. `- i1 Q4 f
( @# e4 o0 r$ v3 H& j# z02、PSC(Prescaler)
0 I/ B8 z5 d2 A  d1 f在预分频器的描述中:) n& A0 e0 d/ |7 y0 h7 D" p
8 _& c6 l% [( s5 f, ?% S$ K2 B
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.+ z" v* S% [8 ^7 {- F& l
( R/ w8 c9 F' t, c
节选自STM32F207 Reference manual手册
. o+ l5 w! y! W6 {! x9 i
/ {1 [; E2 k' Q2 L; k& W由于该控制寄存器具有缓冲功能,因此可对预分频器进行实时更改。而新的预分频比将在下一更新事件发生时被采用。
% u8 G9 E5 C- q
! t  b1 d8 H; X# T预分频器分频由1 变为2 时的计数器时序图2 U+ ~; t' V/ a$ f  |
3 ^! o8 j- f- N+ @! |$ B. A
aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlZySEZiSzl0QzFhY2N2MTJ5.png
2 R6 z) G2 R' Q$ V! Y7 ~! ^8 T, |2 s" z1 v
在这里看到预分频器寄存器存在影子寄存器,但是没有控制位控制它,它的预装载寄存器和影子寄存器是相连的。
0 a' m2 |3 p& q/ f7 g0 x8 E: p3 c- B7 I
工作模式如下图:( V$ H# G% w; K* u9 H( g
9 |% Z2 Q1 Z8 ]5 d
aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlZySEZiSzl0QzFhY2N2MTJ5.png
5 {0 o! V6 _# k! h* Z9 Q1 P
" }9 C8 h- Z5 F% `# k2 K' V" F+ Y注意:6 ]! F; Q: V7 K4 w7 H* u" O
: Q! B' T8 u) _2 ~$ W8 G
在ST的手册中,影子寄存器被描述成缓冲,在对预分频器的影子寄存器描述成寄存器具有缓冲功能。其中
+ R& G$ m2 z$ H5 l3 X+ D1 d7 N- F7 U1 g; S( j8 ?
aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlZySEZiSzl0QzFhY2N2MTJ5.png
5 f2 x: u! o  {- P4 r( l" O
# y1 f3 T6 W2 ?4 z- G在这里又被描述成TIMx_ARR寄存器不进行缓冲。" l( q# Y7 t5 n# H9 b
$ I* O* r4 A+ u
03、ARR(AutoReloadRegister)
0 }$ Q% R0 ?" g% Z" B5 M' f! p' Z控制位:+ {! G' v/ q& m" u0 \7 U6 P
3 e. ?5 y6 H% p+ ?: U2 x
在时基单位中有说明如下
3 f# I4 Z, }( j) g8 Z& d& }
' o" F6 e$ C/ m! F" o4 N$ t- bThe 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.
9 ^3 O) s9 i- g& C3 r9 K1 ^" C1 u4 e, f8 x) `/ a
节选自STM32F207 Reference manual手册
) p2 c+ j, G6 p9 M3 x: ]: q0 A& ?
1 L# M- v- z) H$ _0 j4 W$ j. L预装载寄存器的内容既可以直接传送到影子寄存器,也可以在每次发生更新事件(UEV)时传送到影子寄存器,这取决于TIMx_CR1 寄存器中的自动重载预装载使能位(ARPE)。- s* R2 w) ^  z; P
! k* z0 p% R) w
也就是TIMx_CR1的ARPE位决定了预装寄存器数据传入影子寄存器的时间先后顺序。$ a! L1 _3 n9 q. N. X+ c

! F5 g' e0 k  V& P0 E, x- m+ \计数器时序图,ARPE=0 时更新事件(TIMx_ARR 未预装载)。
6 V+ F) U5 E9 q9 ~1 l  r6 E- u
: R! L) a( d! }. _ aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlZySEZiSzl0QzFhY2N2MTJ5.png + O, X) {1 y) e. V

. k* `# g: R/ r; ?从上面两图看出,向上计数,还没有到达0x36,就把自动重载寄存器修改为0x36,就会在计数到0x36时产生动作。2 x( B. T( {% {3 ?) z

: o+ r! w/ `& b! Z, _7 z7 {3 i计数器时序图,ARPE=1 时更新事件(TIMx_ARR 预装载)。. j1 V" X$ C, d, b6 o* I
# U7 @# T% D  e
aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlZySEZiSzl0QzFhY2N2MTJ5.png
: a$ r; n* K* Q" i, m6 F% [  a1 k& y6 c8 b
从上面两图看出,向上计数,还没有到达0x36,就把自动重载预装载寄存器修改为0x36,就不会在计数到0x36时产生动作,会在这个时将自动重载预装载寄存器值赋给自动重载影子寄存器。5 s' h! z6 g6 C/ F" q8 P& b' E; w
" S$ D, F. b' F4 S; }
从预装载寄存器ARR传送到影子寄存器,有两种方式,一种是立刻更新,一种是等触发事件之后更新;这两种方式主要取决于寄存器TIMx->CR1中的“ARPE”位;
" X0 N. z4 W4 ?9 r' N4 ?* J7 X9 i: d
ARPE=0,当ARR值被修改时,同时马上更新影子寄存器的值;+ k; X9 M, @  J/ s

, ^- y' t& I9 AARPE=1,当ARR值被修改时,必须在下一次事件UEV发生后才能更新影子寄存器的值;  w9 S- ?6 S; o) u" d$ x( C

. Y" N& w& ~) D8 R" G+ Q怎么样马上立刻更改影子寄存器的值,而不是下一个事件;方法如下
* t  y" Y- @* \8 n: B
! M( G7 {* A( h2 u! g5 N( F( Q, x1、将ARPE=0。
  1. TIM_ARRPreloadConfig(ch1_Master_Tim,  DISABLE );
复制代码
. a" b$ V3 {3 p0 w
2、在ARPE=1。
8 L1 x1 H4 W: f3 \! S4 h! Z6 T1 H: P/ N$ h
  1. TIM_ARRPreloadConfig(ch1_Master_Tim,  ENABLE);
复制代码

1 p! q! W% T! l# Z* p6 G& ]我们更改完预装载寄存器后,立刻设置UEV事件,即更改EGR寄存的UG位,如下3 ^$ ?2 _: _* l! Y3 C6 b# D& [
# V9 o, p/ @6 [6 P2 x
  1. TIM1->ARR   =    period-1;    //设置周期
    . A* b3 K/ k% ~! X; ?8 A
  2. TIM1->CCR1  =    period>>1;  //设置占空比50%5 }0 Z" O& y/ `7 B
  3. TIM_GenerateEventTIM1,TIM_EventSource_Update);//主动发生UEV事件,UG=1
复制代码

) Y$ H' P% p6 k2 k- ^: w; V8 x工作模式如下图:0 `9 D: \' f3 Q9 I- {+ z, P, {
: G- Q5 N$ t( h' O5 S! |1 Z, L- U8 o
aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlZySEZiSzl0QzFhY2N2MTJ5.png
- Y: g2 E* a3 T3 F
3 x& `1 d8 m* C, {2 v( \04、CCR(Capture/Comparex Register)3 d4 t/ |9 _. H
还有计数器模式中有文字说明:5 `& j- S/ B& Y9 a  C! f. Z7 j

  s" A; s' V7 Q) RThe 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。) x8 p: _2 v9 |5 f# y) c1 ~4 h
- ~6 \: w6 U, D* g6 {- k( A' T8 m
节选自STM32F207 Reference manual手册0 T! x) n5 Z+ p5 F

% X; h. k  q' r) s- k通过软件将TIMx_CR1寄存器中的UDIS位置1可禁止更新事件UEV事件。这可避免向预装载寄存器写入新值时更新影子寄存器。
& B$ O: {  A( t+ _" J) W: H/ R( g
/ |7 \4 f2 b- A2 v5 v也就是TIMx_CR1寄存器中UDIS位间接决定了预装寄存器数据是否传入影子寄存器。
6 y8 E: C" d. _! P# l8 A+ O! M5 C0 T: j+ a
! @* a; G9 L: b% i, b
收藏 评论0 发布时间:2022-4-18 09:37

举报

0个回答

所属标签

相似分享

官网相关资源

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