S3C2440系统时钟
,默认情况下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
S3C2440系统时 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)