s5pv210时钟系统详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/growl_jie_/article/details/52729464

S5PV210时钟系统

1、什么是时钟系统?时钟系统的作用?
时钟系统指的由固有频率来控制的系统。作用:有了一定的频率,工作才能有序,有节奏的进行着。
2、S5PV210的时钟系统是怎么样的?
S5PV210:外部晶振+内部时钟发生器+内部PLL产生高频时钟+分频器
3、S5PV210时钟系统的工作流程?
S5PV210:通过外部晶振产生一个低频时钟(如果外部晶振是高频时钟的话,大家都知道高频受到的干扰会较大,并不能很好的传入到S5PV210内部)传入到内部时钟发生器,在内部有一个PLL(PLL的作用是把低频转换为高频,列如传入的是24MHZ通过PLL则会变成1GHZ)再通过分频器分频成各个器件所需要的时钟频率。
4、S5PV210的时钟系统简介
这里写图片描述
通过分析数据手册可知:
(1)S5PV210的时钟体系分成3大域(按频率的快慢划分):
-MSYS域(main system):主系统域里面包含这CPU(cortex-a8内核)、DRAM控制器(DMC0和DMC1)、3D、internal SRAM(IRAM,and IROM)
-DSYS域(display system):该域主要是一些视频显示、编解码有关的模块。
-PSYS(peripheral system):该域主要是一些外设,I/O外设,SD接口,use接口,I^2接口等等。
频率(由块到慢):MSYS>DSYS>PSYS
(2)S5PV210共有4个倍频器
这里写图片描述
APLL:Cortex-A8内核、MSYS域
MPLL&EPLL:DSYS PSYS
VPLL:Video视频相关模块
(3)S5PV210时钟域详解
这里写图片描述
-MSYS域:
*ARMCLK:给CPU内核工作的时钟,即主频。
*HCLK_MSYS: MSYS域的高频时钟,给DMC0和DMC1使用
*PCLK_MSYS: MSYS域的低频时钟
*HCLK_IMEM:给iROM和iRAM使用

-DSYS域:
*HCLK_DSYS: DSYS域的高频时钟
*PCLK_DSYS: DSYS域的低频时钟

-PSYS域:
*HCLK_PSYS: PSYS域的高频时钟
*PCLK_PSYS: PSYS域的低频时钟
为什么要知道这些域呢?
210内部的各个外设都是接在内部的(AMBA总线)AMBA总线有一个高频分支叫AHB,有一条低频分支叫APB。上面的各个域都有各个对应的HCLK_XXX和PCLK_XXX,其中HCLK_XXX就是XXX这个域中AHB总线的工作频率,PCLK_XXX就是XXX这个域APB总线的工作频率。譬如串口UART挂在PSYS域下的APB总线上,因此串口的时钟来源是PCLK_PSYS。我们通过上面的这些时钟域和总线数值,来确定我们各个外设的具体时钟频率。
(5)S5PV210典型值的设置。
默认的S5PV210上电后,从irom启动此时的时钟频率是24MHZ,我们需要通过PLL提高时钟频率,在分给各个时钟域不同的频率,最后达到各个时钟域的稳定工作,从而达到初始化时钟的作用。
S5PV210的典型值在数据手册中有相应的给出。这里写图片描述
通过推荐的典型值我们可以通过上面的数字些写出代码。
(4)S5PV210框图详解。
这里写图片描述
(很重要)第一张图从左到右依次完成了原始时钟生成(24MHZ)->PLL倍频得到高频时钟->初次分频得到各总线时钟。这张图是理解整个时钟体系的关键。其中的MUX开关是至关重要的。MUX开关就是个或门,通过设置bit位来控制哪一个是通的。DIV则是分频器。可以通过设置分频器得到想要的频率。此图可得知FINPLL和FOUTPLL很重要
这里写图片描述
第二张图是从各中间时钟(第一张图中某个步骤生成的时钟)到各外设自己使用的时钟(实际就是个别外设再额外分频的设置)。进一步细化各外设的时钟来源。
(5)S5PV210时钟设置寄存器详解
-xPLL_LOCK:控制PLL锁定频率的周期,譬如24MHZ变为1GHZ这段是需要一段时间的,通过一个锁相环使得把24MHZ锁定为1GHZ,所以就需要锁定频率的周期了。(锁定频率)
-xPLL_CON:打开/关闭PLL电路,设置PLL的倍频参数,查看PLL锁定状态等。(决定倍频到多少)
-CLK_SRCn(n:0~6):用来设置时钟来源的,对应时钟框图中的mux开关。(决定时钟来源)
-CLK_SRC_MASKn:打开关闭时钟源。(开头部分)
-CLK_DIV_STATn:各模块的分频参数配制。(决定分频多少)
-CLK_SRC_GATE_x:打开关闭时钟门。(结尾部分)
-CLK_DIV_STATn:分频状态寄存器,确保是否已经分频完成。
-CLK_MUX_STATn:选择开关状态寄存器,确保是否已经选择开关完毕。
(6)汇编代码详情。
初始化时钟代码(5歩):
第一步:先不使用PLL,先用24MHZ时钟频率跑一段
第二歩:设置锁定时间。默认值为0x0fff,我们设置为0xffff让他多锁定一会(更保险).
第三歩:设置分频系数。
第四歩:设置PLL,提高时钟频率。
第五歩:打开PLL。
这里写图片描述
在arm的数据手册中可以分析得知,所有的寄存器都是按块分的。我们可以找到一个寄存器的基地址,再通过基址加编址寻址的方式在找到寄存器。

#define ELFIN_CLOCK_POWER_BASE 0XE0100000
#define CLK_SRC0_OFFSET        0X00000200

ldr r0, =ELFIN_CLOCK_POWER_BASE
//1 设置各种时钟开关,暂时不使用PLL
ldr r1, =0x0
//通过控制SRC0寄存器使各种PLL从FINPLL那条路通过寄存器描述见下图
str r1, [r0, #CLK_SRC0_OFFSET]

这里写图片描述

#define APLL_LOCK_OFFSET    0x00000000
#define MPLL_LOCK_OFFSET    0x00000008

//2 设置锁定时间

ldr r1, =0x0000FFFF
str r1, [r0, #APLL_LOCK_OFFSET]
str r1, [r0, #MPLL_LOCK_OFFSET]

这里写图片描述

//3 设置分频,寄存器描述如下图
//清楚bit[0~31]

#define CLK_DIV0_OFFSET 0x00000300
#define CLK_DIV0_MASK   0xffffffff
ldr r1,[r0, #CLK_DIV0_OFFSET]
ldr r2, =CLK_DIV0_MASK
bic r1, r1, r2
ldr r2, =0x14131440
orr r1, r1 ,r2
str r1, [r0, #CLK_DIV0_OFFSET]

这里写图片描述

*分析0x14131440 的含义:0001 0100 0001 0011 0001 0100 0100 0000
通过分析前面给定的典型值。可以最后算出0x14131440并且可以分析(很重要)那张图的流向,一切的分析都是基于看懂那张图上作出的,能否学会时钟,即能否学会看懂那张图。
首先分析
/*
bit[30~28]=1此时PCLK_PSYS_RATIO=1
PCLK_PSYS = HCLK_PSYS /(PCLK_PSYS_RATIO+1)
*/

/*
bit[27~24]=4此时HCLK_PSYS_RATIO=4
HCLK_PSYS = MOUT_PSYS / (HCLK_PSYS_RATIO + 1)
*/

/*
bit[22~20]=1此时PCLK_DSYS_RATIO=1
PCLK_DSYS = HCLK_DSYS / (PCLK_DSYS_RATIO + 1)
*/

/*
bit[19~16]=3此时HCLK_DSYS_RATIO=3
HCLK_DSYS = MOUT_DSYS / (HCLK_DSYS_RATIO + 1)
*/

/*
bit[14~12]=1此时PCLK_MSYS_RATIO=1
PCLK_MSYS = HCLK_MSYS / (PCLK_MSYS_RATIO + 1)
*/

/*
bit[10~8]=4此时HCLK_MSYS_RATIO=4
HCLK_MSYS = ARMCLK / (HCLK_MSYS_RATIO + 1)
*/

/*
bit[6~4]=0此时A2M_RATIO =0
SCLKA2M = SCLKAPLL / (A2M_RATIO + 1)
*/

/*
bit[2~0]=0此时APLL_RATIO =0
ARMCLK = MOUT_MSYS / (APLL_RATIO + 1)
*/

//这些配置值都是看三星数据手册推荐的
#define APLL_MDIV           0X7D
#define APLL_PDIV           0X3
#define APLL_SDIV           0x1

#define MPLL_MDIV           0X29B
#define MPLL_pdiv           0xc
#define MPLL_SDIV           0X1

#define set_pll(mdiv,pdiv,sdiv) ) (1<<31 | mdiv<<16 | pdiv<<8 | sdiv>
#define APLL_VAL set_pll(APLL_MDIV,APLL_PDIV,APLL_SDIV)
#define MPLL_VAL set_pll(MPLL_MDIV,MPLL_PDIV,MPLL_SDIV)

#define APLL_CON0_OFFSET    0x100
#define MPLL_CON_OFFSET     0x108
//4 设置PLL,使得低频变成高频
//公式如下图:FOUT=MDIV*FIN/(PDIV*2^(SDIV-1))=0x7d*24/(0x3*2^(1-1))=1000MHZ
ldr r1, =APLL_VAL
str r1, [r0, #APLL_CON0_OFFSET]
//FOUT=MDIV*FIN/(PDIV*2^(SDIV-1))=0x29b*24/(0xc*2^1)=667MHZ
ldr r1, =MPLL_VAL
str r1, [r0, #MPLL_CON_OFFSET]

这里写图片描述
这里写图片描述
建议值是按数据手册给的:
这里写图片描述

//5 打开PLL,前面只是设置系数,这歩是开始工作。
ldr r1, [r0,#CLK_SRC0_OFFSET]
ldr r2, = 0x10001111
orr r1, r1, r2
str r1,[r0,#CLK_SRC0O_OFFSET]

这里写图片描述

(7)C语言代码详解

//S5PV210时钟初始化代码
#define REG_CLK_SRC0    0XE0100200
#define REG_APLL_LOCK   0XE0100000
#define REG_APLL_LOCK   0XE0100008
#define REG_CLK_DIV0    0XE0100300
#define REG_APLL_CON0   0XE0100100
#define REG_MPLL_CON    0XE0100108
#define rREG_CLK_SRC0   (*(volatile unsigned int *)REG_CLK_SRC0)
#define rREG_APLL_LOCK  (*(volatile unsigned int *)REG_APLL_LOCK)
#define rREG_MPLL_LOCK  (*(volatile unsigned int *)REG_MPLL_LOCK)
#define rREG_CLK_DIV0   (*(volatile unsigned int *)REG_CLK_DIV0)
#define rREG_APLL_CON0  (*(volatile unsigned int *)REG_APLL_CON0)
#define rREG_MPLL_CON   (*(volatile unsigned int *)REG_MPLL_CON)


#define APLL_MDIV               0x7d        // 125
#define APLL_PDIV               0x3
#define APLL_SDIV               0x1

#define MPLL_MDIV               0x29b       // 667
#define MPLL_PDIV               0xc
#define MPLL_SDIV               0x1

#define set_pll(mdiv, pdiv, sdiv)   (1<<31 | mdiv<<16 | pdiv<<8 | sdiv)
#define APLL_VAL            set_pll(APLL_MDIV,APLL_PDIV,APLL_SDIV)
#define MPLL_VAL            set_pll(MPLL_MDIV,MPLL_PDIV,MPLL_SDIV)

void clock_init(void)
{
    //1 不使用PLL 
    rREG_CLK_SRC0 = 0X0;

    //2 设置锁定时间
    rREG_APLL_LOCK = 0X0000FFFF;
    rREG_MPLL_LOCK = 0X0000FFFF;

    //3 设置分频
    rREG_CLK_DIV0 = 0X14131440;

    //4 设置PLL
    rREG_APLL_CON0 = APLL_VAL;
    rREG_MPLL_CON = MPLL_VAL;

    //5 使用PLL
    rREG_CLK_SRC0 = 0x10001111;
}

注:因能力有限,若文章有错请多多包涵,谢谢。

猜你喜欢

转载自blog.csdn.net/growl_jie_/article/details/52729464