OK6410时钟配置

一、时钟源的选择

        时钟源的选择内部时钟会产生用于外部的时钟源,其说明如表 3-1 所示。当外部复位信号被声明时,OM[4:0]引脚决定了 S3C6410的操作模式。OM[0]引脚选择外部时钟源,例如,如果OM[0]是 0,则 XXTIpll(外部晶体)被选择。否则,XEXTCLK(外部时钟输入)被选择。在OK6410板上是外接12M晶振。如下图所示:

                              OK6410时钟配置_第1张图片

二、锁相环(PLL)

            S3C6410 内部的三个PLL,分别是 APLL, MPLL和 EPLL。带有一个参考输入时钟操作频率和相位的同步
输出信号。在这个应用当中,包括基本模块的说明,如图 3-3 所示。电压控制振荡器(VCO)产生的输出频
率成正比,输入到直流电压。通过P,前置配器划分输入频率(FIN)。通过 M,主分频器分割 VCO的输出
频率,用于输入到相位频率检测器,(PFD)。通过 S,post 定标器划分为 VCO 的输出频率。相位差探测
器计算相位差和电荷泵的增加/减少输出电压。每个 PLL的输出时钟频率是可以计算的。如下图所示:

OK6410时钟配置_第2张图片

三、PLL  和输入参考时钟之间时钟选择

          S3C6410 有三个 PLL,APLL 用于 ARM 时钟操作,MPLL 用于
主时钟操作,EPLL 用于特殊用途。时钟操作被分为三组。第一组是ARM时钟,从 APLL产生。MPLL产生主
系统时钟,用于操作AXI,AHB 和APB总线操作。最后一组是从 EPLL产生的,产生的时钟主要用于外设 IP’
s,例如,UART,IIS 和 IIC 等等,如下图所示。各总路线的外设时钟,就不一一例举了,当我们要用到时可以去手册上查找各自的应用。

        

四、设置系统时钟相关寄存器

              在6410中,跟系统时钟设置相关寄存器有下面一些:

OK6410时钟配置_第3张图片

还有一个OTHER的寄存器,需要设置

下面是自己总结的设置时钟的基本流程:

                                                        OK6410时钟配置_第4张图片

附上C程序和汇编程序:

汇编程序:

[cpp]  view plain copy
  1. .globl clock_init  
  2.   
  3. clock_init:  
  4.       
  5.     /* 1.设置LOCK_TIME */  
  6.     ldr r0, =0x7E00F000  /* APLL_LOCK */  
  7.     ldr r1, =0x0000FFFF  
  8.     str r1, [r0]  
  9.       
  10.     str r1, [r0, #4]     /* MPLL_LOCK */  
  11.     str r1, [r0, #8]     /* EPLL_LOCK */      
  12.       
  13. #define OTHERS      0x7e00f900  
  14.     @ set async mode  /* 当CPU时钟 != HCLK时,要设为异步模式 */  
  15.     ldr r0, =OTHERS  
  16.     ldr r1, [r0]  
  17.     bic r1, #0xc0             
  18.     str r1, [r0]  
  19.   
  20. loop1:              /* 等待,直到CPU进入异步模式 */  
  21.     ldr r0, =OTHERS  
  22.     ldr r1, [r0]  
  23.     and r1, #0xf00                    
  24.     cmp r1, #0  
  25.     bne loop1         
  26.       
  27.     /* SYNC667 */  
  28.     /* MISC_CON[19] = 0 */  
  29.   
  30. #define ARM_RATIO    0   /* ARMCLK = DOUTAPLL / (ARM_RATIO + 1)    */  
  31. #define HCLKX2_RATIO 1   /* HCLKX2 = HCLKX2IN / (HCLKX2_RATIO + 1) */  
  32. #define HCLK_RATIO   1   /* HCLK = HCLKX2 / (HCLK_RATIO + 1)       */  
  33. #define PCLK_RATIO   3   /* PCLK   = HCLKX2 / (PCLK_RATIO + 1)     */  
  34. #define MPLL_RATIO   0   /* DOUTMPLL = MOUTMPLL / (MPLL_RATIO + 1)     */  
  35.     ldr r0, =0x7E00F020  /* CLK_DIV0 */  
  36.     ldr r1, =(ARM_RATIO) | (MPLL_RATIO << 4) | (HCLK_RATIO << 8) | (HCLKX2_RATIO << 9) | (PCLK_RATIO << 12)  
  37.     str r1, [r0]  
  38.       
  39.     /* 2.配置时钟 */  
  40.     /* 2.1 配置APLL */  
  41.     /* 2.1.1 设置APLL 
  42.      * 2.1.2 MUXAPLL 
  43.      * 2.1.3 SYNC667 
  44.      * 2.1.4 DIVAPLL 
  45.      */  
  46. #define APLL_CON_VAL  ((1<<31) | (266 << 16) | (3 << 8) | (1))  
  47.     ldr r0, =0x7E00F00C  
  48.     ldr r1, =APLL_CON_VAL  
  49.     str r1, [r0]        /* APLL_CON, FOUTAPL = MDIV * Fin / (PDIV*2^SDIV) = 266*12/(3*2^1) = 532MHz  */  
  50.       
  51.     /* 2.2 配置MPLL */  
  52.     /* 2.2.1 设置MPLL 
  53.      * 2.2.2 MUXMPLL 
  54.      * 2.2.3 SYNCMUX 
  55.      * 2.2.4 SYNC667 
  56.      * 2.2.5 HCLKX2_RATIO 
  57.      * 2.2.6 PCLK_RATIO 
  58.      */  
  59. #define MPLL_CON_VAL  ((1<<31) | (266 << 16) | (3 << 8) | (1))  
  60.     ldr r0, =0x7E00F010  
  61.     ldr r1, =MPLL_CON_VAL  
  62.     str r1, [r0]        /* MPLL_CON, FOUTMPL = MDIV * Fin / (PDIV*2^SDIV) = 266*12/(3*2^1) = 532MHz  */  
  63.       
  64.     /* 3.选择PLL的输出作为时钟源 */  
  65.     ldr r0, =0x7E00F01C  
  66.     ldr r1, =0x03  
  67.     str r1, [r0]  


 

C程序:

[cpp]  view plain copy
  1. /*************************************************************************/  
  2. /*名称:系统时钟设置                                                     */  
  3. /*参数:ARM_CLK=532 HCLK=133 HCLKX2=266 PCLK=66.5                        */  
  4. /*************************************************************************/  
  5.   
  6. #define rAPLL_LOCK     (*((volatile unsigned long *)0x7E00F000))  
  7. #define rMPLL_LOCK     (*((volatile unsigned long *)0x7E00F004))  
  8. #define rEPLL_LOCK     (*((volatile unsigned long *)0x7E00F008))  
  9. #define rAPLL_CON      (*((volatile unsigned long *)0x7E00F00C))  
  10. #define rMPLL_CON      (*((volatile unsigned long *)0x7E00F010))  
  11. #define rCLK_SRC       (*((volatile unsigned long *)0x7E00F01C))  
  12. #define rCLK_DIV0      (*((volatile unsigned long *)0x7E00F020))  
  13. #define rCLK_DIV1      (*((volatile unsigned long *)0x7E00F024))  
  14. #define rCLK_DIV2      (*((volatile unsigned long *)0x7E00F028))  
  15. #define rOTHERS        (*((volatile unsigned long *)0x7E00F900))  
  16.   
  17. #define ARM_RATIO     0   /* ARMCLK = DOUTAPLL / (ARM_RATIO + 1)    */  
  18. #define HCLKX2_RATIO  1   /* HCLKX2 = HCLKX2IN / (HCLKX2_RATIO + 1) */  
  19. #define HCLK_RATIO    1   /* HCLK = HCLKX2 / (HCLK_RATIO + 1)       */  
  20. #define PCLK_RATIO    3   /* PCLK   = HCLKX2 / (PCLK_RATIO + 1)     */  
  21. #define MPLL_RATIO    0   /* DOUTMPLL = MOUTMPLL / (MPLL_RATIO + 1)     */  
  22.   
  23. #define SDIV    1  
  24. #define PDIV    3  
  25. #define MDIV    266  
  26. #define EN    1         //使能PLL  
  27.   
  28.   
  29. void Clock_Init()  
  30. {  
  31.     rAPLL_LOCK = 0x0000ffff;  
  32.     rMPLL_LOCK = 0x0000ffff;  
  33.     rEPLL_LOCK = 0x0000ffff; //时钟锁存时间设定  
  34.   
  35.     rOTHERS &= ~( 3 << 6); //将时钟设置成异步模式  
  36.   
  37.     while( (rOTHERS & 0xf00) != 0 );//等待进入异步模式  
  38.   
  39.     rCLK_DIV0 = ARM_RATIO | (MPLL_RATIO << 4) | (HCLK_RATIO << 8) | (HCLKX2_RATIO << 9) | (PCLK_RATIO << 12);//设置CLK_DIV0的分频参数  
  40.   
  41.     rAPLL_CON = SDIV | (PDIV << 8) | (MDIV << 16) | (EN << 31);//设置FOUT=532M  
  42.     rMPLL_CON = SDIV | (PDIV << 8) | (MDIV << 16) | (EN << 31);//设置FOUT=532M  
  43.   
  44.     rCLK_SRC = 0x03;//时钟源选择}  

你可能感兴趣的:(ARM)