uboot-step 7 时钟初始化
上篇文章已经点亮了led,但是我们所用的时钟频率还只是外部时钟的频率12M,比较慢,这篇文章将会介绍下s3c6410的时钟体系,并对如何配置时钟作详细的说明
s3c6410 的时钟体系说明
9.2.png如上图所示,s3c6410主要有三个锁相环pll,分别为APLL,MPLL,EPLL
- APLL :主要为CPU的工作提供工作时钟 ARMCLOCK,也可以配置为对系统总线AHB,APB总线等提供时钟 HCLK2 ,HCLK PCLK
- MPLL: 主要为系统工作如串口,音频等提供工作时钟,同时也可以配置为对系统总线AHB,APB总线等提供时钟
-
EPLL: 为USB等设备提供特殊的工作时钟
其中,APLL与MPLL都可以为系统总线AHB,APB提供时钟,这里我们选择了APLL来提供
如下图所示,是我们所配置的时钟流向,从外部时钟晶体输入12M的工作时钟,经过APLL与MPLL之后,频率提升到了533M(APLL和MPLL的倍频倍数可以更改),其中APLL输出的时钟经过DIVarm(1)到达ARMCLK,为cpu工作提供时钟,APLL的另一支向下经过SYNCMUX和DIVHclk2(1)到达HCKx2为系统总线提供时钟,MPLL输出的时钟则经过DIVmpll来为其它部件如串口和音频等提供工作时钟
9.1.png
如何进行时钟的配置
对处理器任何的设置最终都反映在相应寄存器的读写,对于时钟的配置主要有以下几点:
- APLL与MPLL 倍频频率的设置,可以通过APLLCON/MPLLCON寄存器来进行配置
- MUXapll与MUXmpll时钟源的选择,需要配置为选择PLL输出时钟,可以通过CLK_SRC寄存器来配置
- SYNCMUX选择系统总线时钟的时钟源是APLL还是MPLL,同步还是异步(不懂)模式,可以通过配置OTHERS寄存器来设置
- 还要配置DIVarm,DIVhclk2,DIVHclk,DIVpclk等分频值,通过配置CLK_DIV0 寄存器来设置
APLL与MPLL配置
pllcon0.pngpllcon.png
pllcon1.png
我们设定输出频率为533M,参照上图进行相关的设置就可以了
CLK_DIV0配置
clk_div0.pngclk_div.png
这里我们的寄存器设置如下:
- ARM_RATIO=0
- ARMCLK=533/(0+1)=533M
- MPLL_RATIO=0
- DOUTmpll=533/(0+1)=533
- HCLK_RATIO=1
- HCLK=HCLKX2/(1+1)=HCLKX2/2=133M
- HCLKx2_RATIO=1
- HCLKX2=HCLKX2in(533)/(1+1)=266M
- PCLK_RATIO=3
- PCLK=HCLKX2(266)/(3+1)=66.5M
OTHERS寄存器配置
others0.pngothers1.png
这里我们设置为同步模式,选用APLL输出作为系统总线时钟
CLK_SRC选择时钟源
clk_src.png clk_src1.png设置APLL,EPLL,MPLL输出使能
代码实现
#define CLK_DIV0 0x7e00f020
#define OTHERS 0x7e00f900
#define MPLL_CON 0x7e00f010
#define APLL_CON 0x7e00f00c
#define CLK_SRC 0x7e00f01c
#define DIV_VAL ((0x0<<0)|(0x1<<9)|(0x1<<8)|(0x3<<12))
#define PLL_VAL ((1<<31)|(266<<16)|(3<<8)|(1<<0))
init_clock:
ldr r0, =CLK_DIV0
ldr r1, =DIV_VAL
str r1, [r0]
ldr r0, =OTHERS
ldr r1, [r0]
bic r1,r1,#0xc0 @同步模式,总线时钟由APLL提供
str r1, [r0]
ldr r0, =APLL_CON
ldr r1, =PLL_VAL @使能pll,输出为533M
str r1, [r0]
ldr r0, =MPLL_CON
ldr r1, =PLL_VAL
str r1, [r0]
ldr r0, =CLK_SRC
mov r1, #0x3 @配置使用pll时钟输出
str r1, [r0]
mov pc, lr
此去经年
zhaiyk@sina.cn
August 2, 2016
网友评论