STM32定時器的預裝載寄存器與影子寄存器之間的關系【轉】


首先轉載:   STM32定時器的預裝載寄存器與影子寄存器之間的關系


本文的說明依據STM32參考手冊(RM0008)第10版:
英文:http://www.st.com/stonline/products/literature/rm/13902.pdf
中譯文:http://www.stmicroelectronics.com.cn/stonline/mcu/images/STM32_RM_CH_V10_1.pdf

在STM32參考手冊的第13、14章中,都有一張定時器的框圖,下面是第14章中定時器框圖的局部,圖中黃色框所示的是auto-reload register,在下面的第14.3.2節"Counter Modes"就解釋了auto-reload register的用法。

在圖中可以看到auto-reload register這個框有一個陰影,有些其它寄存器也有用陰影表示,如我用藍色標出的Capture/Compare寄存器;有陰影的寄存器,表示在物理上這個寄存器對應2個寄存器,一個是程序員可以寫入或讀出的寄存器,稱為preload register(預裝載寄存器),另一個是程序員看不見的、但在操作中真正起作用的寄存器,稱為shadow register(影子寄存器);正如手冊上的14.3.1節所說,根據TIMx_CR1寄存器中APRE位的設置,preload register的內容可以隨時傳送到shadow register,即兩者是連通的(permanently),或者在每一次更新事件(UEV)時才把preload register的內容傳送到shadow register。

在圖中用紅線圈起的一個大寫的U和一個向下的箭頭,表示對應寄存器的影子寄存器可以在發生更新事件時,被更新為它的preload register的內容;而圖中用綠線圈起的部分,表示對應的Autoreload register可以產生一個更新事件(U)或更新事件中斷(UI)。

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

(原文件名:STM32_TIM_Auto_Reload_Register.GIF)

 

個人點評: 

1.  有影子寄存器的有3個:分頻寄存器PSC,自動重裝載ARR,自動捕獲CCRx,注意,PSC,ARR,CCRx不是影子寄存器,而是它們對應的“預裝載寄存器”;

2、影子寄存器才是真正起作用的寄存器,但是ST沒有提供這個寄存器出來,只是提供出與之相對應的預裝載寄存器,分別為“PSC,ARR,CCRx”

3、我們用戶能接觸到,能修改或讀取的都是預裝載寄存器,ST只是把它們開放出來(影子寄存器並沒有開放給用戶),其實就是ARR寄存器,如:TIM1->ARR

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

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

     4.2 , APRE=1,當ARR值被修改時,必須在下一次事件UEV發生后才能更新影子寄存器的值;

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

     5.1 、將ARPE=0,TIM_ARRPreloadConfig(ch1_Master_Tim, DISABLE );

     5.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

6、傳送過程示意圖如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM