S5PV210時鐘體系
S5PV210中包含3大類時鐘domain,分別是主系統時鐘domain (簡稱MSYS,下面將使用簡稱來進行相關講解)、顯示相關的時鐘domain (DSYS)、外圍設備的時鐘domain (PSYS)。
1) MSYS:用來給cortex a8處理器,dram控制器,3D,IRAM,IROM,中斷控制器等提供時鐘;
2) DSYS:用來給顯示相關的部件提供時鐘,包括FIMC, FIMD, JPEG, and multimedia IPs;
3) PSYS:用來給外圍設備提供時鐘,如i2s, spi,i2c,uart等
S5PV210外接的晶振頻率(簡稱Fin)為24MHz,通過時鐘控制邏輯PLL可以提高系統時鐘。S5PV210共有4個倍頻器,即PLL,包括APLL(供MSYS使用),MPLL(供DSYS使用),EPLL(供PSYS使用),VPLL(供video相關的時鐘使用)。3大類時鐘domain中,可以使用不同的分頻,使其給不同部件輸出所需要的時鐘,各類時鐘的關系如下圖:
S5PV210時鐘分類圖
如何確定各類時鐘的值,芯片手冊上給出了參考值,我們按照參考值設置即可,各類時鐘的參考值如下圖:
S5PV210時鐘設置參考值圖
具體如何設置上述各種各樣的時鐘,可參考下圖:
S5PV210時鐘設置參考圖
該圖十分重要,依據上圖我們就可以設置好所有硬件部件所需的工作時鐘(實際上我們并不需要設置好所有部件的工作時鐘,我們只需設置好我們需要使用的硬件部件的工作時鐘即可),在本章第二節中,我們將以上圖為基礎,通過設置時鐘相關的寄存器,達到初始化時鐘的目的。
程序例子:
分別用了匯編語言和C語言來編寫,詳細代碼見鏈接。下面以C語言代碼來講解:
1. start.S
在調用main函數之前,調用了時鐘初始化函數clock_init,進行時鐘相關的設置。
2. clock.c
clock_init()在clock.c中定義,具體代碼如下:
void clock_init()
{
// 1 設置各種時鐘開關,暫時不使用PLL
CLK_SRC0 = 0x0;
// 2 設置鎖定時間,使用默認值即可
APLL_LOCK = 0x0000FFFF;
MPLL_LOCK = 0x0000FFFF;
// 3 設置分頻
CLK_DIV0 = 0x14131440;
// 4 設置PLL
APLL_CON0 = APLL_VAL;
MPLL_CON = MPLL_VAL;
// 5 設置各種時鐘開關,使用PLL
CLK_SRC0 = 0x10001111;
}
上述代碼共有5個步驟,下面我們一一講解每一個步驟:
第一步 、設置各種時鐘開關,暫時不使用PLL
根據時鐘設置圖,下面是放大圖:
首先我們需要選擇使用外接24MHz晶振,由上圖可知,APLL和MPLL的時鐘源由“FIN_PLL”決定,在芯片手冊中搜索“FIN_PLL”,可知相關寄存器為CLK_SRC0,見下圖:
在未設置PLL和各種分頻系數之前,我們不能使用PLL,為了保險起見,暫時直接使用頻率較低的外接的24MHz晶振,待設置好PLL和分頻系數后再重新設置各種時鐘開關。
第二步 、設置鎖定時間
設置PLL后,時鐘從Fin提升到目標頻率時,需要一定的時間,即鎖定時間。
第三步 、設置分頻
與分頻相關的寄存器是CLK_DIV0,見下圖:
現在我們來根據本章第一節中給出的時鐘設置參考值來設置該寄存器。
ARMCLK = 1000MHz = MOUT_MSYS / (APLL_RATIO + 1),經過在第四和第五步的設置后,MOUT_MSYS會被設置為1000MHz,所以 APLL_RATIO=0即可
SCLKA2M=200MHz=SCLKAPLL / (A2M_RATIO + 1),由于SCLKAPLL=1000MHz,所以A2M_RATIO=4。
HCLK_MSYS=200MHz=ARMCLK / (HCLK_MSYS_RATIO + 1),所以HCLK_MSYS_RATIO=4
PCLK_MSYS=100MHz=HCLK_MSYS / (PCLK_MSYS_RATIO + 1),所以PCLK_MSYS_RATIO=1
HCLK_DSYS=166MHz=MOUT_DSYS / (HCLK_DSYS_RATIO + 1), 經過在第四和第五步的設置后,MOUT_DSYS =667MHz,所以HCLK_DSYS_RATIO=3
PCLK_DSYS=83MHz=HCLK_DSYS / (PCLK_DSYS_RATIO + 1),所以PCLK_DSYS_RATIO=1
HCLK_PSYS=133Mhz=MOUT_PSYS / (HCLK_PSYS_RATIO + 1),經過在第四和第五步的設置后,MOUT_PSYS =667MHz所以HCLK_PSYS_RATIO=4
PCLK_PSYS=66Mhz=HCLK_PSYS / (PCLK_PSYS_RATIO + 1),所以HCLK_PSYS_RATIO=1
所以CLK_DIV0 = 0x14131440;
第四步 、設置PLL
PLL即倍頻器,用來放大運行頻率。設置好分頻后,我們就需要設置PLL了。APLL/MPLL的啟動是通過設置APLL_CON0/MPLL_CON寄存器,我們逐個來設置。
APLL_CON0
ALPP_CON0負責設置APLL,FINPLL=24MHz,經過APLL后,我們將輸 出FOUT=1000Mhz的時鐘頻率,FOUT的計算公式如下: FOUT=MDIV*FIN/(PDIV*2^(SDIV-1)) = 1000 MHz
由于FIN=24MHz,FOUT=1000MHz,我們可以這樣取值: MDIV= 0x7d,PDIV= 0x3,SDIV=1。這3個值并不是固定死的,只要能使FOUT=1000Mhz,任意搭配都是可以的。
MPLL_CON
MPLL_CON寄存器負責設置MPLL,經過MPLL后,我們將輸出FOUT=667Mhz的時鐘頻率,FOUT的計算公式如下: FOUT=MDIV*FIN/(PDIV*2^SDIV) = 667 MHz
由于FIN=24MHz,FOUT=667MHz,我們可以這樣取值: MDIV=0x29B, PDIV= 0xC,SDIV=1。這3個值并不是固定死的,只要能使FOUT=667Mhz,任意搭配都是可以的。
第五步 設置各種時鐘開關
S5PV210時鐘設置參考圖
在上圖中,所有的MUX都是用來選擇時鐘的,相關寄存器是CLK_SRC0, 見下圖:
參考S5PV210時鐘設置參考圖,設置各種時鐘開關:
APLL_SEL=1,使用FOUTAPLL
MPLL_SEL=1,使用FOUTMPLL
EPLL_SEL=1,使用FOUTEPLL
VPLL_SEL=1,使用FOUTVPLL
MUX_MSYS_SEL=0,使用SCLKAPLL
MUX_DSYS_SEL=0,使用SCLKMPLL
MUX_PSYS_SEL=0,使用SCLKMPLL
ONENAND_SEL=1,使用HCLK_DSYS
所以CLK_SRC0=0x10001111;
3. main.c
在main函數中實現LED閃爍的功能,與前面的代碼大同小異。
上一篇:S5PV210 ADC轉換
下一篇:S5PV210 LCD顯示
推薦閱讀最新更新時間:2025-06-07 17:40





