飞凌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 程序调用返回指令
- 飞凌OK6410之时钟的学习
- 飞凌OK6410学习之中断的学习
- 飞凌OK6410学习之串口的学习
- 飞凌OK6410之异常模式的学习
- 飞凌Ok6410之SDRAM的学习
- 飞凌OK6410之IIC的学习1
- 飞凌OK6410之IIC的学习2
- 飞凌OK6410之LCD的学习
- 飞凌OK6410之触摸屏的学习
- OK6410之触摸屏的学习
- 飞凌OK6410学习之看门狗
- 飞凌OK6410学习之中断的学习 继续。。
- (11)ok6410学习之芯片内部初始化之时钟初始化
- OK6410驱动学习之first_drv
- ok6410学习之触摸屏篇
- ok6410学习之触摸屏篇
- OK6410之uboot时钟初始化---嵌入式回归第十一篇
- (8)ok6410学习之自己的bootloader编写架构
- VS项目属性的一些配置项的总结(important)
- ecshop 修改首页flash广告图片的宽高
- Ubuntu 下安装 OpenSSH Server
- 减少全局变量污染 -- javacript语言精粹
- java绘制国际棋盘(组件实现,Graphics画布)
- 飞凌OK6410之时钟的学习
- 简单介绍 "&&" 与 “&” 和 ”|“ 与 ”||“ 的区别
- eclipse智能提示
- mondrian3.5 + jpivot搭建
- Cunit windows与Linux环境搭建实例
- python实现jms客户端(发送接收消息)
- GridCtrl 在 VS2010中使用
- No3、求子数组的最大和(数组)
- 用tcp/ip进行网络连接(第2-5章 笔记)