您的位置 首页 应用

ARM学习笔记(三)时钟分频器设置

主程序里:ChangeClockDivider(key,12);//key=14cal_cpu_bus_clk();找到函数://************************[HCLK,PCLK]

主程序里:ChangeClockDivider(key, 12); //key=14

cal_cpu_bus_clk();

找到函数:

//************************[ HCLK, PCLK ]***************************
voidChangeClockDivider(inthdivn_val,intpdivn_val)
{
inthdivn=2, pdivn=0;

// hdivn_val (FCLK:HCLK)ratio hdivn
// 11 1:1 (0)
// 12 1:2 (1)
// 13 1:3 (3)
// 14 1:4 (2)
// pdivn_val (HCLK:PCLK)ratio pdivn
// 11 1:1 (0)
// 12 1:2 (1)
switch(hdivn_val)

{
case11: hdivn=0; break;
case12: hdivn=1; break;
case13:
case16: hdivn=3; break;
case14:
case18: hdivn=2; break;

}

switch(pdivn_val)

{
case11: pdivn=0; break;
case12: pdivn=1; break;
}

//Uart_Printf(“Clock division change [hdiv:%x, pdiv:%x]\n”, hdivn, pdivn);
rCLKDIVN= (hdivn<<1) | pdivn;

switch(hdivn_val)

{
case 16:// when 1, HCLK=FCLK/8.
rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<8);
break;
case 18: // when 1, HCLK=FCLK/6.
rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<9);
break;
}
//FCLK=MPLL=400MHz.FCLK:HCLK:PCLK=1:4:8HCLK=100M,PCLK=50M
if(hdivn!=0)
MMU_SetAsyncBusMode();
else
MMU_SetFastBusMode();

//假如hdivn不为0,CPU总线从FastBusMode变为AsyncBusMode
}

EXPORT MMU_SetFastBusMode
MMU_SetFastBusMode
mrc p15,0,r0,c1,c0,0 ;read ctrl register
bic r0,r0,#R1_iA:OR:R1_nF ;bic r0,r0,#0xc0000000
mcr p15,0,r0,c1,c0,0 ;write ctrl register
MOV_PC_LR

EXPORT MMU_SetAsyncBusMode
MMU_SetAsyncBusMode
mrc p15,0,r0,c1,c0,0 ;read ctrl register
orr r0,r0,#R1_nF:OR:R1_iA;orr r0,r0,#0xc0000000 (Asynchronous)
mcr p15,0,r0,c1,c0,0 ;wirte ctrl register
MOV_PC_LR

S3C2440 CPU默许的作业主频为12MHz或16.9344MHz,这儿运用最多的是12M。运用PLL电路能够发生更高的主频供CPU及外围器材运用。

S3C2440有两个PLL:MPLL和UPLL,UPLL专用与USB设备。MPLL用于CPU及其他外围器材。

经过MPLL会发生三个部分的时钟频率:FCLK、HCLK、PLCK。FCLK用于CPU核,HCLK用于AHB总线的设备(比方SDRAM),PCLK用于APB总线的设备(比方UART)。从时钟结构图中能够查看到运用不同时钟频率的硬件。

500)this.width=500;” border=0>

下面介绍MPLL的发动流程:

1、上电几毫秒后,晶振输出安稳,FCLK=晶振频率,nRESET信号康复高电平后,CPU开端履行指令。

2、咱们能够在程序最初发动MPLL,在设置MPLL的几个寄存器后,需求等候一段时刻(Lock Time),MPLL的输出才安稳。在这段时刻(Lock Time)内,FCLK停振,CPU停止作业。Lock Time的长短由寄存器LOCKTIME设定。

3、Lock Time之后,MPLL输出正常,CPU作业在新的FCLK下。

设置S3c2440的时钟频率便是设置MPLL的几个寄存器:

1、LOCKTIME:设为0x00ffffff

前面说过,MPLL发动后需求等候一段时刻(Lock Time),使得其输出安稳。位[23:12]用于UPLL,位[11:0]用于MPLL。运用确省值0x00ffffff即可。

2、CLKDIVN:用来设置FCLK:HCLK:PCLK的比例关系,默许为1:1:1

这儿值设为0x05,即FCLK:HCLK:PCLK=1:4:8

3、MPLLCON:设为(0x5c<< 12)|(0x01<< 4)|(0x01),即0x5c0011

关于MPLLCON寄存器,[19:12]为MDIV,[9:4]为PDIV,[1:0]为SDIV。有如下计算公式:

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

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

Fin 即默许输入的时钟频率12MHz。MPLLCON设为0x5c0011,能够计算出FCLK=400MHz,再由CLKDIVN的设置可知:HCLK=100MHz,PCLK=50MHz。

到这儿咱们应该完全弄清楚了程序中经常出现的几个CLK:

Fin,MPLL,UPLL,FCLK,HCLK,PCLK.

Fin指CPU外围接的晶振自身的频率,一般为12MHz。

MPLL和UPLL别离指的是用于供整机体系的PLL和专用于USB的UPLL。

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

HCLK,PCLK受CLKDIVN寄存器的影响,即当FCLK确认后,CLKDIVN决议了HCLK和PCLK

下一句子:cal_cpu_bus_clk();
staticvoidcal_cpu_bus_clk(void)
{
U32val;
U8m, p, s;

val =rMPLLCON;
m = (val>>12)&0xff;
p = (val>>4)&0x3f;
s = val&3;

FCLK= ((m+8)*(FIN/100)*2)/((p+2)*(1<m = (val>>1)&3;
p = val&1;
val =rCAMDIVN;
s = val>>8;

switch(m) {
case0:
HCLK=FCLK;
break;
case1:
HCLK = FCLK>>1;
break;
case2:
if(s&2)
HCLK=FCLK>>3;
else
HCLK=FCLK>>2;
break;
case3:
if(s&1)
HCLK=FCLK/6;
else
HCLK=FCLK/3;
break;
}

if(p)
PCLK=HCLK>>1;
else
PCLK=HCLK;

if(s&0x10)
cpu_freq =HCLK;
else
cpu_freq =FCLK;

val =rUPLLCON;
m = (val>>12)&0xff;
p = (val>>4)&0x3f;
s = val&3;
UPLL= ((m+8)*FIN)/((p+2)*(1<UCLK= (rCLKDIVN&8)?(UPLL>>1):UPLL;
}

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部