1. 程式人生 > >S3C2440的時鐘系統:MPLL,UPLL,FCLK,HCLK,PCLK

S3C2440的時鐘系統:MPLL,UPLL,FCLK,HCLK,PCLK

    S3C2440的預設工作主頻有兩種12MHz和16.9344MHz,也就是我們的晶振的頻率,但一般12MHz的晶振用的比較多,Fin就是指我們接的晶振頻率。大家都知道s3c2440上電正常工作後頻率是遠遠大於12MHz和16.9344MHz的,我們的s3c2440的cpu正常工作時的頻率就是405MHz,因此這就需要一個電路來提升頻率,在s3c2440的datasheet中找到了這個電路,下面這個就是PLL電路:

    由圖中可以看出,Fin進去後,經過PLL電路,最終輸出兩個PLL訊號頻率即MPLL

UPLL,這兩個又是什麼呢

    UPLL是專用於USB裝置的,MPLL是用於CPU及外圍電路的,不清楚,還是得找s3c2440的datasheet,下面這就是從datasheet中擷取的:

圖中給出了各種介面裝置使用的時鐘訊號

    UPLL是USB專用,這裡就不講了,下面重點講下MPLL,剛才已經說了MPLL主要用於CPU和外圍裝置,但外圍裝置和CPU的工作頻率並不一樣啊,CPU的工作頻率肯定比外設要高,這就必然要對MPLL進行處理,於是FCLK,HCLK,PCLK就登場了

首先講下FCLK,首先看下datasheet中的介紹:

The Clock control logic in S3C2440A can generate the required clock signals including FCLK for CPU, HCLK for the
AHB bus peripherals, and PCLK for the APB bus peripherals.

    相信搞嵌入式的都能看的懂,FCLK是CPU用的,HCLK是AHB匯流排用的,比如說SDRAM,PCLK是APB匯流排用的,比如說UART。這三個我們一個個來講解,首先看FCLK,CPU用的,看datasheet中的關於FCLK的時序圖,我們就會看出一些東東。

    從上面的圖中可以看到FCLK在CPU上電後,過了一段時間就發生了比較大的變化,明顯值變大了,從上面這個圖中我們可以大致看出s3c2440上電啟動過程:

1、上電幾毫秒後(power由低變高),晶振輸出穩定,此時FCLK=晶振頻率,nRESET訊號恢復高電平後,CPU開始執行指令。

2、我們可以在程式開頭啟動MPLL,在設定MPLL的幾個暫存器後,需要等待一段時間(Lock Time),MPLL的輸出才穩定。在這段時間(Lock Time)內,FCLK停振,CPU停止工作。Lock Time的長短由暫存器LOCKTIME設定。

3、Lock Time之後,MPLL輸出正常,CPU工作在新的FCLK下。

    現在對FCLK進行總結一下,FCLK,在CPU上電後,晶振開始正常工作,此時FCLK=晶振頻率,注意此時不存在MPLL,經過PLL電路後,得到MPLL,UPLL。此時FCLK=MPLL。

    總的來說分頻比為FCLK:HCLK:PCLK=1:4:8,這個分配標準是由誰定的呢,就是我們的CLKDIVN暫存器,看下datasheet中的介紹大家就清楚了:

 

 S3C2440使用了三個倍頻因子MDIV、PDIV和SDIV來設定倍頻,通過暫存器MPLLCON&UPLLCON可設定倍頻因子。

MPLLCON的輸入輸出頻率間的關係為

                   FCLK=MPLL=(2*m*Fin)/(p*2^s) ,其中m=(MDIV+8), p=(PDIV+2), s=SDIV

UPLLCON的輸入輸出頻率間的關係為

                   UCLK=UPLL=(m * Fin) / (p * 2^s) ,其中m=(MDIV+8), p=(PDIV+2), s=SDIV。

手工計算相對複雜些,我們可以根據欲得到的主頻FCLK大小,直接通過查表來獲知各倍頻因子的設定引數。

 

  

對於12MHz的晶振,要想經過PLL電路得到405MHz,查表得應該設定MDIV、PDIV、SDIV分別為0x7f、2、1。

那在哪裡設定MDIV、PDIV和SDIV這3個值呢,還是datasheet:

從上圖可以看出,我們只需要設定MPLLCON暫存器就可以確定FCLK了,再通過CLKDIVN暫存器我們就可以設定FCLK、HCLK、PCLK三者之間的比例了。

 關於時鐘設定的還有一個暫存器,就是LOCKTIME,在上面的時序圖中可以看到它的身影,datasheet中介紹:

前面說過,MPLL啟動後需要等待一段時間(Lock Time),使得其輸出穩定。位[31:16]用於UPLL,位[15:0]用於MPLL。使用確省值0x00ffffff即可。

原文地址:http://blog.sina.com.cn/s/blog_e18772030101pn0i.html