S3C2440时钟电源管理

S3C2440的时钟可以选用晶振(XTAL),也可以使用外部时钟(EXTCLK),由系统复位时,在复位信号上升沿对引脚OM3、OM2所测的状态来确定。由于我所用的开发板这两个引脚接地,故外部晶振作为主锁相环(MPLL)和usb锁相环(UPLL)的时钟源。

含有两个锁相环MPLL、UPLL产生系统所需要的不同频率的时钟
MPLL:
 为CPU产生FCLK时钟
 为AHB产生HCLK时钟
 为APB产生PCLK时钟

UPLL:
 为usb(Host and Device)产生UCLK(48M)


FCLK,HCLK和 PCLK 
FCLK是提供给ARM920T 的时钟。 
HCLK 是提供给用于 ARM920T,存储器控制器,中断控制器,LCD 控制器,DMA 和 USB 主机模块的 AHB
总线的时钟。 
PCLK 是提供给用于外设如WDT,IIS,I2C,PWM 定时器,MMC/SD 接口,ADC,UART,GPIO,RTC 和
SPI的APB 总线的时钟。


下图为PLL(锁相环)方框图

设置FCLK要用到PLL控制寄存器MPLLCON

例如:如果外部晶振Fin为12MHZ,设置FCLK为400MHZ,

由公式Fout = 2 × m × Fin / ( p*2^s) 此处:m =MDIV+8, p=PDIV+2, s=SDIV

可知rMPLLCON=((92<<12)|(1<<4)|1)    其中(MDIV=92, PDIV=1,SDIV=1)。

下面的这个函数是配置FCLK HCLK PCLK的比例的函数,用到时钟分频寄存器CLKDIVN

[cpp]  view plain  copy
  1. void ChangeClockDivider(int hdivn,int pdivn)  
  2. {  
  3.      // hdivn,pdivn FCLK:HCLK:PCLK  
  4.      //     0,0         1:1:1   
  5.      //     0,1         1:1:2   
  6.      //     1,0         1:2:2  
  7.      //     1,1         1:2:4  
  8.      //     2,0         1:4:4  
  9.      //     2,1         1:4:8  
  10.      //     3,0         1:3:3  
  11.      //     3,1         1:3:6  
  12.     rCLKDIVN = (hdivn<<1) | pdivn;      
  13.   
  14.     if (hdivn == 2)  
  15.         rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<9);             
  16.     if (hdivn == 3)  
  17.         rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<8);  
  18. }  


 

[cpp]  view plain  copy
  1. //**************************[ UPLL ]*******************************  
  2. void ChangeUPllValue(int mdiv,int pdiv,int sdiv)    //配置UPLLCON寄存器  
  3. {  
  4.     rUPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;  
  5. }  
[cpp]  view plain  copy
  1. void CalcBusClk(void)   //计算总线频率  
  2. {  
  3.     U32 val;  
  4.     U8 m, p, s;  
  5.     val = rMPLLCON;  
  6.     m = (val >> 12) & 0xff;  
  7.     p = (val >> 4) & 0x3f;  
  8.     s = val & 3;  
  9.   
  10.     //(m+8)*FIN*2 不要超出32位数!  
  11.     FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<<s))*100;    //计算FCLK频率  
  12.       
  13.     val = rCLKDIVN;  
  14.     m = (val >> 1) & 3;   //HDIVN 的值  
  15.     p = val & 1;        //PDIVN 的值  
  16.     val = rCAMDIVN;  
  17.     s = val >> 8;     //CAMDIVN[8:9],为HDIVN分频改变位  
  18.       
  19.     switch (m)      //计算HCLK频率  
  20.     {  
  21.         case 0:  
  22.             HCLK = FCLK;  
  23.             break;  
  24.         case 1:  
  25.             HCLK = FCLK >> 1;  
  26.             break;  
  27.         case 2:  
  28.             if(s & 2)   //见CAMDIVN寄存器HCLK4_HALF  
  29.                 HCLK = FCLK >> 3;  
  30.             else  
  31.                 HCLK = FCLK >> 2;  
  32.             break;  
  33.         case 3:  
  34.             if(s & 1)   //见CAMDIVN寄存器HCLK3_HALF  
  35.                 HCLK = FCLK / 6;  
  36.             else  
  37.                 HCLK = FCLK / 3;  
  38.             break;  
  39.     }  
  40.       
  41.     if(p)       //计算PCLK频率  
  42.         PCLK = HCLK >> 1;  
  43.     else  
  44.         PCLK = HCLK;  
  45.           
  46.     val = rUPLLCON;  
  47.     m = (val >> 12) & 0xff;  
  48.     p = (val >> 4) & 0x3f;  
  49.     s = val & 3;  
  50.     UPLL = ((m+8)*FIN)/((p+2)*(1<<s));  
  51.     UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;   //计算UCLK频率  
  52. }  

 

 下图为外部时钟为晶振时的上电复位顺序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值