首页 » 智能 » g-boot_时钟初始化_时钟_分频

g-boot_时钟初始化_时钟_分频

admin 2024-12-18 10:50:22 0

扫一扫用手机浏览

文章目录 [+]

时钟频率:单位韶光内的时钟脉冲个数

时钟源:晶振:晶体振荡器

g-boot_时钟初始化_时钟_分频 智能

锁相环: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

标签:

相关文章

换行在C语言编程中的重要性及其应用

在C语言编程中,换行符是一种常见的字符,用于实现文本的分行显示。换行符并非仅仅是文本排版的需要,它在C语言编程中具有重要的作用。本...

智能 2025-01-03 阅读0 评论0

探寻C语言之美,星星闪烁的背后

在我国,编程教育正逐渐普及,越来越多的青少年开始接触并学习编程。其中,C语言作为一门基础性、应用性极强的编程语言,受到了广泛关注。...

智能 2025-01-03 阅读0 评论0