在讲述系统时钟之前,因为这些设备都是挂靠在系统时钟上的,所以必须先说系统时钟,S3C2440的时钟系统如下

外部时钟源分两种,晶振或者外部频率,由om3-2选择,时钟电路根据两种选择也有两种

我们来分析时钟图可以得到以下结论: 
经过选择的外部时钟进入MPLL,进行锁相环倍频,经过锁相环之后的时钟MPLL_IN分成了三股,分别是FCLK,HCLK,PCLK.这其中HCLK和PCLK又是从HCLK分频得到的,最后ARM920T这个系统内核模块得到了两个时钟HCLK和FCLK,DMA控制器,LCD控制器,内存控制器,总线控制器,外部nand控制器和TIC,摄像头接口都来自于HCLK时钟,LCD控制器,nand控制器,cam摄像头控制器的时钟可以选择从总线上切断开来,IIC
WDT IIS PWM SDI GPIO ADC RTC UART012 SPI AC97这些外设都挂接在PCLK总线上,而且除了WDT外,都可以断开和总线的连接,另外USB时钟直接从MPLL_IN倍频得到,生成UCLK,USB主机时钟可以选择UCLK或者HCLK,USB设备时钟可选UCLK或者PCLK,所以,有时候初次接触芯片看图是一个很好的选择,文字偏于细节,看图能很快浏览全貌,通过我们的分析可以得到下面这个再次简化的文档

输入时钟

MPLL

FCLK

HCLK

内存控制器,中断控制器,nand控制器,tic控制器等,系统内核920T,DMA控制器

PCLK

基本外设RTC,UART,spi等外设

只供给系统内核,

USB PLL

UCLK

USB主机时钟,usb设备时钟

这就是系统时钟的基本分布,剩下的细节无非就是如何分频,如何启用时钟停止时钟,锁相环配置等等了,首先关注MPLL

这是PLL的锁定时间,一般设置小一点查询是否锁定成功就好

这三个值搭配就可以选择不同的MCLK了,数据手册上有公式,经过MPLL倍频,就成功地获得了系统主时钟FCLK(也就是ARM920T时钟)

通过这个寄存器进行时钟的使能与切断,要使用外设的时候不要忘记这个寄存器

该寄存器确认以一种什么样的比例将FCLK分频为HCLK和PCLK

到这里基本上就描述完了系统时钟,只要弄清楚框架其实时钟也挺简单的,分频系数,功率控制,最主要要弄清楚哪个设备用了哪个时钟就OK了

接下来展示一段代码用来计算系统时钟(在2440init.s里面就有设置时钟的过程,可以参考)

Clock.c

#include "clock.h"

#define FIN 	(12000000)	

U32 FCLK;
U32 HCLK;
U32 PCLK;
U32 UCLK; void CalcBusClk(void) //计算总线频率
{
U32 val,UPLL;
U8 m, p, s;
val = rMPLLCON;
m = (val >> 12) & 0xff;
p = (val >> 4) & 0x3f;
s = val & 3; FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<<s))*100; val = rCLKDIVN;
m = (val >> 1) & 3;
p = val & 1;
val = rCAMDIVN;
s = val >> 8; switch (m)
{
case 0:
HCLK = FCLK;
break;
case 1:
HCLK = FCLK >> 1;
break;
case 2:
if(s & 2)
HCLK = FCLK >> 3;
else
HCLK = FCLK >> 2;
break;
case 3:
if(s & 1)
HCLK = FCLK / 6;
else
HCLK = FCLK / 3;
break;
} if(p)
PCLK = HCLK >> 1;
else
PCLK = HCLK; val = rUPLLCON;
m = (val >> 12) & 0xff;
p = (val >> 4) & 0x3f;
s = val & 3;
UPLL = ((m+8)*FIN)/((p+2)*(1<<s));
UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;
} //************************[ HCLK, PCLK ]***************************
void ChangeClockDivider(int hdivn_val,int pdivn_val)
{
int hdivn=2, pdivn=0; // hdivn_val (FCLK:HCLK)ratio hdivn
// 11 1:1 (0)
// 12 1:2 (1)
// 13 1:3 (3)
// 14 1:4 (2)
// pdivn_val (HCLK:PCLK)ratio pdivn
// 11 1:1 (0)
// 12 1:2 (1)
switch(hdivn_val) {
case 11: hdivn=0; break;
case 12: hdivn=1; break;
case 13:
case 16: hdivn=3; break;
case 14:
case 18: hdivn=2; break;
} switch(pdivn_val) {
case 11: pdivn=0; break;
case 12: pdivn=1; break;
} rCLKDIVN = (hdivn<<1) | pdivn; switch(hdivn_val) {
case 16: // when 1, HCLK=FCLK/8.
rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<8);
break;
case 18: // when 1, HCLK=FCLK/6.
rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<9);
break;
} if(hdivn!=0)
MMU_SetAsyncBusMode();
else
MMU_SetFastBusMode();
} //**************************[ UPLL ]*******************************
void ChangeUPllValue(int mdiv,int pdiv,int sdiv)
{
rUPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;
} //***************************[ MPLL ]****************************
void ChangeMPllValue(int mdiv,int pdiv,int sdiv)
{
rMPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;
} //*************************时钟配置函数*****************************
void SetClock(u8 mpll)
{
if(mpll == MPLL271)
{
ChangeMPllValue(173,2,2);
}
else if(mpll == MPLL304)
{
ChangeMPllValue(68,1,1);
}
else if(mpll == MPLL405)
{
ChangeMPllValue(127,2,1);
}
else if(mpll == MPLL532)
{
ChangeMPllValue(125,1,1);
}
ChangeClockDivider(14,12); //设置分频比为1:4:8 fclk hclk pclk
//并设置cpu异步总线模式
CalcBusClk(); //计算总线频率 }

Clock.h

#ifndef __CLOCK_H_
#define __CLOCK_H_
#include "def.h"
#include "2440addr.h"
#include "2440slib.h" #define FIN (12000000) //外部晶振
#define MPLL271 1 //几个典型的时钟宏定义
#define MPLL304 2
#define MPLL405 3
#define MPLL532 4 void CalcBusClk(void); //计算总线频率
void ChangeClockDivider(int hdivn_val,int pdivn_val);//计算分频数值
void ChangeUPllValue(int mdiv,int pdiv,int sdiv);//配置usb总线
void ChangeMPllValue(int mdiv,int pdiv,int sdiv);
void SetClock(u8 mpll);//配置系统时钟 extern U32 FCLK;
extern U32 HCLK;
extern U32 PCLK;
extern U32 UCLK; #endif

现在有了几个系统时钟的具体数字,我们就可以很好的进行外设时钟的配置了

注意,设置系统时钟的时候HCLK如果太大会导致取值SDRAM跟不上,为了解决这个问题,三星说了这样一个方案,大家要注意哦:

S3C2440时钟系统详解的更多相关文章

  1. STM8时钟系统详解

    就我个人看来,研究一块单片机,分为新手和老手两种模式,新人迫切的想先用,你得告诉他们怎么样最快的写出一个能跑起来的程序,告诉他们每一个外设的使用方式,老手不同,用的单片机多了外设对于他们而言没太多好奇 ...

  2. Bootstrap栅格系统详解,响应式布局

    Bootstrap栅格系统详解 栅格系统介绍 Bootstrap 提供了一套响应式.移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列. 栅格系统用于通 ...

  3. java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET

    java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了!      社区福利快来领取免费参加MDCC大会机会哦    Tag功能介绍—我们 ...

  4. Vmware12安装centos系统详解

    vmware12安装centos7系统详解 用虚拟机12安装centos7系统详细安装过程,后附centos7下载地址. 工具/原料 虚拟机12 centos7系统镜像 方法/步骤 1 1.百度搜索c ...

  5. centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解

    centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解 操作系统:centos 7.2 x86_64 安装walle系统服务端 1.以下安装,均在宿主机( ...

  6. syslog之一:Linux syslog日志系统详解

    目录: <syslog之一:Linux syslog日志系统详解> <syslog之二:syslog协议及rsyslog服务全解析> <syslog之三:建立Window ...

  7. 利用python求解物理学中的双弹簧质能系统详解

    利用python求解物理学中的双弹簧质能系统详解 本文主要给大家介绍了关于利用python求解物理学中双弹簧质能系统的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 物理的 ...

  8. 搭建zabbix监控系统详解

    搭建zabbix监控系统详解 文:warren   博文大纲:一.前言 二.zabbix监控架构三.搭建Zabbix监控服务器四.搭建过程中遇到有些服务无法正常启动的解决办法 一.前言 : 要想实时的 ...

  9. django用户投票系统详解

    投票系统之详解 1.创建项目(mysite)与应用(polls) django-admin.py startproject mysite python manage.py startapp polls ...

随机推荐

  1. acm课程练习2--1002

    题目描述 Now, here is a fuction:  F(x) = 6 * x^7+8x^6+7x^3+5x^2-yx (0 <= x <=100)Can you find the ...

  2. String Stringbuilder Stringbuffer的区别

    String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...

  3. Linux学习 -- 日志管理

    日志服务 rsyslogd  CentOS6 取代了原来的syslog rsyslogd 默认启动.自启动 常用命令:lastb.lastlog.last.w.who.users. 系统默认日志 和 ...

  4. 2016中国大学生程序设计竞赛 - 网络选拔赛 1001 A water problem (大数取余)

    Problem Descripton Two planets named Haha and Xixi in the universe and they were created with the un ...

  5. The Accumulation of Capital

    The Accumulation of Capital ---- by *Adam Smith Capitals are increased by parsimony, and diminished ...

  6. 仿照微信的界面,即ViewPager+Fragment的结合使用

    主布局文件: android:drawableTop="@drawable/weixin_bg"用的是状态选择器,所以要写4个状态选择器,图片的 <RelativeLayou ...

  7. CF 675 div2C 数学 让环所有值变为0的最少操作数

    http://codeforces.com/contest/675/problem/C 题目大意: 给一个环,标号为1-n,然后能从n回到1.让这个环的值为0,最少需要的操作数是多少? 这道题目呀.. ...

  8. Android sdk content loader 0%的解决方案

    Eclipse在启动时,经常会碰到半天启动不起来的情况,罪魁祸首就是“Android sdk content loader 0%”,题主经常是受这玩意的百般折磨,大早上一来就被这扫了工作的激情,浪费了 ...

  9. Spring + iBATIS完整示例

    最近研究了一下Spring + iBATIS.发现看别人的例子是一回事,自己写一个完整的应用又是另外一回事.自己受够了网上贴的一知半解的代码. iBATIS是一个持久化框架,封面了sql过程,虽然sq ...

  10. 素数个数的位数<Math>

    小明是一个聪明的孩子,对数论有着很浓烈的兴趣.他发现求1到正整数10^n (10的n次方)之间有多少个素数是一个很难的问题,该问题的难点在于决定于10^n 值的大小. 告诉你n的值,并且用ans表示小 ...