您的位置 首页 观点

S3C2440体系时钟

MINI2440开发板在没有开启时钟前,整个开发板全靠一个12MHz的晶振提供频率来运行,也就是说CPU,内存,UART等需要用到时钟频率的硬件都工作

MINI2440开发板在没有敞开时钟前,整个开发板全赖一个12MHz的晶振供给频率来运转,也便是说CPU,内存,UART等需求用到时钟频率的硬件都作业12MHz下,而S3C2440A能够正常作业在400MHz下,两者速度相差可想而知,就比方牛车和动车。假如CPU作业在12MHz频率下,开发板的运用功率十分低,一切依靠体系时钟作业的硬件,其作业功率也很低,比方,咱们电脑里边常常说到的超频,超频便是让CPU作业在更高的频率下,让电脑运算速度更快,尽管频率是越高越好,可是因为硬件特性决议了任何一个设备都不或许无止境的超频,电脑超频时要考虑到CPU或主板发热过大,烧坏的风险,相同开发板的主板上的外设和CPU也有一个频率极限,ARM920T内核的S3C2440的最高正常作业频率如下:

l FCLK:400MHz

l HCLK:100MHz

l PCLK:50MHz

既然如此,那么怎样让CPU作业在400MHz,让牛车速度进步到动车的速度呢?

1 体系作业时钟频率

在对体系时钟进行提速之前,让咱们先来了解下S3C2440上的作业时钟频率,FCLK,HCLK,PCLK,其间FCLK首要为ARM920T内核供给作业频率,如图2-44所示:

图2-44 ARM920T内核结构

HCLK首要为S3C2440 AHB总线(Advanced High performance Bus)上挂接硬件供给作业频率,AHB总线首要挂接有内存,NAND,LCD操控器等硬件,如图2-45所示:

图2-45 S3C2440 AHB总线上挂接硬件

PCLK首要为APB总线供给作业频率,由图2-46所示,APB总线首要挂接UART串口,Watchdog等硬件操控器。

图2-46 S3C2440 APB总线挂接硬件

也便是说,关于一些需求时钟作业的硬件,假如堵截其时钟源,就不会再作业,然后到达降低功耗的意图,这也是便携嵌入式设备里的一个特色。

时钟源:为了削减外界环境对开发板电磁搅扰,下降制造本钱,一般开发板的外部晶振时钟频率都很低,MINI2440开发板由12MHz的晶振来供给时钟源,要想让CPU运转在更高的频率就要经过时钟操控逻辑单元PLL(锁相环)来进步主频。

S3C2440里有两个PLL:MPLL和UPLL,MPLL用来发生FCLK,HCLK,PCLK的高频作业时钟,UPLL用来为USB供给作业频率。

图2-47体系时钟初始化时序

开发板上电后,晶振OSC开端供给晶振时钟,因为体系刚刚上电,电压信号等都还不安稳,这时复位信号(nRESET)拉低,这时MPLL尽管默许发动,可是假如不向MPLLCON中写入值,那么外部晶振则直接作为体系时钟FCLK,过几毫秒后,复位信号上拉,CPU开端取指运转,这时能够经过代码设置发动MPLL,MPLL发动需求必定确定时刻(LockTime),这是因为MPLL输出频率还没有安稳,在这期间FCLK都中止输出,CPU中止作业,过了LockTime后时钟安稳输出,CPU作业在新设置的频率下,这时能够经过设置FCLK,HCLK和PCLK三者的频率份额来发生不同总线上需求的不同频率,下面具体介绍敞开MPLL的进程:

l 设置LockTime变频确定时刻

l 设置FCLK与晶振输入频率(Fin)的倍数

l 设置FCLK,HCLK,PCLK三者之间的份额

LockTime变频确定时刻由LOCKTIME寄存器(见下表)来设置,因为变频后开发板一切依靠时钟作业的硬件都需求一小段调整时刻,该时刻计数经过设置LOCKTIME寄存器[31:16]来设置UPLL(USB时钟锁相环)调整时刻,经过设置LOCKTIME寄存器[15:0]设置MPLL调整时刻,这两个调整时刻数值一般用其默许值即可。

表2-8变频确定时刻寄存器(LOCKTIME)

寄存器名

地址

是否读写

描绘

复位默许值

LOCKTIME

0x4C000000

R/W

变频确定时刻寄存器

0xFFFFFFFF

LOCKTIME

描绘

初始值

U_TIME

[31:16]

UPLL对UCLK的确定时刻值

(U_TIME:300us)

0xFFFF

M_TIME

[15:0]

MPLL关于FCLK,HCLK,PCLK的确定时刻值(M_TIME:300us)

0xFFFF

FCLK与Fin的倍数经过MPLLCON寄存器设置,三者之前有以下联系:

MPLL(FCLK) = (2*m*Fin)/(p*2^s)

其间:m = MDIV + 8, p = PDIV + 2, s = SDIV

当设置完MPLL之后,就会主动进入LockTime变频确定期间,LockTime之后,MPLL输出安稳时钟频率。

表2-9 MPLL装备寄存器(MPLLCON)

寄存器名

地址

是否读写

描绘

复位默许值

MPLLCON

0x4C000004

R/W

MPLL装备寄存器

0x00096030

MPLLCON

描绘

初始值

MDIV

[19:12]

分频器操控位

0x96

PDIV

[9:4]

预分频器操控位

0x03

SDIV

[1:0]

后分频器操控位

0x0

经过上述算法比较难以找到适宜的PLL值,下表给出了官方引荐的一些MPLL参阅设置:

表2-10官方引荐MPLL

FCLK,HCLK,PCLK三者之间的份额经过CLKDIVN寄存器进行设置,S3C2440时钟设置时,还要额定设置CAMDIVN寄存器,如下表,HCLK4_HALF,HCLK3_HALF别离与CAMDIVN[9:8]对应,下表列出了各种时钟份额:

表2-11 FCLK HCLK PCLK设置份额

假如HDIV设置为非0,CPU的总线形式要进行改动,默许情况下FCLK = HCLK,CPU作业在fast bus mode快速总线形式下,HDIV设置为非0后,FCLK与HCLK不再持平,要将CPU改为asynchronous bus mod异步总线形式,能够经过下面的嵌入汇编代码完成:

__asm{

mrc p15, 0, r1, c1, c0, 0

orr r1, r1, #0xc0000000

mcr p15, 0, r1, c1, c0, 0

}

关于mrc与mcr指令,请检查MMU与内存保护的完成章节。

表2-12时钟分频器操控寄存器(CLKDIVN)

寄存器名

地址

是否读写

描绘

复位默许值

CLKDIVN

0x4C000014

R/W

时钟分频器操控寄存器

0x00000000

CLKDIVN

描绘

初始值

DIV_UPLL

[3]

UCLK挑选寄存器(UCLK有必要对USB供给48MHz)

0:UCLK=UPLL clock

1:UCLK=UPLL clock/2

0

HDIVN

[2:1]

00:HCLK = FCLK/1

01:HCLK = FCLK/2

10:HCLK = FCLK/4,当CAMIVN[9]=0

HCLK = FCLK/8,当CAMIVN[9]=1

11: HCLK = FCLK/3,当CAMIVN[8]=0

HCLK = FCLK/6,当CAMIVN[8]=1

0

PDIVN

[0]

0:PCLK是和HCLK/1相同时钟

1:PCLK是和HCLK/2相同时钟

0

表2-13摄像头时钟分频操控寄存器(CAMDIVN)

寄存器名

地址

是否读写

描绘

复位默许值

CAMDIVN

0x4C000018

R/W

摄像头时钟分频操控寄存器

0x00000000

CAMDIVN

描绘

初始值

HCLK4_HALF

[9]

HDIVN分频因子挑选位(当CLKIVN[2:1]位为10b时有用)

0: HCLK=FCLK/4

1: HCLK=FCLK/8

0

HCLK3_HALF

[8]

HDIVN分频因子挑选位(当CLKIVN[2:1]位为11b时有用)

0: HCLK=FCLK/3

1: HCLK=FCLK/6

0

2 时钟驱动试验

体系时钟驱动能够别离用ARM汇编和C言语两个版别完成。

ARM汇编版别:

;以下为时钟相关寄存器地址

LOCKTIME EQU 0x4c000000

MPLLCON EQU 0x4c000004

CLKDIVN EQU 0x4c000014

CAMDIVN EQU 0x4c000018

clock_init ; 时钟初始化代码

; 设置变频确定时刻

ldr r0, =LOCKTIME

ldr r1, =0x00ffffff

str r1, [r0]

; 设置分频比FCLK:HCLK:PCLK=1:4:8

; 因为CAMDIVN[9]位初始值为0,寄存器CAMDIVN未运用,这儿不必再设置其值

ldr r0, =CLKDIVN

mov r1, #0x05

str r1, [r0]

; 修正CPU总线形式

mrc p15, 0, r1, c1, c0, 0

orr r1, r1, #0xc0000000

mcr p15, 0, r1, c1, c0, 0

ldr r0, =MPLLCON

ldr r1, =0x5c011 ; MPLL = 400MHz

str r1, [r0]

mov pc, lr ; 函数调用回来

该汇编代码入口处先设置了变频确定时刻为0x00ffffff,然后设置FCLK:HCLK:PCLK的分频比,因为体系时钟现已改动,需求修正CPU总线形式,最终设置体系时钟作业频率。

C言语版别:

LOCKTIME = 0x00ffffff;

CLKDIVN = 0x05;

__asm{

mrc p15, 0, r1, c1, c0, 0

orr r1, r1, #0xc0000000

mcr p15, 0, r1, c1, c0, 0
}

MPLLCON = MPLL_400MHz;

}

C言语版别与汇编版别相同,仅仅因为修正CPU总线形式时要运用mrc指令,因而只能运用C言语嵌入汇编方法来完成。

体系时钟驱动试验:

;

;体系时钟初始化试验

;

WTCON EQU 0x53000000 ; 看门狗操控寄存器

WTDAT EQU 0x53000004 ; 看门狗数据寄存器

LOCKTIME EQU 0x4c000000 ; 变频确定时刻寄存器

MPLLCON EQU 0x4c000004 ; MPLL寄存器

CLKDIVN EQU 0x4c000014 ; 分频比寄存器

GPBCON EQU 0x56000010 ; LED操控寄存器

GPBDAT EQU 0x56000014 ; LED数据寄存器

GPBUP EQU 0x56000018 ; 上拉电阻设置寄存器

DELAYVAL EQU 0x8fff ; 延时数值

AREA CLOCK, CODE, READONLY

ENTRY
start

ldr r0, = 0x53000000 ; 看门狗封闭代码

mov r1, #0

str r1, [r0]

bl clock_init ; 调用时钟初始化函数

bl led_on ; 调用点亮Led函数

clock_init ; 时钟初始化代码

; 设置锁频时刻

ldr r0, =LOCKTIME ; 获得LOCKTIME寄存器地址

ldr r1, =0x00ffffff ; LOCKTIME寄存器设置数据

str r1, [r0] ; 将LOCKTIME设置数据写入LOCKTIME寄存器

; 设置分频数

ldr r0, =CLKDIVN ; 获得CLKDIVN寄存器地址

mov r1, #0x05 ; CLKDIVN寄存器设置数据

str r1, [r0] ; 将CLKDIVN设置数据写入CLKDIVN寄存器

; 修正CPU总线形式

mrc p15, 0, r1, c1, c0, 0

orr r1, r1, #0xc0000000

mcr p15, 0, r1, c1, c0, 0

ldr r0, =MPLLCON

ldr r1, =0x5c011 ; MPLL is 400MHz

str r1, [r0]

mov pc, lr

led_on ; 亮点Led函数

; Led初始化开端

ldr r0,=GPBCON ; 将LED操控寄存器地址放入r0

ldr r1,[r0] ; 将操控寄存器里的值读出放入r1

bic r1,r1,#0x3fc00 ; 将r1里的值(操控寄存器里的值)

; bit[10]~bit[17]清位,其它位不变

orr r1,r1,#0x15400 ; 设置操控寄存器

str r1,[r0] ; 将r1里的值写入操控寄存器

; 制止GPF4-GPF7端口的上拉电阻

ldr r0,=GPBUP

ldr r1,[r0]

orr r1,r1,#0x1e0

str r1,[r0]

; Led初始化完毕

led_loop ; 循环点亮Led

ldr r2,=GPBDAT ; 将LED数据寄存器的地址放入r2

ldr r3,[r2] ; 将数据寄存器(r2)里的值放入r3

bic r3,r3,#0x1e0 ; 铲除bit[5]~bit[8],bit[n]代表led1~led4

orr r3,r3,#0x1c0 ; 清对应Led位-亮灯,设置相应位-灭灯(点亮led1)

str r3,[r2] ; 将操控亮灯数据写入数据寄存器r2

ldr r0,=DELAYVAL ; 设置推迟数

bl delay ; 调用推迟子程序

ldr r3,[r2] ; 将数据寄存器(r2)里的值放入r3

bic r3,r3,#0x1e0 ; 铲除bit[5]~bit[8],bit[n]代表led1~led4

orr r3,r3,#0x1a0 ; 清对应Led位-亮灯,设置相应位-灭灯(点亮led2)

str r3,[r2] ; 将操控亮灯数据写入数据寄存器r2

ldr r0,=DELAYVAL ; 设置推迟数

bl delay ; 调用推迟子程序

ldr r3,[r2] ; 将数据寄存器(r2)里的值放入r3

bic r3,r3,#0x1e0 ; 铲除bit[5]~bit[8],bit[n]代表led1~led4

orr r3,r3,#0x160 ; 清对应Led位-亮灯,设置相应位-灭灯(点亮led3)

str r3,[r2] ; 将操控亮灯数据写入数据寄存器r2

ldr r0,=DELAYVAL ; 设置推迟数

bl delay ; 调用推迟子程序

ldr r3,[r2] ; 将数据寄存器(r2)里的值放入r3

bic r3,r3,#0x1e0 ; 铲除bit[5]~bit[8],bit[n]代表led1~led4

orr r3,r3,#0xe0 ; 清对应Led位-亮灯,设置相应位-灭灯(点亮led4)

str r3,[r2] ; 将操控亮灯数据写入数据寄存器r2

ldr r0,=DELAYVAL ; 设置推迟数

bl delay ; 调用推迟子程序

b led_loop

delay

sub r0,r0,#1 ; r0=r0-1

cmp r0,#0x0 ; 将r0的值与0相比较

bne delay ; 比较的成果不为0,持续调用delay

mov pc,lr ; 回来

END ; 程序完毕符

该试验首要封闭了看门狗定时器,然后修正体系时钟,将默许体系作业频率12MHz进步到400MHz,因为CPU作业在较高频率下,其履行速度显着比未发动体系时钟时高的多,能够经过注释掉体系时钟初始化代码跳转指令bl clock_init,比照LED的跑马灯作用能够证明。

++++++++++++++++++++++++++++++++++++++++++

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/guandian/262968.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部