时钟初始化

ARM系统时钟初始化:
时钟脉冲信号:按一定的电压幅度,一定的时间间隔连续发出的脉冲信号。它是时序逻辑的基础,用于决定逻辑单元中的状态更新,数字芯片中众多的晶体管都工作在开关状态,它们的导通和关断动作都是按照时钟信号来进行的。
时钟脉冲频率:在单位时间(1s)内产生的脉冲个数。
时钟源:
1.晶振(晶体震荡器):是用石英晶体经精密切割磨削并镀上电极焊上引线做成的,如果给它通电,它就会产生机械震荡。
2.PLL合成器(锁相环):一个更为复杂的系统时钟源,通用PLL合成器需要一个外部晶体并包含一个能够对晶体的特定频率加倍或分频的集成锁相环电路
------------------------------------------------------
时钟体系:
1.2440:s3c2440:p237图:7-1
a.首先我们需要了解他晶振的频率:12MHZ
b.了解这个时钟体系有多少个PLL:
有两个:MPLL和UPLL
c.PLL分别产生了哪些时钟出来了
MPLL产生了FCLK,PCLK,HCLK时钟,UPLL产生了:UCLK时钟
d.产生的时钟用来做什么的:
FCLK:用于处理器(如arm920T)
HCLK:AHB总线(LCD,DMA等)
PCLK:APB总线(Uart,GPIO等)
UCLK:USB总线(USB主从口)
2.6410的时钟体系:S3C6410X P122页
a.首先我们需要了解他晶振的频率:12MHZ
b.了解这个时钟体系有多少个PLL:
有三个:MPLL和APLL,EPLL
c.PLL分别产生了哪些时钟出来了
APLL产生了ARMCLK,MPLL产生了PCLK,HCLK时钟,EPLL产生了:SCLK时钟
d.产生的时钟用来做什么的:
ACLK:用于处理器(如arm11)
HCLK:AHB总线(LCD,DMA等)
PCLK:APB总线(Uart,GPIO等)
SCLK:USB总线(USB主从口)
3.210时钟体系:S5PV210_UM_REV1.1 p361
a.首先我们需要了解他晶振的频率:24MHZ
b.了解这个时钟体系有多少个PLL:
有三个:MPLL和APLL,EPLL,VPLL
-----------------------------------------------------------
时钟初始化流程:S3C2440:P240
处理器上电之后,处理器的频率就是晶振的频率,当完成了对锁相环的配置之后,我们的处理器会进入到lock time这样的一个时间。在这段时间处理器是不工作的,这段时间结束之后,处理器就会按照我们所配置的频率去工作。FCLK

时钟初始化流程有什么作用:可以更好的理解时钟初始化软件的设计。
---------------------------------------
思维导图:时钟初始化
1.配置lock time
2.然后通过设置分频系数来配置其他的时钟
FCLK : HCLK : PCLK=1:2:4,然后在把FCLK值定下来。其他的也就定了
4.设置FCLK
还有一个要注意的是:如果HDIVN不为0(FCLK!=HCLK),cpu的总线模式需要从快速总线模式变成异步总线模式。指令如下:S3C2440 :p243
MMU_SetAsyncBusMode
mrc p15,0,r0,r1,c0,0
orr r0,r0,#R1_nF:OR:R1_iA 我们知道他操作的cp15中c1寄存器,打开核手册,找到nF位和R1_iA,将他们都设置为1.(or)
mcr p15,0,0,r0,c1,c0,0
那么HDIVN到底是什么呢?P242 :即
3.如FCLK!=HCLK,设置cpu到异步工作模式。FCLK反映的核的频率,HCLK反映的是总线的频率。因为我们设置分频系数的时候通常都不会让这两个值相等,所以我直接将它设置为异步模式即可。
---------------------------------------------------------
手把手写代码:先找到管lock time的寄存器()S3C2440:p254
因为我们使用的是lock time的默认值,所以这个环节我们不去做。
分频系数的设定是有一些固定值的而不是我们随意选择:p242,我们可以查看行业老大u-boot是如何设定这个系数的:打开u-boot的start.S:发现选择的1:4:8,那么如何实现这个值呢?我们需要让HDIVN=2,PDIVN=1.我们需要找到改变这两个值对应的寄存器。P258,接下来设置异步模式,然后就是设置FCLK了。手册:p255页
参看表,我们将我们需要将FCLK设置为405,那么DIVN=127(0X7F),PDIV=2,SDIV=1.主要看管MPLL(它产生FCLK时钟)的寄存器。
bl clock_init
bl light_led
#define CLOCKDIVN 0x4c000014
#define MPLLCON 0x4C000004
#define MPLL_405MHZ ((127<<12)|(2<<4)|(1<<0))
clock_init:
ldr r1,=CLOCKDIVN //转载寄存器
mov r0,#0x5 //设置分频FCLK:HCLK:PCKL=1:4:8
str r0,[r1]

mrc p15,0,r0,r1,c0,0
orr r0,r0,#0xc0000000
mcr p15,0,0,r0,c1,c0,0

ldr r0,=MPLLCON
ldr r1,=MPLL_405MHZ
str r1,[r0]
mov pc,lr
---------------------------------------------------------
6410时钟初始化:通用第一步沿用默认值
设置分频系数:查看S3C6410 P124页图3-5,搜索DIVarm找到对应的寄存器。
ARMCLK = DOUTapll(533) / (APLLdiv + 1) 这是两个分频系数公式
HCLKX2 = HCLKX2in(533) / (HCLKx2div + 1)
HCLK = HCLKX2(266) / (HCLKdiv + 1)
PCLK = HCLKX2(266) / (PCLKdiv + 1)
我们选择的参考值为APLL=533MHZ,MPLL=533MHZ.查看片26页分频参数。分频系数的设置我们参考u-boot:找到lowlevel_init.S->find"CLK_DIV_VAL"->找到最后一个-》
APLLdiv 0
HCLKx2div 1
HCLKdiv 1
PCLKdiv 3
分频因子都是通过寄存器CLK_DIV0来定义的。
#define CLK_DIV0 0x7E00F020
#define OTHERS 0x7E00F900
#define APLL_CON 0x7E00F00C
#define MPLL_CON 0x7E00F010
#define CLK_SRC 0x7E00F01C
#define DIV_VAL (0x0<<0)|(0x1<<9)|(0x1<<8)|(0x11<<12)
//p147页
#define PLL_VAL (1<<31)|(266<<16)|(3<<8)|(1<<0)
init_clock:
ldr r0,=CLK_DIV0
ldr r1,=DIV_VAL
str r1,[r0]

@设置为异步模式(p169页有一个others register,然后往下看,第七位就是用来设置异步和同步模式的0: Asynchronous mode, 1: Synchronous mode )
ldr r0,=OTHERS
ldr r0,[r1]
bic r1,r1,#0xc0 //第六位我们也把它设置为0,第六位的作用是选择1:APLL,0:MPLL作为输出,这里我们选择MPLL来产生时钟。所以第六位也清零。
str r1,[r0]

@设置MPLL和APLL输出频率,p142参考表,这里我们采用第五行的设置值。先找到APLLCON,MPLLCON这两个控制寄存器的地址。然后对他们的值分别按输出频率对应的参考表进行设定。
ldr r0,=APLL_CON
ldr r1,=PLL_VAL
str r1,[r0]

ldr r0,=MPLL_CON
ldr r1,=PLL_VAL
str r1,[r0]
@6410在这里我们还有一步是没有做的,p125页,MPLL之后有个时钟源的选择(CLK_SRC[1]),这里我们应该选择1,使用MPLL的时钟源,而不是晶振的。搜索CLK_SRC寄存器p145页。

ldr r0,=CLK_SRC
mov r1,#0x3
str r1,[r0]
mov pc,lr
--------------------------------------------------------

 

posted @ 2015-08-24 20:22  高傲的monkey  阅读(837)  评论(0编辑  收藏  举报