飞凌OK6410之时钟的学习

来源:互联网 发布:做霓虹灯的软件 编辑:程序博客网 时间:2024/05/16 13:40

关于OK6410的时钟部分,从s3c6410的手册上面我们可以在system controller里面找到相关的系统控制器:


Power表示上电,待上电稳定后,12M晶振起振后也稳定下来,接着CPU就能获得一个比较稳定的时钟频率(12M)如果想要改变晶振的频率,我们就给他一个locktime,在locktime内,VCO就能够通过倍频处理将主频提高,locktime结束后,CPU就能在新的频率下面进行工作了

         下面可以进行设置locktime了

我们就设置为默认值

设置指令如下:

         /*1.设置LOCK_TIME */

         ldrr0, =0x7E00F000         /* APLL_LOCK */

         ldrr1, =0x0000FFFF

         strr1, [r0]

        

         strr1, [r0, #4]                 /* MPLL_LOCK */

         strr1, [r0, #8]                   /* EPLL_LOCK */   

 

 

 

 

 

 

从下图我们就可以看到具体哪个时钟是给哪些设备提供的

具体时钟对应的外设设备关系如下

紧接着我们需要设置时钟模式,当CPU工作时钟和内存的时钟不一样的时候,需要把CPU 的时钟模式设为异步模式设置指令 如下

#define OTHERS                0x7e00f900

@ set async mode  /* 当CPU时钟 != HCLK时,要设为异步模式 */

         ldrr0, =OTHERS

         ldrr1, [r0]

         bicr1, #0xc0                      

         strr1, [r0]

本人的理解是,因为s3c6410的手册上写明这个

默认就是0x00,所以不需要设置也行,待我检验之后再更改。

循环延时等待CPU进入异步模式

loop1:                                   /* 等待,直到CPU进入异步模式 */

         ldrr0, =OTHERS

         ldrr1, [r0]

         andr1, #0xf00                                     

         cmpr1, #0

         bneloop1         

接下来就可以设置分频了:

/* SYNC667 */

         /*MISC_CON[19] = 0 */

 

#define ARM_RATIO    0  /* ARMCLK = DOUTAPLL / (ARM_RATIO + 1)   */

#define HCLKX2_RATIO 1   /* HCLKX2 = HCLKX2IN / (HCLKX2_RATIO + 1) */

#define HCLK_RATIO   1   /*HCLK = HCLKX2 / (HCLK_RATIO + 1)       */

#define PCLK_RATIO   3   /*PCLK   = HCLKX2 / (PCLK_RATIO + 1)     */

#define MPLL_RATIO   0   /*DOUTMPLL = MOUTMPLL / (MPLL_RATIO + 1)    */

         ldrr0, =0x7E00F020  /* CLK_DIV0 */

         ldrr1, =(ARM_RATIO) | (MPLL_RATIO << 4) | (HCLK_RATIO << 8) |(HCLKX2_RATIO << 9) | (PCLK_RATIO << 12)

         strr1, [r0]

下面是配置时钟,配置结果为APLL和MPLL都为532M

         /*2.配置时钟 */

         /*2.1 配置APLL */

         /*2.1.1 设置APLL

          * 2.1.2 MUXAPLL

          * 2.1.3 SYNC667

          * 2.1.4 DIVAPLL

          */

#define APLL_CON_VAL  ((1<<31) | (266 << 16) | (3<< 8) | (1))

         ldrr0, =0x7E00F00C

         ldrr1, =APLL_CON_VAL

         strr1, [r0]                  /* APLL_CON,FOUTAPL = MDIV * Fin / (PDIV*2^SDIV) = 266*12/(3*2^1) = 532MHz  */

        

         /*2.2 配置MPLL */

         /*2.2.1 设置MPLL

          * 2.2.2 MUXMPLL

          * 2.2.3 SYNCMUX

          * 2.2.4 SYNC667

          * 2.2.5HCLKX2_RATIO

          * 2.2.6 PCLK_RATIO

          */

#define MPLL_CON_VAL  ((1<<31) | (266 << 16) | (3<< 8) | (1))

         ldrr0, =0x7E00F010

         ldrr1, =MPLL_CON_VAL

         strr1, [r0]                  /* MPLL_CON,FOUTMPL = MDIV * Fin / (PDIV*2^SDIV) = 266*12/(3*2^1) = 532MHz  */

         最后这里低两位为1表示选择PLL,如果是0的话表示选择外部晶振时钟作为时钟源,这也就是为什么不需要初始化时钟,我们也可以进行点灯程序的原因(默认工作在12M下面)

         /*3.选择PLL的输出作为时钟源 */

         ldrr0, =0x7E00F01C

         ldrr1, =0x03

         strr1, [r0]

        

         movpc, lr                   程序调用返回指令