S3C2440时钟系统详解
在講述系統(tǒng)時(shí)鐘之前,因?yàn)檫@些設(shè)備都是掛靠在系統(tǒng)時(shí)鐘上的,所以必須先說(shuō)系統(tǒng)時(shí)鐘,S3C2440的時(shí)鐘系統(tǒng)如下
外部時(shí)鐘源分兩種,晶振或者外部頻率,由om3-2選擇,時(shí)鐘電路根據(jù)兩種選擇也有兩種
我們來(lái)分析時(shí)鐘圖可以得到以下結(jié)論:? 經(jīng)過(guò)選擇的外部時(shí)鐘進(jìn)入MPLL,進(jìn)行鎖相環(huán)倍頻,經(jīng)過(guò)鎖相環(huán)之后的時(shí)鐘MPLL_IN分成了三股,分別是FCLK,HCLK,PCLK.這其中HCLK和PCLK又是從HCLK分頻得到的,最后ARM920T這個(gè)系統(tǒng)內(nèi)核模塊得到了兩個(gè)時(shí)鐘HCLK和FCLK,DMA控制器,LCD控制器,內(nèi)存控制器,總線控制器,外部nand控制器和TIC,攝像頭接口都來(lái)自于HCLK時(shí)鐘,LCD控制器,nand控制器,cam攝像頭控制器的時(shí)鐘可以選擇從總線上切斷開(kāi)來(lái),IIC WDT IIS PWM SDI GPIO ADC RTC UART012 SPI AC97這些外設(shè)都掛接在PCLK總線上,而且除了WDT外,都可以斷開(kāi)和總線的連接,另外USB時(shí)鐘直接從MPLL_IN倍頻得到,生成UCLK,USB主機(jī)時(shí)鐘可以選擇UCLK或者HCLK,USB設(shè)備時(shí)鐘可選UCLK或者PCLK,所以,有時(shí)候初次接觸芯片看圖是一個(gè)很好的選擇,文字偏于細(xì)節(jié),看圖能很快瀏覽全貌,通過(guò)我們的分析可以得到下面這個(gè)再次簡(jiǎn)化的文檔
?
| ? 輸入時(shí)鐘 | MPLL | FCLK | HCLK | 內(nèi)存控制器,中斷控制器,nand控制器,tic控制器等,系統(tǒng)內(nèi)核920T,DMA控制器 |
| PCLK | 基本外設(shè)RTC,UART,spi等外設(shè) | |||
| 只供給系統(tǒng)內(nèi)核, | ||||
| USB PLL | UCLK | USB主機(jī)時(shí)鐘,usb設(shè)備時(shí)鐘 | ||
這就是系統(tǒng)時(shí)鐘的基本分布,剩下的細(xì)節(jié)無(wú)非就是如何分頻,如何啟用時(shí)鐘停止時(shí)鐘,鎖相環(huán)配置等等了,首先關(guān)注MPLL
這是PLL的鎖定時(shí)間,一般設(shè)置小一點(diǎn)查詢是否鎖定成功就好
這三個(gè)值搭配就可以選擇不同的MCLK了,數(shù)據(jù)手冊(cè)上有公式,經(jīng)過(guò)MPLL倍頻,就成功地獲得了系統(tǒng)主時(shí)鐘FCLK(也就是ARM920T時(shí)鐘)
通過(guò)這個(gè)寄存器進(jìn)行時(shí)鐘的使能與切斷,要使用外設(shè)的時(shí)候不要忘記這個(gè)寄存器
該寄存器確認(rèn)以一種什么樣的比例將FCLK分頻為HCLK和PCLK
到這里基本上就描述完了系統(tǒng)時(shí)鐘,只要弄清楚框架其實(shí)時(shí)鐘也挺簡(jiǎn)單的,分頻系數(shù),功率控制,最主要要弄清楚哪個(gè)設(shè)備用了哪個(gè)時(shí)鐘就OK了
?
接下來(lái)展示一段代碼用來(lái)計(jì)算系統(tǒng)時(shí)鐘(在2440init.s里面就有設(shè)置時(shí)鐘的過(guò)程,可以參考)
?
Clock.c
#include "clock.h"#define FIN (12000000) U32 FCLK; U32 HCLK; U32 PCLK; U32 UCLK;void CalcBusClk(void) //計(jì)算總線頻率 {U32 val,UPLL;U8 m, p, s;val = rMPLLCON;m = (val >> 12) & 0xff;p = (val >> 4) & 0x3f;s = val & 3;FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<<s))*100;val = rCLKDIVN;m = (val >> 1) & 3;p = val & 1; val = rCAMDIVN;s = val >> 8;switch (m) {case 0:HCLK = FCLK;break;case 1:HCLK = FCLK >> 1;break;case 2:if(s & 2)HCLK = FCLK >> 3;elseHCLK = FCLK >> 2;break;case 3:if(s & 1)HCLK = FCLK / 6;elseHCLK = FCLK / 3;break;}if(p)PCLK = HCLK >> 1;elsePCLK = HCLK;val = rUPLLCON;m = (val >> 12) & 0xff;p = (val >> 4) & 0x3f;s = val & 3;UPLL = ((m+8)*FIN)/((p+2)*(1<<s));UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL; }//************************[ HCLK, PCLK ]*************************** void ChangeClockDivider(int hdivn_val,int pdivn_val) {int hdivn=2, pdivn=0;// hdivn_val (FCLK:HCLK)ratio hdivn// 11 1:1 (0)// 12 1:2 (1)// 13 1:3 (3) // 14 1:4 (2)// pdivn_val (HCLK:PCLK)ratio pdivn// 11 1:1 (0)// 12 1:2 (1)switch(hdivn_val) {case 11: hdivn=0; break;case 12: hdivn=1; break;case 13:case 16: hdivn=3; break;case 14: case 18: hdivn=2; break;}switch(pdivn_val) {case 11: pdivn=0; break;case 12: pdivn=1; break;}rCLKDIVN = (hdivn<<1) | pdivn;switch(hdivn_val) {case 16: // when 1, HCLK=FCLK/8.rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<8); break; case 18: // when 1, HCLK=FCLK/6.rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<9); break;}if(hdivn!=0)MMU_SetAsyncBusMode();else MMU_SetFastBusMode(); }//**************************[ UPLL ]******************************* void ChangeUPllValue(int mdiv,int pdiv,int sdiv) {rUPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv; }//***************************[ MPLL ]**************************** void ChangeMPllValue(int mdiv,int pdiv,int sdiv) {rMPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv; }//*************************時(shí)鐘配置函數(shù)***************************** void SetClock(u8 mpll) {if(mpll == MPLL271){ChangeMPllValue(173,2,2); }else if(mpll == MPLL304){ChangeMPllValue(68,1,1);}else if(mpll == MPLL405){ChangeMPllValue(127,2,1);}else if(mpll == MPLL532){ChangeMPllValue(125,1,1);}ChangeClockDivider(14,12); //設(shè)置分頻比為1:4:8 fclk hclk pclk //并設(shè)置cpu異步總線模式CalcBusClk(); //計(jì)算總線頻率}Clock.h
#ifndef __CLOCK_H_ #define __CLOCK_H_ #include "def.h" #include "2440addr.h" #include "2440slib.h"#define FIN (12000000) //外部晶振 #define MPLL271 1 //幾個(gè)典型的時(shí)鐘宏定義 #define MPLL304 2 #define MPLL405 3 #define MPLL532 4void CalcBusClk(void); //計(jì)算總線頻率 void ChangeClockDivider(int hdivn_val,int pdivn_val);//計(jì)算分頻數(shù)值 void ChangeUPllValue(int mdiv,int pdiv,int sdiv);//配置usb總線 void ChangeMPllValue(int mdiv,int pdiv,int sdiv); void SetClock(u8 mpll);//配置系統(tǒng)時(shí)鐘extern U32 FCLK; extern U32 HCLK; extern U32 PCLK; extern U32 UCLK;#endif現(xiàn)在有了幾個(gè)系統(tǒng)時(shí)鐘的具體數(shù)字,我們就可以很好的進(jìn)行外設(shè)時(shí)鐘的配置了
?
注意,設(shè)置系統(tǒng)時(shí)鐘的時(shí)候HCLK如果太大會(huì)導(dǎo)致取值SDRAM跟不上,為了解決這個(gè)問(wèn)題,三星說(shuō)了這樣一個(gè)方案,大家要注意哦:
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/dengxiaojun/p/4279420.html
總結(jié)
以上是生活随笔為你收集整理的S3C2440时钟系统详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 高行健---江西赣州人
- 下一篇: 【大数据论文笔记】大数据技术研究综述