S3C2440A时钟(clock)模块介绍

系统时钟:
JZ2440V3开发板在没有开启时钟前,整个开发板全靠一个12MHz的晶振提供频率来运行,也就是说CPU,内存,UART等需要用到时钟频率的硬件都工作12MHz下,而S3C2440A可以正常工作在400MHz下,两者速度相差可想而知,就好比牛车和动车。如果CPU工作在12MHz频率下,开发板的使用效率非常低,所有依赖系统时钟工作的硬件,其工作效率也很低,比如,我们电脑里面经常提到的超频,超频就是让CPU工作在更高的频率下,让电脑运算速度更快,虽然频率是越高越好,但是由于硬件特性决定了任何一个设备都不可能无止境的超频,电脑超频时要考虑到CPU或主板发热过大,烧坏的危险,同样开发板的主板上的外设和CPU也有一个频率限度,ARM920T内核的S3C2440的最高正常工作频率如下:

  • FCLK:400MHz
  • HCLK:100MHz
  • PCLK:50MHz

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

1.系统工作时钟频率

在对系统时钟进行提速之前,让我们先来了解下S3C2440上的工作时钟频率:FCLK,HCLK,PCLK,其中FCLK主要为ARM920T内核提供工作频率,如图2-44所示:

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

PCLK主要为APB总线提供工作频率,由图2-46所示,APB总线主要挂接UART串口,Watchdog等硬件控制器。

也就是说,对于一些需要时钟工作的硬件,如果切断其时钟源 ,就不会再工作,从而达到降低功耗的目的,这也是便携嵌入式设备里的一个特点。
时钟源:为了减少外界环境对开发板电磁干扰,降低制作成本,通常开发板的外部晶振时钟频率都很低,JZ2440V3开发板由12MHz的晶振来提供时钟源,要想让CPU运行在更高的频率就要通过时钟控制逻辑单元PLL(锁相环)来提高主频。
S3C2440里有两个PLL:MPLL和UPLL,MPLL用来产生FCLK,HCLK,PCLK的高频工作时钟,UPLL用来为USB提供工作频率。

开发板上电后,晶振OSC开始提供晶振时钟,由于系统刚刚上电,电压信号等都还不稳定,这时复位信号(nRESET)拉低,这时MPLL虽然默认启动,但是如果不向MPLLCON中写入值,那么外部晶振则直接作为系统时钟FCLK,过几毫秒后,复位信号上拉,CPU开始取指运行,这时可以通过代码设置启动MPLL,MPLL启动需要一定锁定时间(LockTime),这是因为MPLL输出频率还没有稳定,在这期间FCLK都停止输出,CPU停止工作,过了LockTime后时钟稳定输出,CPU工作在新设置的频率下,这时可以通过设置FCLK,HCLK和PCLK三者的频率比例来产生不同总线上需要的不同频率,下面详细介绍开启MPLL的过程:

  • 设置LockTime变频锁定时间;
  • 设置FCLK与晶振输入频率(Fin)的倍数;
  • 设置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]

UPLLUCLK的锁定时间值

(U_TIME:300us)

0xFFFF

M_TIME

[15:0]

MPLL对于FCLKHCLKPCLK的锁定时间值(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设置比例

如果HDIVN设置为非0,CPU的总线模式要进行改变,默认情况下FCLK = HCLK,CPU工作在fast bus mode快速总线模式下,HDIV设置为非0后, FCLK与HCLK不再相等,要将CPU改为asynchronous bus mod异步总线模式,可以通过下面的嵌入汇编代码实现:

__asm{ 
	mrc p15, 0, r1, c1, c0, 0		/* 读取CP15 C1寄存器 */ 
	orr r1, r1, #0xc0000000         /* 设置CPU总线模式 */ 
	mcr p15, 0, r1, c1, c0, 0		/* 写回CP15 C1寄存器 */
} 

关于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相同时钟

1PCLK是和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

如果要禁止某个硬件外设的时钟,可以通过设置CLKCON寄存器。下表是此寄存器的定义。

寄存器名地址是否读写描述复位默认值
CLKCON0x4C00000CR/W时钟控制寄存器0xFFFFF0
CLKCON描述初始值
AC97[20]

PCLK控制的AC97模块

0 = 禁止,1 = 使能

1
Camera[19]

HCLK控制的相机模块

0 = 禁止,1 = 使能

1
SPI[18]

PCLK控制的SPI模块

0 = 禁止,1 = 使能

1
IIS[17]

PCLK控制的IIS模块

0 = 禁止,1 = 使能

1
IIC[16]

PCLK控制的IIC模块

0 = 禁止,1 = 使能

1
ADC[15]

PCLK控制的ADC模块

0 = 禁止,1 = 使能

1
RTC[14]

PCLK控制的RTC模块

0 = 禁止,1 = 使能

1
GPIO[13]

PCLK控制的GPIO模块

0 = 禁止,1 = 使能

1
UART2[12]

PCLK控制的UART2模块

0 = 禁止,1 = 使能

1
UART1[11]

PCLK控制的UART1模块

0 = 禁止,1 = 使能

1
UART0[10]

PCLK控制的UART0模块

0 = 禁止,1 = 使能

1
SDI[9]

PCLK控制的SDI模块

0 = 禁止,1 = 使能

1
PWMTIMER[8]

PCLK控制的PWMTIMER模块

0 = 禁止,1 = 使能

1
USB外设[7]

PCLK控制的USB外设模块

0 = 禁止,1 = 使能

1
USB主控[6]

HCLK控制的USB主机模块

0 = 禁止,1 = 使能

1
LCDC[5]

HCLK控制的LCDC模块

0 = 禁止,1 = 使能

1
NAND控制器[4]

HCLK控制的NAND模块

0 = 禁止,1 = 使能

0
SLEEP[3]

控制S3C2440A的休眠模式

0 = 禁止,1 = 转换到休眠模式

0
IDLE位[2]

进入空闲模式

0 = 禁止,1 = 过渡到IDLE模式

0
Reserved[1:0]Reserved0

从上表可以看出,当往某位写1时就使能了相应外设的时钟,此外设就可以正常工作了。

此外,具体外设的时钟还要根据具体外设能够支持的工作频率进行设置。例如,LCD能够支持的工作频率为10MHz,那么还要设置LCDCON1寄存器来进一步设置让LCD控制器工作的频率。

完!

本文转自:https://blog.csdn.net/mr_raptor/article/details/6555734

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值