微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2440系统时钟

S3C2440系统时钟

时间:11-21 来源:互联网 点击:

,默认情况下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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top