S5PV210初始化系统时钟

S5PV210时钟体系
S5PV210中包含3大类时钟domain,分别是主系统时钟domain (简称MSYS,下面将使用简称来进行相关讲解)、显示相关的时钟domain (DSYS)、外围设备的时钟domain (PSYS)。
1) MSYS:用来给cortex a8处理器,dram控制器,3D,IRAM,IROM,中断控制器等提供时钟;
2) DSYS:用来给显示相关的部件提供时钟,包括FIMC, FIMD, JPEG, and multimedia IPs;
3) PSYS:用来给外围设备提供时钟,如i2s, spi,i2c,uart等
S5PV210外接的晶振频率(简称Fin)为24MHz,通过时钟控制逻辑PLL可以提高系统时钟。S5PV210共有4个倍频器,即PLL,包括APLL(供MSYS使用),MPLL(供DSYS使用),EPLL(供PSYS使用),VPLL(供video相关的时钟使用)。3大类时钟domain中,可以使用不同的分频,使其给不同部件输出所需要的时钟,各类时钟的关系如下图:

S5PV210时钟分类图

如何确定各类时钟的值,芯片手册上给出了参考值,我们按照参考值设置即可,各类时钟的参考值如下图:

S5PV210时钟设置参考值图

具体如何设置上述各种各样的时钟,可参考下图:

S5PV210时钟设置参考图

该图十分重要,依据上图我们就可以设置好所有硬件部件所需的工作时钟(实际上我们并不需要设置好所有部件的工作时钟,我们只需设置好我们需要使用的硬件部件的工作时钟即可),在本章第二节中,我们将以上图为基础,通过设置时钟相关的寄存器,达到初始化时钟的目的。

程序例子:

分别用了汇编语言和C语言来编写,详细代码见链接。下面以C语言代码来讲解:

1. start.S
在调用main函数之前,调用了时钟初始化函数clock_init,进行时钟相关的设置。
2. clock.c
clock_init()在clock.c中定义,具体代码如下:
void clock_init()
{
    // 1 设置各种时钟开关,暂时不使用PLL
    CLK_SRC0 = 0x0;
    // 2 设置锁定时间,使用默认值即可
    APLL_LOCK = 0x0000FFFF;
    MPLL_LOCK = 0x0000FFFF;
    // 3 设置分频
    CLK_DIV0 = 0x14131440;
    // 4 设置PLL
    APLL_CON0 = APLL_VAL;
    MPLL_CON = MPLL_VAL;
    // 5 设置各种时钟开关,使用PLL
    CLK_SRC0 = 0x10001111;
}
上述代码共有5个步骤,下面我们一一讲解每一个步骤:
第一步 、设置各种时钟开关,暂时不使用PLL
根据时钟设置图,下面是放大图:

首先我们需要选择使用外接24MHz晶振,由上图可知,APLL和MPLL的时钟源由“FIN_PLL”决定,在芯片手册中搜索“FIN_PLL”,可知相关寄存器为CLK_SRC0,见下图:

在未设置PLL和各种分频系数之前,我们不能使用PLL,为了保险起见,暂时直接使用频率较低的外接的24MHz晶振,待设置好PLL和分频系数后再重新设置各种时钟开关。

第二步 、设置锁定时间
设置PLL后,时钟从Fin提升到目标频率时,需要一定的时间,即锁定时间。

第三步 、设置分频
与分频相关的寄存器是CLK_DIV0,见下图:

现在我们来根据本章第一节中给出的时钟设置参考值来设置该寄存器。

  • ARMCLK = 1000MHz = MOUT_MSYS / (APLL_RATIO + 1),经过在第四和第五步的设置后,MOUT_MSYS会被设置为1000MHz,所以 APLL_RATIO=0即可
  • SCLKA2M=200MHz=SCLKAPLL / (A2M_RATIO + 1),由于SCLKAPLL=1000MHz,所以A2M_RATIO=4。
  • HCLK_MSYS=200MHz=ARMCLK / (HCLK_MSYS_RATIO + 1),所以HCLK_MSYS_RATIO=4
  • PCLK_MSYS=100MHz=HCLK_MSYS / (PCLK_MSYS_RATIO + 1),所以PCLK_MSYS_RATIO=1
  • HCLK_DSYS=166MHz=MOUT_DSYS / (HCLK_DSYS_RATIO + 1), 经过在第四和第五步的设置后,MOUT_DSYS =667MHz,所以HCLK_DSYS_RATIO=3
  • PCLK_DSYS=83MHz=HCLK_DSYS / (PCLK_DSYS_RATIO + 1),所以PCLK_DSYS_RATIO=1
  • HCLK_PSYS=133Mhz=MOUT_PSYS / (HCLK_PSYS_RATIO + 1),经过在第四和第五步的设置后,MOUT_PSYS =667MHz所以HCLK_PSYS_RATIO=4

  • PCLK_PSYS=66Mhz=HCLK_PSYS / (PCLK_PSYS_RATIO + 1),所以HCLK_PSYS_RATIO=1
    所以CLK_DIV0 = 0x14131440;

第四步 、设置PLL
PLL即倍频器,用来放大运行频率。设置好分频后,我们就需要设置PLL了。APLL/MPLL的启动是通过设置APLL_CON0/MPLL_CON寄存器,我们逐个来设置。

APLL_CON0

ALPP_CON0负责设置APLL,FINPLL=24MHz,经过APLL后,我们将输 出FOUT=1000Mhz的时钟频率,FOUT的计算公式如下: FOUT=MDIV*FIN/(PDIV*2^(SDIV-1)) = 1000 MHz
由于FIN=24MHz,FOUT=1000MHz,我们可以这样取值: MDIV= 0x7d,PDIV= 0x3,SDIV=1。这3个值并不是固定死的,只要能使FOUT=1000Mhz,任意搭配都是可以的。

MPLL_CON

MPLL_CON寄存器负责设置MPLL,经过MPLL后,我们将输出FOUT=667Mhz的时钟频率,FOUT的计算公式如下: FOUT=MDIV*FIN/(PDIV*2^SDIV) = 667 MHz
由于FIN=24MHz,FOUT=667MHz,我们可以这样取值: MDIV=0x29B, PDIV= 0xC,SDIV=1。这3个值并不是固定死的,只要能使FOUT=667Mhz,任意搭配都是可以的。

第五步 设置各种时钟开关

S5PV210时钟设置参考图

在上图中,所有的MUX都是用来选择时钟的,相关寄存器是CLK_SRC0, 见下图:

参考S5PV210时钟设置参考图,设置各种时钟开关:
APLL_SEL=1,使用FOUTAPLL
MPLL_SEL=1,使用FOUTMPLL
EPLL_SEL=1,使用FOUTEPLL
VPLL_SEL=1,使用FOUTVPLL
MUX_MSYS_SEL=0,使用SCLKAPLL
MUX_DSYS_SEL=0,使用SCLKMPLL
MUX_PSYS_SEL=0,使用SCLKMPLL
ONENAND_SEL=1,使用HCLK_DSYS
所以CLK_SRC0=0x10001111;

3. main.c
在main函数中实现LED闪烁的功能,与前面的代码大同小异。

代码下载链接:http://download.csdn.net/detail/klcf0220/5635253

S5PV210初始化系统时钟的更多相关文章

  1. 【小梅哥SOPC学习笔记】系统时钟的使用

    给NIOS II CPU添加一颗澎湃的心——系统时钟的使用 本实验介绍如何在Qsys中添加一个定时器作为NIOS II的心跳定时器,并在NIOS II中软件编程使用该定时器. 将上一个实验watchd ...

  2. LibOpenCM3(五) 基础功能: 系统时钟, GPIO, 定时器

    目录 LibOpenCM3(一) Linux下命令行开发环境配置 LibOpenCM3(二) 项目模板 Makefile分析 LibOpenCM3(三) .ld文件(连接器脚本)和startup代码说 ...

  3. LPC1788系统时钟初始化

    #ifndef __SYS_H_ #define __SYS_H_ #include "common.h" #define SystemCoreClock  120000000  ...

  4. STM32学习笔记(六) SysTick系统时钟滴答实验(stm32中断入门)

    系统时钟滴答实验很不难,我就在面简单说下,但其中涉及到了STM32最复杂也是以后用途最广的外设-NVIC,如果说RCC是实时性所必须考虑的部分,那么NVIC就是stm32功能性实现的基础,NVIC的难 ...

  5. STM32学习笔记:系统时钟和SysTick定时器

    原文:http://blog.sina.com.cn/s/blog_49cb42490100s60d.html 1.     STM32的时钟系统 在STM32中,一共有5个时钟源,分别是HSI.HS ...

  6. 实时时钟、系统时钟和CPU时钟的区别

    http://blog.sina.com.cn/s/blog_68f909c30100pli7.html 实时时钟:RTC时钟,用于提供年.月.日.时.分.秒和星期等的实时时间信息,由后备电池供电,当 ...

  7. stm32之Systick(系统时钟)

    Systick的两大作用: 1.可以产生精确延时: 2.可以提供给操作系统一个单独的心跳(时钟)节拍: 通常实现Delay(N)函数的方法为: for(i=0;i<x;i++) ; 对于STM3 ...

  8. STM32F2系列系统时钟默认配置

    新到一家公司后,有个项目要用到STM32F207Vx单片机,找到网上的例子照猫画虎的写了几个例子,比如ADC,可是到了ADC多通道转换的时候就有点傻眼了,这里面的时钟跑的到底是多少M呢?单片机外挂的时 ...

  9. 基于Systick系统时钟延时的LED闪烁灯

    1.回顾我们的51 单片机编程,当我们需要做系统延迟的时候,最常采用的一种方式就是使用for 循环的空语句等待来实现. 当然,在STM32 里面也可以这么实现.但是在STM32 的Cortex 内核里 ...

随机推荐

  1. A1054. The Dominant Color

    Behind the scenes in the computer's memory, color is always talked about as a series of 24 bits of i ...

  2. MUI 底部弹出的选择框

    大致是这样: 第一种方法:这种方法是使用5+的nativeUI原生动画 1)引入:mui.css或者mui.min.css mui.js或者mui.min.js也行 mui.picker.min.js ...

  3. 【CSS】元素样式

    1.使用CSS的三种方式: 方式一.通过元素的style属性来设置元素的样式 方式二.在HTML头部标签<head>中通过<link>标签引入一个外部的CSS资源,通常是一个C ...

  4. Windows环境安装MySQL数据库

    Windows环境安装MySQL数据库 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 最近在学习Java语言,开发环境在Windows操作系统上,因此需要在Windows上安装My ...

  5. 流媒体技术学习笔记之(一)nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器

    参照网址: [1]http://blog.csdn.net/redstarofsleep/article/details/45092147 [2]HLS介绍:http://www.cnblogs.co ...

  6. centos7 memcached+magent+keepalived集群

    111,222均部署keepalived,magent,memcached keepalived 111为主机,222为备机 其中,111上magent以本地memcache为主,222为备用 222 ...

  7. VS新建项目工具箱图标丢失问题

    (1)在电脑里搜索*.tbd文件(2)建一个项目,把需要的工具箱图标加载上,退出 VS. (3)复制一份toolbox.tbd,重命名为toolbox_reset.tbd 然后以后新建项目就可以了.这 ...

  8. 工控安全入门之Ethernet/IP

    这一篇依然是协议层面的,协议层面会翻译三篇,下一篇是电力系统中用的比较多的DNP3.这一篇中大部分引用的资料都可以访问到,只有一篇reversemode.com上的writeup(http://rev ...

  9. PCA whitening

    对输入数据,维度为2时,想要把数据降维1维: 数据的主方向就是旋转数据的第一维.因此,若想把这数据降到一维,可令: 数据已经进行预处理(零均值),使得每个特征和具有相同的均值和方差. PCA算法将寻找 ...

  10. mysql 原理 ~ double write

    一 简介:今天来聊聊double write 二 细节 1 Double write 是InnoDB在 tablespace(ibdata1)上的128个页(2个区)是2MB: 2 何谓页断裂 所谓页 ...