时钟初始化——精选推荐

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

时钟初始化
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
--------------------------------------------------------。

相关文档
最新文档