S3C2440时钟系统详解
在讲述系统时钟之前,因为这些设备都是挂靠在系统时钟上的,所以必须先说系统时钟,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时钟系统详解的更多相关文章
- STM8时钟系统详解
就我个人看来,研究一块单片机,分为新手和老手两种模式,新人迫切的想先用,你得告诉他们怎么样最快的写出一个能跑起来的程序,告诉他们每一个外设的使用方式,老手不同,用的单片机多了外设对于他们而言没太多好奇 ...
- Bootstrap栅格系统详解,响应式布局
Bootstrap栅格系统详解 栅格系统介绍 Bootstrap 提供了一套响应式.移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列. 栅格系统用于通 ...
- java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET
java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了! 社区福利快来领取免费参加MDCC大会机会哦 Tag功能介绍—我们 ...
- Vmware12安装centos系统详解
vmware12安装centos7系统详解 用虚拟机12安装centos7系统详细安装过程,后附centos7下载地址. 工具/原料 虚拟机12 centos7系统镜像 方法/步骤 1 1.百度搜索c ...
- centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解
centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解 操作系统:centos 7.2 x86_64 安装walle系统服务端 1.以下安装,均在宿主机( ...
- syslog之一:Linux syslog日志系统详解
目录: <syslog之一:Linux syslog日志系统详解> <syslog之二:syslog协议及rsyslog服务全解析> <syslog之三:建立Window ...
- 利用python求解物理学中的双弹簧质能系统详解
利用python求解物理学中的双弹簧质能系统详解 本文主要给大家介绍了关于利用python求解物理学中双弹簧质能系统的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 物理的 ...
- 搭建zabbix监控系统详解
搭建zabbix监控系统详解 文:warren 博文大纲:一.前言 二.zabbix监控架构三.搭建Zabbix监控服务器四.搭建过程中遇到有些服务无法正常启动的解决办法 一.前言 : 要想实时的 ...
- django用户投票系统详解
投票系统之详解 1.创建项目(mysite)与应用(polls) django-admin.py startproject mysite python manage.py startapp polls ...
随机推荐
- [JAR包] android引入JAR包,打包成JAR包,打包成Library项目,导入Library项目
(1)项目导入JAR包:1.在项目目录里建立一个libs目录,将外部jar包拷贝在里面.2.右键点击项目,Bulid Path->Configure Build Path3.在设置Libraie ...
- PAT (Advanced Level) 1103. Integer Factorization (30)
暴力搜索. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #i ...
- 正确使用String,StringBuffer,StringBuilder
很多时候在实际中,我们很常用的就是字符串String. 对于它,网上已经说的很多了. 我就说一点是特别重要的需要记住的,String赋值之后它就是不能被改变的. 也就是这一点,导致了String在操作 ...
- WiresShark 一站式学习
按照国际惯例,从最基本的说起. 抓取报文: 下载和安装好Wireshark之后,启动Wireshark并且在接口列表中选择接口名,然后开始在此接口上抓包.例如,如果想要在无线网络上抓取流量,点击无线接 ...
- Codeforces Round #272 (Div. 1) B 构造 math
http://www.codeforces.com/contest/477/problem/C 题目大意:给你n个集合,每个集合里面有四个数字,他们的gcd是k,输出符合条件的集合中m,m为集合中最大 ...
- android手势感应预研
1. 产品介绍 该产品可以通过传感器来侦测用户的手势变化进而执行一些操作.比如说信息预览(如短信息预览.日历预览等等),此外,还可以通过指向某一个时间点来预览视频内容.预览音乐播放器(下一首歌 ...
- Android NDK 下的宽字符编码转换及icu库的使用(转)
原贴http://topic.csdn.net/u/20101022/16/1b2e0cec-b9d2-42ea-8d9c-4f1bb8320a54.html?r=70149216 ,看过并动手实现, ...
- (转)Hadoop之常见错误集锦
Hadoop之常见错误集锦 下文中没有特殊说明,环境都是CentOS下Hadoop 2.2.0.1.伪分布模式下执行start-dfs.sh脚本启动HDFS时出现如下错误: ...
- 虚拟机安装tools for Ubuntu
1.启动虚拟机,进入虚拟机 2.选定菜单中的虚拟机按钮,点击安装VMware Tools 3.此时虚拟机上会弹出一些文件, 复制VMwareTools-XXX-XX.tar.gz到桌面,鼠标右键可 ...
- DWR Annotations
DWR Annotations DWR 标注是用来代替 dwr.xml 或者与其一同工作的. 1.初始配置 <servlet> <description>DWR contr ...