关于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 程序调用返回指令