WINCE6.0+S3C6410主要时钟控制
********************************LoongEmbedded*****************
作者:LoongEmbedded(kandi)
時間:2011.06.19
類別:WINCE驅動開發
********************************LoongEmbedded*****************
?
備注:S3C6410的ARM內核時鐘(ARMCLK)官方推薦的穩定的533MHz。
DMC:動態內存控制器
?
S3C6410有3個PLL,分為為APLL、MPLL和EPLL,其中APLL提供ARMCLK提供時鐘給CPU,MPLL分別提供HCLK給AXI/AHB總線設備與提供PCLK時鐘給APB總線設備外,EPLL提供SCLK給外設,特別是用于音頻相關的時鐘。
PLL最主要的意義在于輸出比輸入更高頻率的時鐘,這是系統在工作工作時候所需要的時鐘,但我們可以通過外部提供的時鐘源(EXTCLK)來提供慢速時鐘ARMCLK、HCLK和PCLK來降低系統功耗。也可以通過軟件來控制每個外設的時鐘信號的啟用或者禁止來控制系統功耗。下面就來開始學習系統是如何管理時鐘的。
?
1.???? APLL、MPLL和EPLL輸出時鐘及ARMCLK、HCLK、PCLK和SCLK的確定
我們先來看
圖1
圖1闡明了時鐘產生邏輯:APLL用于ARM內核時鐘操作,MPLL用于主時鐘操作,EPLL用于特殊用途。操作系統分為三組,第一組是APLL產生的ARM時鐘,第二組是MPLL產生的時鐘,該時鐘用于AXI、AHB和APB總線操作,最后一組是EPLL產生的時鐘,主要用于外設IPs,比如是UART、IIS、IIC等。
?
1.1 APLL和MPLL輸出頻率的確定
根據圖1,APLL,MPLL和EPLL的輸出時鐘,是如何確定呢?結合下圖來理解
圖2
從圖2對寄存器的描述可知APLL_CON/MPLL_CON寄存器的MDIV、PDIV和SDIV可以確定APLL及MPLL的輸出時鐘,再結合下圖就可以知道如何設置MDIV、PDIV和SDIV了。
圖3
根據圖3推薦的幾組值,我們的系統選擇FOUT=533MHZ這一組,那代碼中是在哪里如何體現的呢?在src/oal/oallib/starup.s中下面的代碼對MDIV、PDIV和SDIV設置
圖4
結合圖3,我們選擇FOUT=533MHZ,所以有MDIV=266,PDIV=3,SDIV=1,這樣APLL輸出的時鐘頻率就為667MHZ,這樣我們就可以有下面的賦值
APLL_MVAL??? EQU??? (266)
APLL_PVAL??? EQU??? (3)
APLL_SVAL??? EQU??? (1)
這幾個值是在PLATFORM/COMMON/SRC/SOC/S3C6410_SEC_V1/OAL/INC/s3c6410.inc中設置的
接下來怎么確定MPLL輸出的時鐘呢?我們看下面這個表
圖5
這樣我們就可以確定MPLL輸出的時鐘為266MHZ,從而結合圖3可知MPLL對應的MDIV=266、PDIV=3和SDIV=2,這樣我們就可以有下面的賦值
MPLL_MVAL??? EQU??? (266)
MPLL_PVAL??? EQU??? (3)
MPLL_SVAL??? EQU??? (2)
?
1.2 EPLL輸出頻率的確定
EPLL輸出頻率是由EPLL_CON0和EPLL_CON1寄存器的MDIV,PDIV,SDIV和KDIV的值來決定的,下圖是EPLL輸出頻率的推薦值
圖6
根據圖6的選擇可知MDIV=28,PDIV=1,SDIV=2,KDIV=0,從而可以有下面的賦值:
EPLL_MVAL??? EQU??? (254)
EPLL_PVAL??? EQU??? (9)
EPLL_SVAL??? EQU??? (2)
EPLL_KVAL??? EQU??? (0)
對EPLL_CON0和EPLL_CON1寄存器的設置也是在在src/oal/oallib/starup.s中設置的,接著圖4,這些設置代碼如圖7所示
圖7
1.3改變PLL的輸出頻率
上面描述了對APLL、MPLL和EPLL輸出頻率寄存器的設置,先是比較之前的這些寄存器的值是否和現在要設置的一致,如果不一致,就要讓現在的設置生效,這是通過調用PLL_NeedToConfigure函數來實現的,下面就來學習這個函數
圖8
下面我們來學習這個函數
1)?????? 關閉APLL、MPLL和EPLL時鐘輸出
為什么要做這個動作呢?因為接下來要改變PLL的時鐘輸出,而PLL輸出的時鐘在PLL的lock-time時間之后才能給系統提供穩定的時鐘,所以先采用FIN作為輸入時鐘,結合圖1可更好理解,這個動作就是下面的代碼來實現的
bic?? ?????r1, r1, #0x7
對CLK_SRC[0:2]位清零,下圖對CLK_SRC[0:2]位的描述
圖9
2)?????? 通過設置CLK_DIV0寄存器的設置來控制系統系統和具體的時鐘,也就是確定ARMCLK、HCLK*2、HCLK和PCLK,我們先來看CLK_DIV0寄存器的相關位描述
圖10
從圖5可知ARMCLK=533MHZ,HCLK*2=266MHZ,HCLK=133MHZ,PCLK=66MHZ,也知DOUTapll=533MHZ,MOUTmpll=266MHZ,這樣根據圖10中的公式就可以算出ARM_RATIO=0,MPLL_RATIO=1,HCLK_RATIO=1,HCLK*2_RATIO=1,PCLK_RATIO=1。這里通過下圖來理解HCLK*2IN和HCLK*2以及怎么算出HCLK*2_RATIO的
圖11
?
3)?????? 設置PLL的lock time
APLL_LOCK,MPLL_LOCK和EPLL_LOCK寄存器用于設置對應的PLL的lock time,下面看這幾個寄存器的描述
圖12
我們再來看看下面的描述可以更好去理解。
圖13
4)?????? 設置PMS的值,可參考圖4到圖7之間的內容描述。
到此對PLL_NeedToConfigure函數的描述已經完成了。
?
1.4??? 檢查CLK_DIV0寄存器是否和要設置的內容一致,如果不一致就要按照現在要配置的
內容來配置,實現的代碼如下:
圖14
可見上面第2)部分的描述,下面來看看CLKDIV_NeedToConfigure函數的實現,
圖15
?
總結
以上是生活随笔為你收集整理的WINCE6.0+S3C6410主要时钟控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WINCE基于AT050TN22屏的时序
- 下一篇: WINCE下调试AT050TN22屏及触