溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

STM32 影子寄存器怎么用

發(fā)布時間:2021-12-27 11:34:14 來源:億速云 閱讀:260 作者:小新 欄目:互聯(lián)網(wǎng)科技

這篇文章主要介紹了STM32 影子寄存器怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

01、概述

在定時器框圖中,有個小細節(jié),有些寄存器下有個陰影

STM32 影子寄存器怎么用

有這些陰影的表示這些寄存器存在影子寄存器。

在圖例中也有對影子寄存器的說明:

STM32 影子寄存器怎么用

根據(jù)控制位,在發(fā)生U事件后,預裝載寄存器內(nèi)容轉(zhuǎn)移到有效寄存器。這也就是對影子寄存器的說明。

有陰影的寄存器(AutoReloadRegister),表示在物理上這個寄存器對應2個寄存器,一個是程序員可以寫入或讀出的寄存器,稱為preloadregister(預裝載寄存器),另一個是程序員看不見的、但在操作中真正起作用的寄存器,稱為shadowregister(影子寄存器)。

這里有3個寄存器名稱

AutoReloadRegister。

preloadregister。

shadowregister。

在這里我的理解是,AutoReloadRegister自動重裝載寄存器是一個概念寄存器,可以在寄存器表中找到每一位的定義,它是由preloadregister預裝載寄存器和shadowregister影子寄存器組成。我們用戶能接觸到,能修改或讀取的都是預裝載寄存器,ST只是把它們開放出來(影子寄存器并沒有開放給用戶),其實就是ARR寄存器。

設計preloadregister和shadowregister的好處是:

所有真正需要起作用的寄存器(shadowregister)可以在同一個時間(發(fā)生更新事件時)被更新為所對應的preloadregister的內(nèi)容,這樣可以保證多個通道的操作能夠準確地同步。如果沒有shadowregister,或者preloadregister和shadowregister是直通的,即軟件更新preloadregister時,同時更新了shadowregister,因為軟件不可能在一個相同的時刻同時更新多個寄存器,結(jié)果造成多個通道的時序不能同步,如果再加上其它因素(例如中斷),多個通道的時序關系有可能是不可預知的。

看到有陰影寄存器共三種:

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.

節(jié)選自STM32F207 Reference manual手冊

由于該控制寄存器具有緩沖功能,因此可對預分頻器進行實時更改。而新的預分頻比將在下一更新事件發(fā)生時被采用。

預分頻器分頻由1 變?yōu)? 時的計數(shù)器時序圖

STM32 影子寄存器怎么用

在這里看到預分頻器寄存器存在影子寄存器,但是沒有控制位控制它,它的預裝載寄存器和影子寄存器是相連的。

工作模式如下圖:

STM32 影子寄存器怎么用

注意:

在ST的手冊中,影子寄存器被描述成緩沖,在對預分頻器的影子寄存器描述成寄存器具有緩沖功能。其中

STM32 影子寄存器怎么用

在這里又被描述成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.

節(jié)選自STM32F207 Reference manual手冊

預裝載寄存器的內(nèi)容既可以直接傳送到影子寄存器,也可以在每次發(fā)生更新事件(UEV)時傳送到影子寄存器,這取決于TIMx_CR1 寄存器中的自動重載預裝載使能位(ARPE)。

也就是TIMx_CR1的ARPE位決定了預裝寄存器數(shù)據(jù)傳入影子寄存器的時間先后順序。

計數(shù)器時序圖,ARPE=0 時更新事件(TIMx_ARR 未預裝載)。

STM32 影子寄存器怎么用

從上面兩圖看出,向上計數(shù),還沒有到達0x36,就把自動重載寄存器修改為0x36,就會在計數(shù)到0x36時產(chǎn)生動作。

計數(shù)器時序圖,ARPE=1 時更新事件(TIMx_ARR 預裝載)。

STM32 影子寄存器怎么用

從上面兩圖看出,向上計數(shù),還沒有到達0x36,就把自動重載預裝載寄存器修改為0x36,就不會在計數(shù)到0x36時產(chǎn)生動作,會在這個時將自動重載預裝載寄存器值賦給自動重載影子寄存器。

從預裝載寄存器ARR傳送到影子寄存器,有兩種方式,一種是立刻更新,一種是等觸發(fā)事件之后更新;這兩種方式主要取決于寄存器TIMx->CR1中的“ARPE”位;

  1. ARPE=0,當ARR值被修改時,同時馬上更新影子寄存器的值;

  2. ARPE=1,當ARR值被修改時,必須在下一次事件UEV發(fā)生后才能更新影子寄存器的值;

怎么樣馬上立刻更改影子寄存器的值,而不是下一個事件;方法如下

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);//主動發(fā)生UEV事件,UG=1

工作模式如下圖:

STM32 影子寄存器怎么用

04、CCR(Capture/Comparex Register)

還有計數(shù)器模式中有文字說明:

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。

節(jié)選自STM32F207 Reference manual手冊

通過軟件將TIMx_CR1寄存器中的UDIS位置1可禁止更新事件UEV事件。這可避免向預裝載寄存器寫入新值時更新影子寄存器。

也就是TIMx_CR1寄存器中UDIS位間接決定了預裝寄存器數(shù)據(jù)是否傳入影子寄存器。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“STM32 影子寄存器怎么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業(yè)資訊頻道,更多相關知識等著你來學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI