s5pv210——时钟系统

以下内容源于朱友鹏《物联网大讲坛》课程的学习,以及博客http://www.cnblogs.com/biaohc/p/6349195.html,以及用户手册,如有侵权,请告知删除。


一、s5pv210的时钟域

(1)MSYS Domain

  • 为处理器、3D、intc(中断)、DMC0、DMC1、IRAM、IROM提供时钟;
  • HCLK_MSYS:200MHZ(DM0、DM1使用)
  • PCLK_MSYS:100MHz
  • ARMCLK:1000MHZ(cpu主频)
  • HCLK_IMEM:100MHZ(IROM、IRAM使用)

(2)DSYS Domain

  • 为音视频等设备提供时钟;
  • HCLK_DSYS:166MHZ
  • PCLK_DSYS:83MHz

(3)PSYS Domain

  • 为外设提供时钟,如GPIO、I2C、PWM、UART、WDT等。
  • HCLK_PSYS:133MHZ
  • PCLK_PSYS:66MHz

s5pv210——时钟系统_第1张图片


二、s5pv210的晶振

1、s5pv210有四个晶振

(1)XRTCXTI

  • 提供32.768KHz,RTC 使用;
  • XRTCXTI and XRTCXTO pins

(2)XXTI

  • CMU and PLL使用这个时钟,为APLL、MPLL、VPLL、EPLL提供时钟。
  • 推荐频率24MHz。
  • XXTI and XXTO pins。

(3)XUSBXTI

  • 为APLL、MPLL、VPLL、EPLL、USB PHY提供时钟。
  • 推荐24MHz。
  • XUSBXTI and XUSBXTO pins

(4)XHDMIXTI :

  • 27MHz,VPLL、HDMI PHY为TV解码器提供54MHz时钟。
  • XHDMIXTI and XHDMIXTO pins。
s5pv210——时钟系统_第2张图片


三、s5pv210推荐时钟设置


s5pv210——时钟系统_第3张图片
根据推荐值来设置相应的MUX开关、PLL锁相环倍频、DIV分频器的值来得到相应的时钟。

s5pv210——时钟系统_第4张图片



四、时钟设置的关键性寄存器

1、xPLL_LOCK寄存器

(1)设置锁定周期,一般为默认值。因为PLL倍频需要一定时间才能达到相应的频率。

s5pv210——时钟系统_第5张图片

s5pv210——时钟系统_第6张图片

2、xPLL_CON,xPLL_CON0,xPLL_CON1

(1)用来打开或关闭PLL电路,设置倍频参数,查看PLL锁定状态等。

(2)APLL_CON0/APLL_CON1, R/W, Address =0xE010_0100/0xE010_0104

s5pv210——时钟系统_第7张图片

s5pv210——时钟系统_第8张图片

设置APLL的倍频率:FOUT = MDIV X FIN / (PDIV × 2^(SDIV)-1)

如1000MHZ,则1000=125*24 / (3*2^1-1)

(3)MPLL_CON, R/W, Address = 0xE010_0108

s5pv210——时钟系统_第9张图片

s5pv210——时钟系统_第10张图片

设置MPLL的倍频率:FOUT = MDIV X FIN / (PDIV X 2^(SDIV))

上述的1、2是用来控制锁相环相关的。

3、CLK_SRCn(n=0~6)、CLK_SRC_MASKn(n=0~6)

(1)设置MUX开关;

(2)如CLK_SRC0寄存器。首先要关闭4个PLL的MUX开关,设置好相应寄存器以后再把PLL的MUX开关打开。

s5pv210——时钟系统_第11张图片

s5pv210——时钟系统_第12张图片

4、CLK_DIVn寄存器

(1)主要是设置各个分频器的值

(2)如CLK_DIV0寄存器

s5pv210——时钟系统_第13张图片

s5pv210——时钟系统_第14张图片



五、代码实战

#define _REG_APLL_LOCK            *((unsigned int*)0xE0100000)
#define _REG_MPLL_LOCK            *((unsigned int*)0xE0100008)
#define _REG_EPLL_LOCK            *((unsigned int*)0xE0100010)
#define _REG_VPLL_LOCK            *((unsigned int*)0xE0100020)
#define _REG_APLL_CON0            *((unsigned int*)0xE0100100)
#define _REG_MPLL_CON            *((unsigned int*)0xE0100108)
#define _REG_CLK_SRC0            *((unsigned int*)0xE0100200)
#define _REG_CLK_DIV0            *((unsigned int*)0xE0100300)

#define APLL_SDIV                (1)
#define APLL_PDIV                (3)
#define APLL_MDIV                (125)
#define APLL_EN                    (1)

#define MPLL_SDIV                (1)
#define MPLL_PDIV                (12)
#define MPLL_MDIV                (667)
#define MPLL_EN                    (1)

void clock_init(void)
{
    //第一步关闭PLL的MUX开关
    _REG_CLK_SRC0 = 0x0;
    
    //第二步设置LOCK时间,设置为默认值0x0FFF
    _REG_APLL_LOCK = 0x0FFF;
    _REG_MPLL_LOCK = 0x0FFF;
    _REG_EPLL_LOCK = 0x0FFF;
    _REG_VPLL_LOCK = 0x0FFF;
    
    //第三步设置DIV分频器的值    
    _REG_CLK_DIV0 = 0x14131400;
    
    //第四步设置APLL、MPLL的倍频值。
    _REG_APLL_CON0 = (APLL_EN<<31) | (APLL_MDIV<<16) | (APLL_PDIV<<8) | (APLL_SDIV<<0);
    _REG_MPLL_CON  = (MPLL_EN<<31) | (MPLL_MDIV<<16) | (MPLL_PDIV<<8) | (MPLL_SDIV<<0);
    
    //第五步设置MUX开关
    _REG_CLK_SRC0 = 0x1111;    
        
    
}


你可能感兴趣的:(ARM裸机)