S3C2440有两个PLL(phase locked loop)一个是MPLL,一个是UPLL。MPLL用于CPU及其他外围器件,UPLL用于USB。用于产生FCLK, HCLK, PCLK三种频率,这三种频率分别有不同的用途:

FCLK是CPU提供的时钟信号。 
HCLK是为AHB总线提供的时钟信号, Advanced High-performance Bus,主要用于高速外设,比如内存控制器,中断控制器,LCD控制器, DMA 等。

从S3C2440的DATASHEET里可以看到,S3C2440最大支持400MHz的主频,但是这并不意味着一定工作在400MHz下面,可以通过设定MPLL, UPLL寄存器来设定CPU的工作频率。 
尽管在CPU上电(power-on)或者复位(reset)后,MPLL就开始进入工作状态,但是此时MPLL的输出(Mpll)并不作为系统的时钟,而是直接使用外部信号EXTCLK或者外部时钟晶振作为系统时钟。直到软件初始化MPLL寄存器(rMPLLCON),写入了有效的值过后,系统才开始使用MPLL的输出(Mpll)作为系统时钟。虽然很多时候我们不必重新设置MPLL寄存器(rMPLLCON)新的值,但是为了使系统使用其输出作为时钟信号,在软件初始化系统部分,还是要向rMPLLCON写入一个有效的旧的值。这样子才使系统处于正确的工作状态。

关于MPLL的计算方法
1. U32 mpll_val=0;

mpll_val = (92<<12)|(1<<4)|(1);

算得mpll_val的二进制:0101 1100 0000 0001 0001

注意:(92<<12)中的92为十进制数,转换为二进制为0x5C。
2. ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);

代入1算得:ChangeMPllValue(0x5C,1,1);

3. 找到ChangeMPllValue子函数

void ChangeMPllValue(int mdiv,int pdiv,int sdiv)
             {

rMPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;
              }

4. 调用子函数,得到rMPLLCON二进制为:0101 1100 0000 0001 0001

5. 根据S3C2440A官方datasheet:

PLLCON          Bit                        Deion

MDIV         [19:12]           Main divider control

PDIV          [9:4]               Pre-divider control

SDIV          [1;0]               Post divider control

以及MPLL Control Register

Mpll=(2*m*Fin)/(p*2s)

m=(MDIV+8)   p=(PDIV+2)   s=SDIV

因rMPLLCON二进制为:0101 1100 0000 0001 0001,所以

m=(MDIV+8)=([19:12]+8)=92+8=100

p=(PDIV+2)=([9:4]+2)=1+2=3

s=SDIV=[1:0]=1

Mpll=(2*m*Fin)/(p*2s)=(2*100*12)/(3*2)=400M

PCLK是为APB总线提供的时钟信号,Advanced Peripherals Bus,主要用于低速外设,比如看门狗,UART控制器, IIS, I2C, SDI/MMC, GPIO,RTC and SPI等。

s3c2440 mpll的更多相关文章

  1. U-Boot移植

    基于天翔的老师的课程, 他的博客在这儿: http://blog.csdn.net/johnmcu/article/details/6561311 注明不能转载, 就重新写一下吧: 1. 安装韦东山的 ...

  2. Linux学习 : 裸板调试 之 配置UART

    1.UART原理说明 发送数据时,CPU将并行数据写入UART,UART按照一定的格式在一根电线上串行发出:接收数据时,UART检测另一根电线上的信号,串行收集然后放在缓冲区中,CPU即可读取UART ...

  3. 【转】Bootloader之uBoot简介(转)

    原文网址:http://blog.csdn.net/sadamoo/article/details/8139946 来自http://blog.ednchina.com/hhuwxf/1915416/ ...

  4. 韦东山教程ARM的时钟设置出现的问题及其解决方法

    时钟设置是一个非常重要的环节,如果系统没有合适的时钟,根本无法工作.   S3C2440的时钟复杂,分为FCLK,HCLK,PCLK.    在程序测试中,曾出现这样一个错误.系统当前FCLK为400 ...

  5. 七、UART

    7.1 介绍 UART(Universal Asynchronous Receiver Transmitter),通用异步收发器,用来传输穿行数据时 UART 之间以全双工方式传输数据,连线方法只有 ...

  6. Bootloader之uBoot简介

    本文转载自:http://blog.ednchina.com/hhuwxf/1915416/message.aspx 一.Bootloader的引入 从前面的硬件实验可以知道,系统上电之后,需要一段程 ...

  7. JZ2440 裸机驱动 第10章 系统时钟和定时器

    本章目标      了解S3C2410/S3C2440的时钟体系结构     掌握通过设置MPLL改变系统时钟的方法     掌握在不同的频率下设置存储控制器的方法     掌握PWM定时器的用法   ...

  8. Bootloader之uBoot简介(转)

    来自http://blog.ednchina.com/hhuwxf/1915416/message.aspx,感谢作者 一.Bootloader的引入从前面的硬件实验可以知道,系统上电之后,需要一段程 ...

  9. 时钟系统与UART

    关于时钟设置原理: 关于如何设置系统时钟的思路. 其中锁定时间需要一个寄存器,PLL需要一个寄存器(MPLLCL),分频还需要一个寄存器,总计三个寄存器.步骤如下: 1. 上电后,FCLK=Fin 2 ...

随机推荐

  1. 【BZOJ】1975: [Sdoi2010]魔法猪学院

    题意 \(n(2 \le n \le 5000)\)个点,找尽量多的不同\(1\)到\(n\)的路径,每一次的花费就是路径的全值和,要求在费用不超过\(E\)的情况下路径最多. 分析 裸的最段路. 题 ...

  2. Python拾忆--多线程的socket服务器

    阳光明媚的午后,想想最近要开始从写Java到写Python了,就随手打开电脑来体验一下Python与Java之间的不同吧~ 记得我还在上大二的时候,那个时候才开始学Java,最感兴趣的就是Java书最 ...

  3. C语言(4)

    C语言(4)--数据类型 C语言在用“/”是,注意左右两边都是整数时,商也是只有整数部分. 下面介绍一下C语言常用的数据类型:  注意: 1.char类型数据范围:256中字符. 2.float和do ...

  4. Centos 安装 NodeJS

    准备命令: yum -y install gcc make gcc-c++ openssl-devel wget 下载源码及解压: wget http://nodejs.org/dist/v0.10. ...

  5. java项目开发的一些准备工作

    做项目有一段时间了,每次接手一个新项目都要在开发前做些准备工作,方便开发. 有些东西在配置的时候经常会忘记,所有整理一份,方便以后查阅! 1.安装JDK及搭建环境,安装tomcat及搭建环境,这些一般 ...

  6. linux同步系统时间

    命令:ntpdate 路径:/usr/sbin/ntpdate 例子:ntpdate us.pool.ntp.org 查看日期时间命令:date 修改日期时间命令:date -s "2012 ...

  7. 怎么启动或停止mysql服务

    在linux下,  启动mysql用 service mysql start   停止用 service mysql stop 在windows下, 启动用 net start mysql    停止 ...

  8. Windows下获取本机IP地址方法介绍

    Windows下获取本机IP地址方法介绍 if((hostinfo = gethostbyname(name)) != NULL) { #if 1 ; printf("IP COUNT: % ...

  9. jquery 绑定事件的方法

    jQuery中提供了四种绑定事件的方法,分别是bind.live.delegate.on,对应的解除监听的函数分别是unbind.die.undelegate.off: 一.on()方法(首选方法) ...

  10. Mysql VARCHAR(X) vs TEXT

    一般情况下,我们不太会纠结用Varchar或text数据类型. 比如说,我们要存储邮箱,我们自然会用varchar,不会想到用text.而当我们要存储一段话的时候,选了text,感觉varchar也够 ...