S3C6410时钟初始化

原创 2013年12月02日 14:14:37

个人原创,转载请注明出处:  http://blog.csdn.net/hongkangwl/article/details/17070927


S3C6410有三个PLL,分别为APLL、MPLL和EPLL。
其中APLL产生ACLK,给arm core使用,
MPLL产生HCLKX2、HCLK和PCLK,
EPLL产生特殊的时钟,比如为USB提供48MHz时钟


可以看到,外部时钟(一般为12M)经过APLL后再经过设置分频系数DIVARM后产生供ARM核使用的ARMCLK;

外部时钟经过MPLL后经过分频系数DIV_HCLKX2后产生时钟HCLKX2;

时钟HCLKX2经过分频系数DIV_HCLK后产生时钟HCLK;

时钟HCLKX2经过分频系数DIV_PCLK后产生时钟PCLK;

一般在设置时钟时,三星官网有推荐的值,那么我们只需设置官方提供的几个系数就OK了。


S3C6410 系统时钟初始化步骤:
1.设置同步或异步模式;
2.设置时钟分频系数;
3.设置 PLL 控制器;
4.选择 PLL 输出时钟为系统时钟源。

时钟的设置涉及到如下几个寄存器的设置:

#define CLK_DIV0 0x7e00f020
#define OTHERS 0x7e00f900
#define MPLL_CON 0x7e00f010
#define APLL_CON 0x7e00f00c
#define CLK_SRC 0x7e00f01c
#define DIV_VAL ((0x0<<0)|(0x1<<9)|(0x1<<8)|(0x3<<12))
#define PLL_VAL ((1<<31)|(266<<16)|(3<<8)|(1<<0))

1,设置同步异步是通过others寄存器完成:



设置成同步模式通过如下代码完成:

	ldr r0, =OTHERS
	ldr r1, [r0]
	bic r1,r1,#0xc0
	str r1, [r0]
2.设置时钟分频系数:

首先需要设置HCLKX2_RATIO,然后再设置ARM_RATIO、PCLK_RATIO、HCLK_RATIO,在这里我们设置ARM_RATIO=0、PCLK_RATIO=1、HCLK_RATIO=1、HCLKX2_RATIO=1,设置代码如下:

	ldr r0, =CLK_DIV0
	ldr r1, =DIV_VAL
	str r1, [r0]

3设置PLL控制器:

PLL控制寄存器有APLL_CON和MPLL_CON



在这里设置MDIV=266 PDIV=3 SDIV =1;

代码如下:

	ldr r0, =MPLL_CON
	ldr r1, =PLL_VAL
	str r1, [r0]

经过设置后,根据上图中Fout的计算公式:FOUT= 266*12、(2*3) = 533M HZ;

APLL_CON的设置相似:


在这里设置MDIV=266 PDIV=3 SDIV =1;

计算结果亦为533M HZ

4 时钟源设置

CLK_SRC



通过设置CLK_SRC的第0位和第一位,使后端的时钟分别为APLL 和MPLL,

设置如下:

	ldr r0, =CLK_SRC
	mov r1, #0x3
	str r1, [r0]

这样,设置完成后ARMCLK为533M HZ

HCLKX2= 533/(1+1) = 266M HZ

HCLK = HCLKX2  / (1+1 )  = 133MHZ

PCLK = HCLKX2 /(3+1) = 66M HZ


初始化s3c6410时钟

关于时钟体系,以前其实我还真不清楚,或者说是没有注意到。 上了今天的课后知识注意到了几点,以后要注意到的 1晶振频率 2PLL 3PLL产生了多少时钟 4这些产生的时钟都拿去干嘛 我们采用的外部晶振频...
  • weixin_39162701
  • weixin_39162701
  • 2017年06月21日 22:48
  • 88

OK6410之uboot时钟初始化---嵌入式回归第十一篇

综合前面的博客,设置系统为SVC模式,关闭开门狗,关闭中断,关闭MMU和cache,基地址初始化,点亮一灯大师,这一小节根据前面的架构分析来完成时钟初始化部分。 1. 时钟脉冲信号概念: 时钟脉冲信号...
  • coding__madman
  • coding__madman
  • 2016年04月27日 20:14
  • 661

S3C6410之系统时钟

本小节主要介绍系统控制器在S3C6410 RISC 微处理器中的功能和使用。系统控制器由两部分组成: 分别是系统时钟控制和系统电源管理控制。系统时钟控制逻辑,在S3C6410 中生成所需的系统时钟信号...
  • u011308691
  • u011308691
  • 2013年11月17日 22:01
  • 1164

嵌入式学习-uboot-lesson9.1-C语言环境初始化

C语言环境的初始化是为了完成另外一些外设的初始化,如网口、串口等。毕竟在某些方面使用汇编没有C方便。 C语言环境的初始化主要完成以下几个方面的内容: 栈的初始化,BSS段的清除。一、栈初始化查找了...
  • u011003120
  • u011003120
  • 2016年07月02日 11:22
  • 543

汇编语言中出现#include, #define的问题

U_boot源文件中,一些 .S文件中出现了#include, #define,如board\smdk2410目录下的lowlevel_init.S文件: #include #include ...
  • u013083059
  • u013083059
  • 2014年01月14日 20:57
  • 1525

#define的用法总结

先来讲一讲#define的优点与缺点:[缺点] 宏定义有一些缺点: (1) 无法对宏定义中的变量进行类型检查 此缺点,是相对于const变量来说的 [define与co...
  • Jesons_
  • Jesons_
  • 2016年06月17日 19:16
  • 31315

#define的用法体会

#define 创建一个宏,该宏是标识符或参数化标识符与标记字符串的关联。 在定义宏之后,编译器可用标记字符串替换源文件中标识符的每个匹配项。 语法 #define identifier toke...
  • u013696062
  • u013696062
  • 2014年08月27日 09:26
  • 2025

#define 高级用法

一、LINUX C中用define定义可变参数的宏 一般在调试打印Debug信息的时候, 需要可变参数的宏. 从C99开始可以使编译器标准支持可变参数宏(variadic macros),...
  • NewThinker_wei
  • NewThinker_wei
  • 2013年05月07日 08:56
  • 5692

typedef和define的详细区别

原文链接:http://developer.51cto.com/art/201104/256060.htm typedef是一种在计算机编程语言中用来声明自定义数据类型,配合各种原有数据类型...
  • zhangbest2009
  • zhangbest2009
  • 2015年07月21日 11:03
  • 561

为什么不要工程中不要随意使用define定义常量

首先,预处理命令他不是一个常量!!!! 我们来看一段代码 #define avatar @"60" if (false) { #define avatar @"80" } N...
  • Quasimodor
  • Quasimodor
  • 2017年06月06日 12:18
  • 346
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:S3C6410时钟初始化
举报原因:
原因补充:

(最多只允许输入30个字)