1. SoC時鐘系統
什麼是時鐘?SoC爲何須要時鐘?git
(1)時鐘是同步工做系統的同步節拍程序員
(2)SoC內部有不少器件,譬如CPU、串口、DRAM控制器、GPIO等內部外設,這些東西要彼此協同工做,須要一個同步的時鐘系統來指揮。這個就是咱們SoC的時鐘系統。github
1.1 時鐘通常如何得到
SoC的時鐘得到通常有:編程
- 外部直接輸入時鐘信號,SoC有個引腳用來輸入外部時鐘信號,用的不多。
- 外部晶振+內部時鐘發生器產生時鐘,大部分低頻單片機都是這麼工做的。
- 外部晶振+內部時鐘發生器+內部PLL產生高頻時鐘+內部分頻器分頻獲得各類頻率的時鐘,210屬於這種。
S5PV210屬於第三種。爲何這麼設計?dom
第一問:外什麼不用外部高頻晶振產生高頻信號直接給CPU?異步
主要是由於芯片外部電路不適宜使用高頻率,由於傳導輻射比較難控制;高頻率的晶振太貴了。ide
第二問:爲何要內部先高頻而後再分頻?性能
主要由於SoC內部有不少部件都須要時鐘,並且各自須要的時鐘頻率不一樣,無法統一供應。所以設計思路是PLL後先獲得一個最高的頻率(1GHz、1.2GHz),而後各外設都有本身的分頻器再來分頻獲得本身想要的頻率。設計
1.2 時鐘和系統性能的關係、超頻、穩定性
- 通常SoC時鐘頻率都是能夠人爲編程控制的,頻率的高低對系統性能有很大影響。
- S5PV210建議工做頻率800MHz~1.2GHz,通常咱們都設置到1GHz主頻。若是你設置到1.2GHz就叫超頻。超頻的時候系統性能會提高,可是發熱也會增大,所以會影響系統穩定性。
- 每一個外設工做都須要必定頻率的時鐘,這些時鐘都是由時鐘系統提供的。時鐘系統能夠編程控制工做模式,所以咱們程序員能夠爲每一個外設指定時鐘來源、時鐘分頻系統、從而制定這個外設的工做時鐘。
- SoC中各類設備工做時,時鐘頻率越高其功耗越大,發熱越大,越容易不穩定,須要外部的散熱條件越苛刻。
- SoC內部有不少外設,這些外設不用的時候最好關掉(不關掉會必定程度浪費電),開關外設不是經過開關,而是經過時鐘。也就是說咱們給某個外設斷掉時鐘,這個外設就不工做了。
2. S5PV210的時鐘系統簡介
2.1 s5pv210的時鐘域
- MSYS:(main system)主時鐘域,包括CPU,DDR內存條,IROM和IRAM等
- DSYS:(display system)顯示時鐘域,就是通常的和視頻有關的就在這個時鐘域中,如HDMI,TVENC等
- PSYS:(peripheral system)外圍時鐘域,就是GPIO接口,I2C接口,UART接口等這些外圍設備就在這個時鐘域上。
註釋:每一個時鐘域經過一條BRG(異步總線的橋樑)鏈接在一塊兒。3d
![](http://static.javashuo.com/static/loading.gif)
2.2 時鐘來源:晶振+時鐘發生器+PLL+分頻電路
S5PV210外部有4個晶振接口,設計板子硬件時能夠根據須要來決定在哪裏接晶振。接了晶振以後上電相應的模塊就能產生振盪,產生原始時鐘。原始時鐘再通過一系列的篩選開關進入相應的PLL電路生成倍頻後的高頻時鐘。高頻時鐘再通過分頻到達芯片內部各模塊上。(有些模塊,譬如串口內部還有進一步的分頻器進行再次分頻使用)
![](http://static.javashuo.com/static/loading.gif)
從上圖可知:
s5pv210有4個晶振時鐘:
- XRTCXTI:提供32.768KHz,RTC 使用;XRTCXTI and XRTCXTO pins
- XXTI:CMU and PLL使用這個時鐘爲APLL、MPLL、VPLL、EPLL提供時鐘。推薦頻率24MHz。XXTI and XXTO pins
- XUSBXTI:爲APLL、MPLL、VPLL、EPLL、USB PHY提供時鐘,推薦24MHz。XUSBXTI and XUSBXTO pins.
- XHDMIXTI :27MHz,VPLL、HDMI PHY爲TV提供54MHz時鐘。XHDMIXTI and XHDMIXTO pins
咱們的210芯片,通常是從XXTI這個接口進入,這個接口鏈接外部晶振(規定是24MHz),而後進入內部時鐘發生器(syscon),再分別進入4個PLL,分別產生4種不一樣的高頻時鐘,各個高頻時鐘再通過內部的分頻器分頻獲得各類頻率的時鐘。
- APLL uses FINPLL (refer to Figure 3-1) as input to generate 30MHz ~ 1GHz.
- MPLL uses FINPLL as input to generate 50MHz ~ 2GHz.
- EPLL uses FINPLL as input to generate 10MHz ~ 600MHz.
- VPLL uses FINPLL or SCLK_HDMI27M as input to generate 10MHz ~ 600MHz. This PLL generates 54MHz video clock.
- USB OTG PHY uses XUSBXTI to generate 30MHz and 48MHz
- HDMI PHY uses XUSBXTI or XHDMIXTI to generate 54MHz
2.3 時鐘關係
MSYS clock domain
- freq(ARMCLK) = freq(MOUT_MSYS) / n, where n = 1 ~ 8
- freq(HCLK_MSYS) = freq(ARMCLK) / n, where n = 1 ~ 8
- freq(PCLK_MSYS) = freq(HCLK_MSYS) / n, where n = 1 ~ 8
- freq(HCLK_IMEM) = freq(HCLK_MSYS) / 2
DSYS clock domain
- freq(HCLK_DSYS) = freq(MOUT_DSYS) / n, where n = 1 ~ 16
- freq(PCLK_DSYS) = freq(HCLK_DSYS) / n, where n = 1 ~ 8
PSYS clock domain
- freq(HCLK_PSYS) = freq(MOUT_PSYS) / n, where n = 1 ~ 16
- freq(PCLK_PSYS) = freq(HCLK_PSYS) / n, where n = 1 ~ 8
- freq(SCLK_ONENAND) = freq(HCLK_PSYS) / n, where n = 1 ~ 8
s5pv210推薦時鐘設置:
- 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
HCLK_DSYS:DSYS時鐘域的高頻率線;
PCLK_DSYS:DSYS時鐘域的低頻率線;其餘的依次類推
2.4 時鐘配置過程
遵循的原則:
- 全部的防干擾mux必須有輸入
- 當PLL斷電時,不能使用輸出
SFR配置步驟:
//1.打開PLL
(A,M,E,V)PLL_CON[31] = 1; // Power on a PLL (Refer to (A, M, E, V) PLL_CON SFR)
wait_lock_time; // Wait until the PLL is locked
(A, M, E, V)PLL_SEL = 1; // Select the PLL output clock instead of input reference clock, after PLL output clock is stabilized. (Refer to 0, 4, 8, 12th bit of CLK_SRC0 SFR)
當PLL打開以後,就不要關閉了。
設置PLL’s PMS的值
Set PMS values; // Set PDIV, MDIV, and SDIV values (Refer to (A, M, E, V) PLL_CON SFR)
設置系統時鐘分頻器值
CLK_DIV0 [31:0] = target value0;
設置特殊時鐘的分頻器值
CLK_DIV1 [31:0] = target value1;
CLK_DIV2 [31:0] = target value2;
3. 相關寄存器
從2.4咱們能夠知道咱們須要設置的寄存器:
一、xPLL_LOCK寄存器,設置locking period,通常爲默認值。由於PLL倍頻須要必定時間才能達到相應的頻率。 ![](http://static.javashuo.com/static/loading.gif)
二、APLL_CON0寄存器:用來設置APLL的倍頻率。 ![](http://static.javashuo.com/static/loading.gif)
三、MPLL_CON寄存器,設置MPLL的倍頻率 ![](http://static.javashuo.com/static/loading.gif)
參考P、M、S值:
![](http://static.javashuo.com/static/loading.gif)
四、CLK_SRC0 寄存器,設置MUX開關 設置各時鐘前首先要關閉4個PLL的MUX開關,設置好相應寄存器之後在把PLL的MUX開關打開。
![](http://static.javashuo.com/static/loading.gif)
5.CLK_DIV0寄存器:設置各個分頻器的值,最終獲得各個時鐘。
![](http://static.javashuo.com/static/loading.gif)
各寄存器配置值爲:
![](http://static.javashuo.com/static/loading.gif)
4. 分頻框圖
根據推薦值來設置相應的MUX開關、PLL鎖相環倍頻、DIV分頻器的值來獲得相應的時鐘。
![](http://static.javashuo.com/static/loading.gif)
這裏,DIVIMEM值固定爲2,不須要經過寄存器設置。
Divider for internal memory shown as DIVIMEM in Figure 3-3 does not have corresponding fields in clock divider control registers since the divider value is fixed to two.
詳細代碼參見GitHub: https://github.com/zhutianyang/Arm_embedded_learning/tree/master/6.clock_init