ARM裸机之CLOCK

发布者:NanoScribe最新更新时间:2021-07-14 来源: eefocus关键字:ARM  裸机  CLOCK 手机看文章 扫描二维码
随时随地手机看文章

1、什么是时钟?SoC为什么需要时钟?

(1)生活中时钟是用来记录时间的,而在SOC中时钟代表了一种同步的节拍。

(2)SOC中的各部件在时钟系统的作用下协同工作。


2、时钟一般如何获得

(1)外部输入时钟信号,SOC通过引脚从外部输入时钟信号。

(2)外部晶体振荡器+内部时钟发生器产生时钟信号。

(3)外部晶体振荡器+内部时钟发生器+内部PLL产生高频时钟+内部分频器(各部件都有自己的分频器)产生各种频率时钟。


3、时钟设置步骤:

(1)、暂不使用PLL。

(2)、设置锁定时间,使用默认值即可。

(3)、设置PLL倍频后的目标值。

(4)、设置分频

(5)、设置各种PLL的MUX,使用PLL。


4、汇编代码实现

#define ELFIN_CLOCK_POWER_BASE0xE0100000


#define APLL_LOCK_OFFSET0x00

#define MPLL_LOCK_OFFSET0x08


#define APLL_CON0_OFFSET0x100

#define APLL_CON1_OFFSET0x104

#define MPLL_CON_OFFSET0x108


#define CLK_SRC0_OFFSET0x200

#define CLK_SRC1_OFFSET0x204

#define CLK_SRC2_OFFSET0x208

#define CLK_SRC3_OFFSET0x20c

#define CLK_SRC4_OFFSET0x210

#define CLK_SRC5_OFFSET0x214

#define CLK_SRC6_OFFSET0x218

#define CLK_SRC_MASK0_OFFSET        0x280

#define CLK_SRC_MASK1_OFFSET        0x284


#define CLK_DIV0_OFFSET0x300

#define CLK_DIV1_OFFSET0x304

#define CLK_DIV2_OFFSET0x308

#define CLK_DIV3_OFFSET0x30c

#define CLK_DIV4_OFFSET0x310

#define CLK_DIV5_OFFSET0x314

#define CLK_DIV6_OFFSET0x318

#define CLK_DIV7_OFFSET0x31c


#define APLL_MDIV       0x7d// 125

#define APLL_PDIV       0x3

#define APLL_SDIV       0x1


#define MPLL_MDIV0x29b// 667

#define MPLL_PDIV0xc

#define MPLL_SDIV0x1


#define set_pll(mdiv, pdiv, sdiv)(1<<31 | mdiv<<16 | pdiv<<8 | sdiv)

#define APLL_VALset_pll(APLL_MDIV,APLL_PDIV,APLL_SDIV)

#define MPLL_VALset_pll(MPLL_MDIV,MPLL_PDIV,MPLL_SDIV)


.global clock_init

clock_init:

ldrr0, =ELFIN_CLOCK_POWER_BASE


// 设置CLK_SRC0寄存器bit[0]选FINPLL

ldrr1, =0x0

strr1, [r0, #CLK_SRC0_OFFSET]


// 设置PLL后,时钟从输入源FIN提升到目标频率时,需要一定的时间。

ldrr1,=0x00000FFF

strr1,[r0, #APLL_LOCK_OFFSET]

str r1, [r0, #MPLL_LOCK_OFFSET]


// 设置APLL_CON0寄存器,FOUT = MDIV*FIN/(PDIV*2^(SDIV-1))=0x7d*24/(0x3*2^(1-1))=1000 MHz

ldrr1, =APLL_VAL

strr1, [r0, #APLL_CON0_OFFSET]

// 设置MPLL_CON0寄存器,FOUT = MDIV*FIN/(PDIV*2^SDIV)=0x29b*24/(0xc*2^1)= 667 MHz

ldrr1, =MPLL_VAL

strr1, [r0, #MPLL_CON_OFFSET]

// 设置CLK_DIV0寄存器清bit[0~31]。

ldr r1, [r0, #CLK_DIV0_OFFSET]

ldrr2, =0xFFFFFFFF

bicr1, r1, r2

// 设置CLK_DIV0寄存器[0~31]写相关位。

ldrr2, =((0<<0) | (4<<4) | (4<<8) | (1<<12) | (3<<16) | (1<<20) | (4<<24) | (1<<28))

orrr1, r1, r2

strr1, [r0, #CLK_DIV0_OFFSET]


// 设置CLK_SRC0寄存器。

ldrr1, [r0, #CLK_SRC0_OFFSET]

ldrr2, =((1<<0) | (1<<4) | (1<<8) | (1<<12) | (0<<16) | (0<<20) | (0<<24) | (1<<28))

orrr1, r1, r2

strr1, [r0, #CLK_SRC0_OFFSET]


movpc, lr


参考资料:《ARM裸机全集---朱有鹏老师》


关键字:ARM  裸机  CLOCK 引用地址:ARM裸机之CLOCK

上一篇:ARM怎么入门
下一篇:ARM裸机之点亮LED

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved