《6.S5PV210的時鐘系統》
《6.S5PV210的時鐘系統》
第一部分、章節目錄
1.6.1.SoC時鐘系統簡介
1.6.2.S5PV210的時鐘系統簡介
1.6.3.S5PV210時鐘域詳解
1.6.4.S5PV210時鐘體系框圖詳解
1.6.5.時鐘設定的關鍵性暫存器
1.6.6.彙編實現時鐘設定程式碼詳解1
1.6.7.彙編實現時鐘設定程式碼詳解2
1.6.8.C語言實現時鐘設定程式碼詳解1
第二部分、章節介紹
1.6.1.SoC時鐘系統簡介
本節講解時鐘系統的基本概念,時鐘的作用、來源,SoC的時鐘體系等,學習這些基礎概念能夠讓大家從整體上把握現代SoC的時鐘系統設計方式,從而有利於後面課程的學習。
1.6.2.S5PV210的時鐘系統簡介
本節概要講述S5PV210的時鐘體系,主要內容是時鐘域概念的引入,並且講了210內部的4個PLL及其用途。
1.6.3.S5PV210時鐘域詳解
詳解S5PV210的時鐘域,並且將210內部複雜的時鐘分解成很多部分,各部分的時鐘已經名稱列出,最後給出了三星推薦的各時鐘典型值。
1.6.4.S5PV210時鐘體系框圖詳解
本節主要講解如何解析S5PV210資料手冊中的時鐘框圖,這個框圖是210內部複雜的時鐘模組的邏輯結構圖,學會看這張圖很關鍵,是理解時鐘體系的核心。
1.6.5.時鐘設定的關鍵性暫存器
本節講述S5PV210時鐘模組的主要暫存器,這些暫存器與後面程式設計控制時鐘模組有極大關聯,需要對照各個位定義詳細解析。
1.6.6.彙編實現時鐘設定程式碼詳解1
本節開始實戰使用匯編程式碼來設定時鐘。主要講了CLK_SRC(Mux開關)、CLK_LOCK、CLK_DIV等幾個關鍵性暫存器的詳細設定。
1.6.7.彙編實現時鐘設定程式碼詳解2
本節接上節繼續分析S5PV210的時鐘設定程式碼,首先分析了APLL和MPLL的設定引數,然後結合暫存器、時鐘框圖、程式碼三者綜合分析S5PV210的時鐘系統
1.6.8.C語言實現時鐘設定程式碼詳解
本節以C語言來設定時鐘,其實就是將上節的彙編程式碼用C語言的方式進行改造。通過本節希望大家明白彙編和C語言的相同和不同,能夠學會在彙編和C之間進行切換。
第三部分、隨堂記錄
1.6.1.SoC時鐘系統簡介
1.6.1.1、什麼是時鐘?SoC為什麼需要時鐘?
(1)時鐘是同步工作系統的同步節拍。
(2)SoC內部有很多器件,譬如CPU、串列埠、DRAM控制器、GPIO等內部外設,這些東西要彼此協同工作,需要一個同步的時鐘系統來指揮。這個就是我們SoC的時鐘系統。
1.6.1.2、時鐘一般如何獲得
(1)SoC的時鐘獲得一般有:
* 外部直接輸入時鐘訊號,SoC有個引腳用來輸入外部時鐘訊號,用的很少。
* 外部晶振+內部時鐘發生器產生時鐘,大部分低頻微控制器都是這麼工作的。
* 外部晶振+內部時鐘發生器+內部PLL產生高頻時鐘+內部分頻器分頻得到各種頻率的時鐘,210屬於這種。
(2)S5PV210屬於第三種。為什麼這麼設計?
第一問:外什麼不用外部高頻晶振產生高頻訊號直接給CPU?
主要是因為晶片外部電路不適宜使用高頻率,因為傳導輻射比較難控制;高頻率的晶振太貴了。
第二問:為什麼要內部先高頻然後再分頻?
主要因為SoC內部有很多部件都需要時鐘,而且各自需要的時鐘頻率不同,沒法統一供應。因此設計思路是PLL後先得到一個最高的頻率(1GHz、1.2GHz),然後各外設都有自己的分頻器再來分頻得到自己想要的頻率。
1.6.1.3、時鐘和系統性能的關係、超頻、穩定性
(1)一般SoC時鐘頻率都是可以人為程式設計控制的,頻率的高低對系統性能有很大影響。
(2)S5PV210建議工作頻率800MHz~1.2GHz,一般我們都設定到1GHz主頻。如果你設定到1.2GHz就叫超頻。超頻的時候系統性能會提升,但是發熱也會增大,因此會影響系統穩定性。
1.6.1.4、時鐘和外設程式設計的關聯
(1)每個外設工作都需要一定頻率的時鐘,這些時鐘都是由時鐘系統提供的。時鐘系統可以程式設計控制工作模式,因此我們程式設計師可以為每個外設指定時鐘來源、時鐘分頻系統、從而制定這個外設的工作時鐘。
1.6.1.5、時鐘和功耗控制的關係
(1)SoC中各種裝置工作時,時鐘頻率越高其功耗越大,發熱越大,越容易不穩定,需要外部的散熱條件越苛刻。
(2)SoC內部有很多外設,這些外設不用的時候最好關掉(不關掉會一定程度浪費電),開關外設不是通過開關,而是通過時鐘。也就是說我們給某個外設斷掉時鐘,這個外設就不工作了。
1.6.2.S5PV210的時鐘系統簡介
1.6.2.1、時鐘域:MSYS、DSYS、PSYS
(1)因為S5PV210的時鐘體系比較複雜,內部外設模組太多,因此把整個內部的時鐘劃分為3大塊,叫做3個域。
(2)MSYS: CPU(Cortex-A8核心)、DRAM控制器(DMC0和DMC1)、IRAM&IROM······
(3)DSYS: 都是和視訊顯示、編解碼等有關的模組
(4)PSYS: 和內部的各種外設時鐘有關,譬如串列埠、SD介面、I2C、AC97、USB等。
(5)為什麼內部要分為3個域,怎麼劃分的?因為210內部的這些模組彼此工作時鐘速率差異太大了,所以有必要把高速的放一起,相對低速的放一起。
1.6.2.2、時鐘來源:晶振+時鐘發生器+PLL+分頻電路
(1)S5PV210外部有4個晶振介面,設計板子硬體時可以根據需要來決定在哪裡接晶振。接了晶振之後上電相應的模組就能產生振盪,產生原始時鐘。原始時鐘再經過一系列的篩選開關進入相應的PLL電路生成倍頻後的高頻時鐘。高頻時鐘再經過分頻到達晶片內部各模組上。(有些模組,譬如串列埠內部還有進一步的分頻器進行再次分頻使用)
1.6.2.3、PLL:APLL、MPLL、EPLL、VPLL
APLL:Cortex-A8核心 MSYS域
MPLL&EPLL:DSYS PSYS
VPLL:Video視訊相關模組
1.6.3.S5PV210時鐘域詳解
1.6.3.1、MSYS域:
ARMCLK: 給cpu核心工作的時鐘,也就是所謂的主頻。
HCLK_MSYS: MSYS域的高頻時鐘,給DMC0和DMC1使用
PCLK_MSYS: MSYS域的低頻時鐘
HCLK_IMEM:給iROM和iRAM(合稱iMEM)使用
1.6.3.2、DSYS域:
HCLK_DSYS:DSYS域的高頻時鐘
PCLK_DSYS:DSYS域的低頻時鐘
1.6.3.3、PSYS域:
HCLK_PSYS:PSYS域的高頻時鐘
PCLK_PSYS:PSYS域的低頻時鐘
SCLK_ONENAND:
總結:210內部的各個外設都是接在(內部AMBA匯流排)總線上面的,AMBA匯流排有1條高頻分支叫AHB,有一條低頻分支叫APB。上面的各個域都有各自對應的HCLK_XXX和PCLK_XXX,其中HCLK_XXX就是XXX這個域中AHB匯流排的工作頻率;PCLK_XXX就是XXX這個域中APB匯流排的工作頻率。
SoC內部的各個外設其實是掛在總線上工作的,也就是說這個外設的時鐘來自於他掛在的匯流排,譬如串列埠UART掛在PSYS域下的APB總線上,因此串列埠的時鐘來源是PCLK_PSYS。
我們可以通過記住和分析上面的這些時鐘域和匯流排數值,來確定我們各個外設的具體時鐘頻率。
1.6.3.4、各時鐘典型值(預設值,iROM中設定的值)
(1)當210剛上電時,預設是外部晶振+內部時鐘發生器產生的24MHz頻率的時鐘直接給ARMCLK的,這時系統的主頻就是24MHz,執行非常慢。
(2)iROM程式碼執行時第6步中初始化了時鐘系統,這時給了系統一個預設推薦執行頻率。這個時鐘頻率是三星推薦的210工作效能和穩定性最佳的頻率。
(3)各時鐘的典型值:
? freq(ARMCLK) = 1000 MHz
? freq(HCLK_MSYS) = 200 MHz
? freq(HCLK_IMEM) = 100 MHz
? freq(PCLK_MSYS) = 100 MHz
? freq(HCLK_DSYS) = 166 MHz
? freq(PCLK_DSYS) = 83 MHz
? freq(HCLK_PSYS) = 133 MHz
? freq(PCLK_PSYS) = 66 MHz
? freq(SCLK_ONENAND) = 133 MHz, 166 MHz
1.6.4.S5PV210時鐘體系框圖詳解
(1)時鐘體系框圖的位置:資料手冊P361&P362,Figure3-3
(2)兩張圖之間是漸進的關係。第一張圖從左到右依次完成了原始時鐘生成->PLL倍頻得到高頻時鐘->初次分頻得到各匯流排時鐘;第二張圖是從各中間時鐘(第一張圖中某個步驟生成的時鐘)到各外設自己使用的時鐘(實際就是個別外設自己再額外分頻的設定)。可見,第一張圖是理解整個時鐘體系的關鍵,第二種圖是進一步分析各外設時鐘來源的關鍵。
(3)要看懂時鐘體系框圖,2個符號很重要:一個是MUX開關,另一個是DIV分頻器。
(3.1)MUX開關就是個或門,實際對應某個暫存器的某幾個bit位的設定,設定值決定了哪條通道通的,分析這個可以知道右邊的時鐘是從左邊哪條路過來的,從而知道右邊時鐘是多少。
(3.2)DIV分頻器,是一個硬體裝置,可以對左邊的頻率進行n分頻,分頻後的低頻時鐘輸出到右邊。分頻器在程式設計時實際對應某個暫存器中的某幾個bit位,我們可以通過設定這個暫存器的這些對應bit位來設定分頻器的分頻係數(譬如左邊進來的時鐘是80MHz,分頻系統設定為8,則分頻器右邊輸出的時鐘頻率為10MHz)。
(3.3)暫存器中的clock source x就是在設定MUX開關;clock divider control暫存器就是在設定分頻器分頻係數。
1.6.5.時鐘設定的關鍵性暫存器
1.6.5.1、xPLL_LOCK
xPLL_LOCK暫存器主要控制PLL鎖定週期的。
1.6.5.2、xPLL_CON/xPLL_CON0/xPLL_CON1
PLL_CON暫存器主要用來開啟/關閉PLL電路,設定PLL的倍頻引數,檢視PLL鎖定狀態等
1.6.5.3、CLK_SRCn(n:0~6)
CLK_SRC暫存器是用來設定時鐘來源的,對應時鐘框圖中的MUX開關。
1.6.5.4、CLK_SRC_MASKn
CLK_SRC_MASK決定MUX開關n選1後是否能繼續通過。預設的時鐘都是開啟的,好處是不會因為某個模組的時鐘關閉而導致莫名其妙的問題,壞處是功耗控制不精細、功耗高。
1.6.5.5、CLK_DIVn
各模組的分頻器引數配置
1.6.5.6、CLK_GATE_x
類似於CLK_SRC_MASK,對時鐘進行開關控制
1.6.5.7、CLK_DIV_STATn
1.6.5.8、CLK_MUX_STATn
這兩類狀態位暫存器,用來檢視DIV和MUX的狀態是否已經完成還是在進行中
總結:其中最重要的暫存器有3類:CON、SRC、DIV。其中CON決定PLL倍頻到多少,SRC決定走哪一路,DIV決定分頻多少。
1.6.6.彙編實現時鐘設定程式碼詳解1
1.6.6.1、時鐘設定的步驟分析:
第1步:先選擇不使用PLL。讓外部24MHz原始時鐘直接過去,繞過APLL那條路
第2步:設定鎖定時間。預設值為0x0FFF,保險起見我們設定為0xFFFF
第3步:設定分頻系統,決定由PLL出來的最高時鐘如何分頻得到各個分時鐘
第4步:設定PLL,主要是設定PLL的倍頻系統,決定由輸入端24MHz的原始頻率可以得到多
大的輸出頻率。我們按照預設設定值設定輸出為ARMCLK為1GHz
第5步:開啟PLL。前面4步已經設定好了所有的開關和分頻係數,本步驟開啟PLL後PLL開始
工作,鎖定頻率後輸出,然後經過分頻得到各個頻率。
總結:以上5步,其實真正涉及到的暫存器只有5個而已。
1.6.6.2、CLK_SRC暫存器的設定分析
CLK_SRC暫存器其實是用來設定MUX開關的。在這裡先將該暫存器設定為全0,主要是bit0和bit4設定為0,表示APLL和MPLL暫時都不啟用。
1.6.6.3、CLK_LOCK暫存器的設定分析
設定PLL鎖定延時的。官方推薦值為0xFFF,我們設定為0xFFFF。
1.6.6.4、CLK_DIV暫存器的設定分析
0x14131440這個值的含義分析:
PCLK_PSYS = HCLK_PSYS / 2
HCLK_PSYS = MOUT_PSYS / 5
PCLK_DSYS = HCLK_DSYS / 2
HCLK_DSYS = MOUT_DSYS / 4
·······
HCLK_MSYS = ARMCLK / 5
ARMCLK = MOUT_MSYS / 1
1.6.7.彙編實現時鐘設定程式碼詳解2
1.6.7.1、PLL倍頻的相關計算
(1)、我們設定了APLL和MPLL兩個,其他兩個沒有管。
(2)、APLL和MPLL設定的關鍵都是M、P、S三個值,這三個值都來自於官方資料手冊的推薦值
(3)、M、P、S的設定依賴《4.2.C語言位運算》中講過的位運算技術。
1.6.7.2、結合暫存器、時鐘框圖、程式碼三者綜合分析S5PV210的時鐘系統
分析時記得在圖上做標記(把MUX開關選哪個和DIV分頻多少都標出來)然後清楚了。
1.6.7.3、程式碼編譯、燒寫實驗
1.6.8.C語言實現時鐘設定程式碼詳解
1.6.8.1、C和彙編操作暫存器的不同
語法寫法不同,核心是一樣的
1.6.8.2、C的優勢:位運算更加簡單
C語言還是要簡單一些
1.6.8.3、用C語言重寫時鐘初始化程式碼
見視訊過程