上一篇文章《STM32基礎定時器詳解》中有提到影子暫存器,下文將詳細介紹影子暫存器,
01、概述
在定時器框圖中,有個小細節,有些暫存器下有個陰影
有這些陰影的表示這些暫存器存在影子暫存器,
在圖例中也有對影子暫存器的說明:
根據控制位,在發生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 時的計數器時序圖
在這里看到預分頻器暫存器存在影子暫存器,但是沒有控制位控制它,它的預裝載暫存器和影子暫存器是相連的,
作業模式如下圖:
注意:
在ST的手冊中,影子暫存器被描述成緩沖,在對預分頻器的影子暫存器描述成暫存器具有緩沖功能,其中
在這里又被描述成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 未預裝載),
從上面兩圖看出,向上計數,還沒有到達0x36,就把自動多載暫存器修改為0x36,就會在計數到0x36時產生動作,
計數器時序圖,ARPE=1 時更新事件(TIMx_ARR 預裝載),
從上面兩圖看出,向上計數,還沒有到達0x36,就把自動多載預裝載暫存器修改為0x36,就不會在計數到0x36時產生動作,會在這個時將自動多載預裝載暫存器值賦給自動多載影子暫存器,
從預裝載暫存器ARR傳送到影子暫存器,有兩種方式,一種是立刻更新,一種是等觸發事件之后更新;這兩種方式主要取決于暫存器TIMx->CR1中的“ARPE”位;
-
ARPE=0,當ARR值被修改時,同時馬上更新影子暫存器的值;
-
ARPE=1,當ARR值被修改時,必須在下一次事件UEV發生后才能更新影子暫存器的值;
怎么樣馬上立刻更改影子暫存器的值,而不是下一個事件;方法如下
1、將ARPE=0,
TIM_ARRPreloadConfig(ch1_Master_Tim, DISABLE );
2、在ARPE=1,
TIM_ARRPreloadConfig(ch1_Master_Tim, ENABLE);
我們更改完預裝載暫存器后,立刻設定UEV事件,即更改EGR寄存的UG位,如下
TIM1->ARR = period-1; //設定周期 TIM1->CCR1 = period>>1; //設定占空比50% TIM_GenerateEventTIM1,TIM_EventSource_Update);//主動發生UEV事件,UG=1
作業模式如下圖:
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位間接決定了預裝暫存器資料是否傳入影子暫存器,
點擊查看本文所在的專輯,STM32F207教程
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/257004.html
標籤:其他
上一篇:Linux重定向用法詳解
