设为首页 加入收藏

TOP

S3C2440时钟设置(一)
2014-11-24 08:05:31 来源: 作者: 【 】 浏览:0
Tags:S3C2440 时钟 设置

S3C2440时钟设置


#define MDIV_405 0x7f << 12


#define PSDIV_405 0x21


#define LOCKTIME_OFFSET 0x00


#define MPLLCON_OFFSET 0x04


#define CLKCON_OFFSET 0x0c


#define CLKDIVN_OFFSET 0x14


#define CAMDIVN_OFFSET 0x18


/*******************************************************************************************


* Reference to S3C2440 datasheet: Chap 7 Clock&Power Management


*


* Initialize System Clock FCLK=400MHz HCLK=100MHz PCLK=50MHz


* FCLK is used by ARM920T


* HCLK is used for AHB bus, which is used by the ARM920T, the memory controller,


* the interrupt controller, the LCD controller, the DMA and USB host block.


* PCLK is is used for APB bus,which is used by the peripherals such as WDT,IIS,I2C,


* PWM timer,MMC interface,ADC,UART,GPIO,RTC and SPI.


******************************************************************************************/



/*Set LOCKTIME as default value 0x00ffffff*/


ldr r0, =ELFIN_CLOCK_POWER_BASE


ldr r1, =0x00ffffff


str r1, [r0, #LOCKTIME_OFFSET] /*Set Clock Divider*/



/*******************************************************************************************


* Reference to S3C2440 datasheet: Chap 7-8 ~ Page 242


*


* Set the selection of Dividing Ratio between FCLK,HCLK and PCLK as FCLK:HCLK:PCLK = 1:4:8.


* This ratio is determined by HDIVN(here is 2) and PDIVN(here is 1) control register.


* Refer to the s3c2440 datasheet


*******************************************************************************************/



ldr r0, =ELFIN_CLOCK_POWER_BASE


mov r1, #5


str r1, [r0, #CLKDIVN_OFFSET] /*Set Clock Divider*/


mrc p15, 0, r1, c1, c0, 0


orr r1, r1, #0xc0000000


mcr p15, 0, r1, c1, c0, 0


/***************************************************************************************


* Reference to S3C2440 datasheet: Chap 7-20 ~ Page 254


*


* Set MPLLCON(0x4C000004) register as:


* [19:12]: MDIV(Main Divider control)=0x7F


* [9:4]: PDIV(Pre-devider control)=0x02


* [1:0]: SDIV(Post divider control)=0x01


*


* MPLL(FCLK) = (2 * m * Fin)/(p * 2^s)


* m=(MDIV+8), p=(PDIV+2), s=SDIV


*


* So FCLK=((2*(127+8)*Fin)) / ((2+2)*2^1)


* = (2*135*12MHz)/8


* = 405MHz


* For FCLK:HCLK:PCLK=1:4:8, so HCLK=100MHz, PCLK=50MHz


***************************************************************************************/



mov r1, #ELFIN_CLOCK_POWER_BASE


mov r2, #MDIV_405


add r2, r2, #PSDIV_405


str r2, [r1, #MPLLCON_OFFSET]


/* wait at least 200us to stablize all clock */


mov r2, #0x10000


1: subs r1, r1, #1


bne 1b


mov pc, lr


S3C2440 CPU默认的工作主频为12MHz或16.9344MHz,在我的2440的开发板上上使用的是12MHZ,这里使用最多的也是12M。使用PLL电路可以产生更高的主频供CPU及外围器件使用。


S3C2440有两个PLL:MPLL和UPLL,UPLL专用与USB设备。MPLL用于CPU及其他外围器件。


通过MPLL会产生三个部分的时钟频率:FCLK、HCLK、PLCK。FCLK用于CPU核,HCLK用于AHB总线的设备(比如SDRAM),PCLK用于APB总线的设备(比如UART)。


设置S3c2440的时钟频率就是设置MPLL的几个寄存器:


1、LOCKTIME:设为0x00ffffff


MPLL启动后需要等待一段时间(Lock Time),使得其输出稳定。位[23:12]用于UPLL,位[11:0]用于MPLL。使用确省值0x00ffffff即可。


2、CLKDIVN:用来设置FCLK:HCLK:PCLK的比例关系,默认为1:1:1


这里值设为0x05(HDIVN=2, PDIVN=1),即FCLK:HCLK:PCLK=1:4:8


3、MPLLCON:设为(0x7f << 12)|(0x02 << 4)|(0x01),即0x7f0021


对于MPLLCON寄存器,[19:12]为MDIV,[9:4]为PDIV,[1:0]为SDIV。有如下计算公式:


MPLL(FCLK) = (2 * m * Fin)/(p * 2^s)


m=(MDIV+8), p=(PDIV+2), s=SDIV Fin 即默认输入的时钟频率12MHz。MPLLCON设为0x7f0021,可以计算出FCLK=400MHz,再由CLKDIVN的设置可知:HCLK=100MHz,PCLK=50MHz。


到这里我们应该彻底弄清楚了程序中经常出现的几个CLK:


Fin,MPLL,UPLL,FCLK,HCLK,PCLK.


Fin指CPU外围接

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇U-Boot整个过程时钟部分解析 下一篇ARM FP寄存器及frame pointer介绍

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·每日一道面试题-多线 (2025-12-26 06:20:17)
·java项目中哪些地方 (2025-12-26 06:20:14)
·Java真的是要没落了 (2025-12-26 06:20:12)
·C++ Lambda表达式保 (2025-12-26 05:49:45)
·C++ Lambda表达式的 (2025-12-26 05:49:42)