您好,登錄后才能下訂單哦!
這篇文章主要介紹了STM32 影子寄存器怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
在定時器框圖中,有個小細節,有些寄存器下有個陰影
有這些陰影的表示這些寄存器存在影子寄存器。
在圖例中也有對影子寄存器的說明:
根據控制位,在發生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
在預分頻器的描述中:
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寄存器不進行緩沖。
控制位:
在時基單位中有說明如下
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(ch2_Master_Tim, DISABLE );
2、在ARPE=1。
TIM_ARRPreloadConfig(ch2_Master_Tim, ENABLE);
我們更改完預裝載寄存器后,立刻設置UEV事件,即更改EGR寄存的UG位,如下
TIM1->ARR = period-1; //設置周期 TIM1->CCR1 = period>>1; //設置占空比50% TIM_GenerateEventTIM1,TIM_EventSource_Update);//主動發生UEV事件,UG=1
工作模式如下圖:
還有計數器模式中有文字說明:
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位間接決定了預裝寄存器數據是否傳入影子寄存器。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“STM32 影子寄存器怎么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。