原创 三、S3C2440上电初始化

2011-8-2 12:33 4212 10 10 分类: MCU/ 嵌入式

写在前面的话:在学习电子的时候走了很多弯路,现在想想非常感谢关心过我的人,我真的很感谢他们,但是现在回想起来确实可以让路走的更直一点。

第一章、ARM9处理器S3C2440上电初始化

1.1 时钟频率管理----锁相环MPLLUPLL

20110802123249001.png                   1-1

       首先现在知道的是S3C2440拥有2个锁相环,一个是MPLL,一个是UPLL

MPLL用于  CPU及其他外围器件。UPLL用于USB提供48MHz.外部时钟源经过MPLL处理后能够得到三种不同的系统时钟。他们分别是FCLK,HCLK,PCLK三种频率,这三种频率分别有不同的用途。

    FCLKCPU提供时钟信号。主频时钟用于ARM920T内核。

    HCLK是为AHB总线提供的时钟信号,主要用于高速外设,比如内存控制器,中断控制器,LCD控制器,DMA以及USB主模块等。

    PCLK是为APB总线提供的时钟信号,主要用于低速外设,比如看门狗,UART控制器,IIS,I2C,SDI/MMC,GPIO,RTC and SPI

    这三个系统时钟具有一地定的比例关系,这种关系是通过寄存器CLKDIVN中的HDIVN位和PDIVN位来控制的,因此我们知道了FCLK,再通过这2为的控制就能确定HCLK,PCLK.FCLK则是通过外部时钟源的频率,经过一个计算公式来得到的。

1.1.1 晶振电路和外部时钟

       S3C2440的时钟源可以由晶振电路提供还可以选择用外部时钟来提供,图1-2所示即为2种时钟源的提供方式。

20110802123249002.png

1-2

1.1.2时钟源选择

S3C2440的时钟可以选用晶振(XTAL),也可以使用外部时钟(EXTCLK),由系统复位时,在复位信号上升沿对引脚OM3OM2所测的状态来确定。其对应关系如表2-1所示

OM[3:2]

主时钟源

USB时钟源

00

<?xml:namespace prefix = st1 />Crystal

Crystal

01

Crystal

EXTCLK

10

EXTCLK

Crystal

11

EXTCLK

EXTCLK

1-1

       20110802123249003.jpg

1-3

       上图1-3所示的即是时钟选择控制位的真值表。即是确定时钟来源的控制位。

1.1.3 时钟发生器框图

20110802123250004.jpg 1-4 时钟发生器框图

       从图1-4中我们可以看出S3C2440含有两个锁相环MPLLUPLL产生系统所需要的时钟。

MPLLFCLKCPUHCLKAHB总线,PCLKAPB总线

UPLL: USB 产生UCLK 48MHz)CAM摄像头。

1.1.4 时钟频率管理

(1) 使用HCLK的设备:

    中断控制器、存储器管理器、DMA控制器、LCD控制器、FLASH控制器、USB Host(不用PLL时)、总线控制器、片外设备.

(2) 使用PCLK的设备:

117个通用I/OGPIOADC5个定时器与4PWM3UART2SPIIICUSB Device (不用PLL时)、RTCWDTSD卡接口、IIS接口(Host and Device.

20110802123250005.png20110802123250006.png

1-5 时钟频率管理

1.1.5频率计算

1)锁相环输出频率

     MPLL =m×Fin×2/p×2S

              m = M8              MM寄存器的值

              p = P2         PP寄存器的值

              SS寄存器的值

1.1.6 程序分析

       看了这么久得理论,最终还是得看懂代码的。

       mpll_val = (92<<12)|(1<<4)|(1);

       //////////////////////////////////////////////////////////

       //101 1100 0000 0000 0000

       //                        1 0000

       //                        1 

      //101 1100 0000 0001 0001

       //////////////////////////////////////////////////////////

       //init FCLK=400M, so change MPLL first

       确定时钟频率最关键的代码的就是下面的两句了

       ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);

上面调函数实现了MDIV=92  PDIV=1  SDIV=1从而计算MPLLUPLL的值。

m=(MDIV+8)=100,  p=(PDIV+2)=3s=SDIV=1.

       ChangeClockDivider(key, 12);
   
我再找出函数的原型分析下,

//*************************[ MPLL ]*******************************

下面这个函数就是确定MPLLCON寄存器的值也就是确定MDIVPDIVSDIV的值。

void ChangeMPllValue(int mdiv,int pdiv,int sdiv)

{

    rMPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

下面这个函数就是改变FCLKHCLKPCLK之间的比例关系

void ChangeClockDivider(int hdivn_val,int pdivn_val)

{

       int hdivn=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) {

              case 11: hdivn=0; break;

              case 12: hdivn=1; break;

              case 13:

              case 16: hdivn=3; break;

              case 14:

              case 18: hdivn=2; break;

       }

       switch(pdivn_val) {

              case 11: pdivn=0; break;

              case 12: pdivn=1; break;

       }

              rCLKDIVN = (hdivn<<1) | pdivn;

       switch(hdivn_val) {

              case 16:        // when 1, HCLK=FCLK/6.

                     rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<8);

              break;

              case 18:       // when 1, HCLK=FCLK/8.

                     rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<9);

              break;

       }

    if(hdivn!=0)

        MMU_SetAsyncBusMode();

    else

        MMU_SetFastBusMode();

}

20110802123250007.png

       上面已经计算出来m=(MDIV+8)=100,  p=(PDIV+2)=3s=SDIV=1.

m p s 的值,从而可以得出 MPLL=(2*100*12)/(3*1)=400MHZ

                                          m=77+8=85,p=5,s=0

UPLL=(85*12)/(5*1)=97/5=

FCLK=400MHZ

又因为FCLK:HCLK:PCLK的分频比为1:4:8,从而得到HCLK的值为100MHZ,PCLK的值为50MHZ

2S3C2440内核时钟频率

     使用锁相环:FCLK=MPLL

     慢模式下:  FCLK=MPLL/除数器比率

20110802123250008.jpg20110802123250009.png

1-6 锁相环(倍频器)工作原理图

1.2 S3C2440电源管理模块

1.2.1具有4种电源管理模式:

(1) 正常模式 NORMAL

锁相环工作

CPU和所有片内外设提供时钟

    此模式系统功耗最大

NORMAL:这个模块支持CPU时钟以及2440相应的外围设备时钟。这个模式下,电源消耗是最大的。它允许通过软件编程来控制外部设备的操作。例如,如果一个定时器Timer不需要时,那么用户可以通过CLKCON寄存器来关闭时钟和Timer相连,来降低电源消耗。

(2) 慢时钟模式 SLOW

       锁相环不工作

CPU等直接使用原始时钟、或原始时钟的分频工作,此模式工作时钟频率低而使功耗低,并且锁相环不工作也使功耗降低.

SLOW模式:又叫NON-PLL模式,不同于Normal模式,这个模式使用的时一个外部时钟来直接驱动2440的主频FCLK,不通过PLL,在这个模式下,电源的消耗仅仅和外部时钟频率有关,电源同PLL有关的消耗可以忽略。

(3) 空闲模式 IDLE

停止为CPU提供时钟,CPU不工作(其它外设均工作).

    退出方法:

任何中断请求可唤醒CPU工作,退出空闲模式。

IDLE模式:这个模式下CPU的时钟FCLK被关闭,而其他外围设备的时钟还继续工作。因此空闲模式的结果只是能够降低CPU核的电源消耗。注意,任何中断请求都能够将CPU唤醒。

(4) 掉电模式 SLEEP

时钟模块断电,除了唤醒电路之外所有部分均不供电

系统需分成两部分供电。此模式功耗最低

    退出方法:用中断唤醒必须设置外中断

1)外部中断EINT0---15

2)实时钟报警中断

Sleep模式:这个模式关闭了内部电源。因此CPU&内部的逻辑单元都没有电源消耗,除了工作在这个模式下的一个wake-up逻辑单元。因此sleep模式需要2个独立的电源。一个来支持wake-up模块工作,另外一个支持内部逻辑&CPU的电源,并且这个模块的电源是可控的。所以在Sleep模式,支持内部逻辑&CPU的电源模块是关闭的,而通过EINT[15:0]RTC中断可以从Sleep模式唤醒。

    例如我们的手机来说就是如果空闲5秒钟或是更长时间背光就没了,也是通过电源模式的变化实现的。系统的功耗从而得到很好的控制了。

1.3 专用寄存器

1.3.1  6个专用寄存器

S3C2440的时钟与电源管理共有6个专用寄存器,其基地址均为0x4C000000

寄存器

R/W

 

初值

偏址

LOCKTIME

R/W

PLL锁定时间寄存器

0x00FFFFFF

0x00

MPLLCON

R/W

MPLL配置寄存器

0x0005C080

0x04

UPLLCON

R/W

UPLL配置寄存器

0x00028080

0x08

CLKCON

R/W

时钟控制寄存器

0x0007FFF0

0x0C

CLKSLOW

R/W

慢时钟控制寄存器

0x00000004

0x10

CLKDIVN

R/W

时钟比控制寄存器

0x00000000

0x14

1-2 6个寄存器

1.3.2  PLL锁定时间寄存器(LOCKTIME

20110802123250010.jpg

1-7

LOCKTIME锁定时间,即锁相环从启动到正常工作所需的时间,一般保持默认,即0xFFF即可。

20110802123250011.jpg

1-8

1.3.3  PLL控制寄存器(M\U PLLCON

20110802123250012.jpg

1-9

锁相环输出频率设置:

MPLL =m×Fin×2/p×2S

  m=MDIV + 8, p=PDIV + 2; s=SDIV

UPLL = m×Fin/p×2S

  m=MDIV + 8, p=PDIV + 2; s=SDIV

1.3.4 时钟控制寄存器(CLKCON

用于控制各模块是否有频率输入,一般保持默认即可

20110802123250013.jpg

1-10 时钟控制寄存器

20110802123251014.png

1-11 时钟控制寄存器

Bit3: 1:进入睡眠模式

Bit21 进入特别模式(保留模式,没有使用)

1.3.5慢时钟控制寄存器(CLKSLOW

慢时钟模式,用于设置与慢时钟模式相关的配置信息。

20110802123253015.jpg

1-12慢时钟控制寄存器CLKSLOW

20110802123253016.jpg

1-13

进入慢速模式后,需要手动关闭锁相环。还需设置实际的时钟频率。

1.3.6时钟比控制寄存器(CLKDIVN

用于控制HCLKPCLKFCLK之间的分频比,共有以下几种

20110802123253017.jpg

1-14

20110802123253018.jpg

1-15

1.3.7 CAM控制寄存器

用于控制摄像头分频比

20110802123254019.jpg

1-15 CAM控制寄存器

20110802123254020.jpg

1-17

 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
10
关闭 站长推荐上一条 /3 下一条