Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / 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, #0x100001:  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:设为0x00ffffffMPLL启动后需要等待一段时间(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:83、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外围接的晶振本身的频率,通常为12MHz。MPLL和UPLL分别指的是用于供整机系统的PLL和专用于USB的UPLL。FCLK = MPLL = (m * Fin)/(p + 2^s);HCLK,PCLK受CLKDIVN寄存器的影响,即当FCLK确定后,CLKDIVN决定了HCLK和PCLK