时钟频率:单位韶光内的时钟脉冲个数
时钟源:晶振:晶体振荡器
锁相环:PLL 利用外部晶振,并包含能够对晶体的特定频率更加或者分频的集成锁相环电路,对付频率较高的电路利用锁相环的本钱较低,其余利用锁相环还可以输出频率可变的时钟旗子暗记。
二、6410时钟事理图:从上图可以看到时钟源有两个选择:晶振XXTlpll和外部时钟XEXTCLK.其余还包含有3个锁相环:APLL MPLL EPLL。
其余板子上所采取的晶振是12MHz。同时从上图还可以看到
APLL ARMCLK(ACLK)------处理器-----6410
MPLL HCLK -------------AHB总线-----LCD DMA
PCLK-------------APB总线-----UART GPIO
EPLL SCLK-------------USB总线-----USB主从口
三、6410时钟初始化图:由上图可以看到在系统上电且待外部时钟(晶振)稳定震荡后SYSCLK(核时钟)与外部时钟的频率是同等。配置PLL锁相环,在PLL配置后,SYSCLK的频率变为0,即SYSCLK不事情,完成锁相环配置后,处理器会进入一段韶光的lock time韶光段,期间系统时钟不事情,在lock time过去后,系统时钟就会以配置好的时钟进行事情咯。
四、6410系统时钟初始化过程1.配置lock time-----
PLL_LOCK寄存器用于设置 PLL的lock time,保持lock time的默认值即可。
2.配置分频系数 SYSCLK PCLK HCLK的分频系数。
SYSCLK:PCLK:HCLK==1:4:8(参考U-boot)
ARMclk = APLLout/(DIVarm +1)
HCLKx2 = MPLLout/(DIVhxclkx2 +1)
HCLK =HCLKx2/(DIVhclk +1)
PCLK =HCLKx2/(DIVpclk +1)
参考uboot 对付分频因子的设置:DIVpclk------3 DIVhclk-----1 DIVhxclkx2----1 DIVarm---0
并同时设置APLLout=MPLLout = 533Mhz
3.设置异步模式.
在6410中对付核和总线的同步和异步模式的设置是通过OTHERS寄存器的第7位来设置,其余还需将此寄存器的第6清0,由于利用的异步模式,须要利用MPLL的输出作为DIVhclkx2的输入。
4.配置SYSCLK
参考上面的末了一幅图的对应值,配置APLL_CON和MPLL_CON寄存器即可。
5.时钟源选择
参考步骤2中的图,可以看到,对付DIVarm和DIVhclkx2的输入须要通过CLK_SRC的MUXapll 和MUXmpll对应位去设置APLL和MPLL的输出为其输入即可。设置CLK_SRC的对应位即可。
五、学习方法:
1.查阅对应的芯片手册,理解对应过程的配置的大致方法
2.对付分频系数等参数不愿定的情形下,参考u-boot源码即可。
六、源码.text
.global _start
_start:
b reset
ldr pc,_undefined_instruction
ldr pc,_prefetch_abort
ldr pc,_data_abort
ldr pc,not_used
ldr pc,_irq
ldr pc,_fiq
_undefined_instruction: .word undefined_instruction
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq
undefined_instruction:
nop
software_interrupt:
nop
prefetch_abort:
nop
data_abort:
nop
not_used:
nop
irq:
nop
fiq:
nop
reset:
bl set_svc
bl set_peri_port
bl disable_watchdog
bl disable_interrupt
bl disable_mmu
bl clock_init
bl light_led
#set svc mode && disabel fiq && irq
set_svc:
mrs r0,cpsr
bic r0,r0,#0xdf
orr r0,r0,#0xd3
msr cpsr,r0
mov pc,lr
###set peri port base address
set_peri_port:
ldr r0,=0x70000000
orr r0,r0,#0x13
mcr p15,0,r0,c15,c2,4
mov pc,lr
#diable watch dog
#define pWTCON 0x7e004000
disable_watchdog:
ldr r0,=pWTCON
mov r1,#0x0;
str r1,[r0]
mov pc,lr
#disable interrupt
#define pVIC0INTENCLEAR 0x71200014
#define pVIC1INTENCLEAR 0x71300014
disable_interrupt:
ldr r0,=pVIC0INTENCLEAR
mvn r1,#0x0;
str r1,[r0]
ldr r0,=pVIC1INTENCLEAR
mvn r1,#0x0;
str r1,[r0]
mov pc,lr
#disable mmu && icache dcache
disable_mmu:
mcr p15,0,r0,c7,c7,0
mrc p15,0,r0,c1,c0,0
bic r0,r0,#0x00000005
mcr p15,0,r0,c1,c0,0
mov pc,lr
###init CLK
#define CLK_DIV0 0x7e00f020
#define DIV_VAL (0x0<<0)|(0x1<<9)|(0x1<<8)|(0x3<<12)
#define OTHERS 0x7e00f900
#define APLL_CON 0x7e00f00c
#define MPLL_CON 0x7e00f010
#define PLL_VAL (0x1<<31)|(266<<16)|(3<<8)|(1<<0)
#define CLK_SRC 0x7e00f01c
clock_init:
ldr r0,=CLK_DIV0
ldr r1,=DIV_VAL
str r1,[r0]
ldr r0,=OTHERS
ldr r1,[r0]
bic r1,#0xc0
str r1,[r0]
ldr r0,=APLL_CON
ldr r1,=PLL_VAL
str r1,[r0]
ldr r0,=MPLL_CON
ldr r1,=PLL_VAL
str r1,[r0]
ldr r0,=CLK_SRC
mov r1,#0x7
str r1,[r0]
mov pc,lr
#####light all the led of the board
#define GPMCON 0x7f008820
#define GPMDAT 0x7f008824
light_led:
ldr r0,=GPMCON
ldr r1,=0x001111
str r1,[r0]
ldr r0,=GPMDAT
ldr r1,=0x01
str r1,[r0]
mov pc,lr