跳至主要内容

【转】2440时钟与电源管理

以下方便查阅,具体图表见S3C2440手册,各个技术网站都有下载.

概要

Clock&power management 模块包含了3部分:Clock控制、USB控制、POWER控制.

时钟控制逻辑单元能够产生2440需要的时钟信号,包括CPU使用的主频FCLK,AHB总线设备使用的HCLK,以及APB总线设备使用的PCLK.2440内部有2个PLL(锁相环):一个对应FCLK,HCLK,PCLK,另外一个对应的是USB使用(48MHz)。.时钟控制逻辑单元可以在不使用PLL情况下降低时钟CLOCK的频率,并且可以通过软件来驱使时钟和各个模块的连接/切断,这样做可以减少电源消耗。

对于电源控制逻辑单元,2440有许多钟电源管理方法来针对不用任务保持相应的电源消耗。电源管理模块包含了4种方式:NORMAL、SLOW,IDLE,SLEEP。

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

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

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

Sleep模式:这个模式关闭了内部电源。因此CPU&内部的逻辑单元都没有电源消耗,除了工作在这个模式下的一个wake-up

逻辑单元。因此sleep模式需要2个独立的电源。一个来支持wake-up模块工作,另外一个支持内部逻辑&CPU的电源,并且这个

模块的电源是可控的。所以在Sleep模式,支持内部逻辑&CPU的电源模块是关闭的,而通过EINT[15:0]&RTC中断可以从Sleep模

式唤醒。

功能描述

时钟结构

图7-1表明了时钟模块结构,主时钟频率直接来自外部时钟(XTIPLL)或者是内部的时钟(EXTCLK).时钟的产生包含了一个晶

振运放,将外部的晶振信号放大,还有2个PLL,产生2440各种高频时钟所需。

时钟源的选择

表7-1表明了时钟选择脚位关系(OM2&OM3)以及2440的时钟源,当nRESET的信号从低到高上升沿的时候,2440读取OM2,OM3

的脚位信息OM[3:2]状态来选择Main时钟源以及USB时钟源。

注意

1、虽然MPLL在reset以后就起来了,但是MPLL输出(Mpll)还不能够作为系统时钟来使用,必需要使用软件写入相应的

MPLLCON寄存器命令后才能使用。因此通过合法的指令设置后,时钟将能够直接当能系统时钟来使用。需要注意到,就算是用

户不想改变MPLLCON的值,但是还是需要再重新写入一遍一样的值。

2、OM[1:0]=11的时候,OM[3:2]为test模式。****其实OM[3:2]应该是相当于一个开关逻辑,通过外部硬件脚位设置 , 和

CPLD的内部原理相同,与门,非门,与非门等构成.

Phase Locked Loop(PLL)

MPLL时钟发生器,作为一个集成电路,作用是同步输出信号以及输入信号的频率和相位。这种应用,包含了图7-2的基本

模块:VCO(电压振荡器),利用输入的DC电压来产生一个稳定的输出频率(****又叫压控振荡器,利用电压使石英振荡),分频

器P通过P值来对输入Fin频率来进行分频,分频器M通过鉴相器PFD得到M值来设置VCO的频率输出,分频器S通过Mpll模块的相位

检测,电荷泵,环路滤波,输出频率值s来设置VCO的频率。输出时钟频率Mpll相关公式如下:

Mpll=( 2 * m * Fin ) / ( p * 2 s ) *****见手册P211

m=M(分频器M的值)+8, p=P(分频器P的值)+2

Upll时钟发生器的内部也和Mpll类似

Phase Frequency Detector(PFD) 鉴相器

PFD的作用是检测Fref和Fvco的相位差,然后当检测到相位差时就产生一个控制信号到VCO和loop Filter中。

Charge Pump(PUMP) 电荷泵

电荷泵转变PFD的控制信号成一定比例的电压值,通过一个外部的低通滤波器

loop filter 环路滤波器

PFD输出的控制信号,进入电荷泵时,可能会有大量的纹波(*******本人认为还有谐波分量,辐射以及传导干扰等,VCO需

要的是一个非常细致的电压,因此这个模块的设计应该可以看出一个公司的硬件设计功底),因此为了避免VCO过冲,需要低通

滤波采样以及滤除器件的高频分量。滤波器采用典型的RC低通滤波。

Voltage Controlled Oscillator (VCO)

输出电压从环路滤波进入VCO,引起振荡频率的变化,当Fref和Fvco没有差别的时候,电压就保持稳定下来,PFD停止送出

控制信号到电荷泵,此时PLL系统时钟稳定。

通用条件和时钟发生器

PLL&时钟发生器需要如下硬件满足:环路滤波电容 mpll 1.3nF,upll 700pF,外部电容 15-22pF.

时钟控制逻辑

时钟控制逻辑决定那个时钟源的使用,mpll还是直接使用外部时钟。当PLL重新配置时钟频率值时候,时钟控制逻辑关闭

Fclk直到PLL输出稳定。时钟控制逻辑单元在上电reset和power-down模式wake -up时候激活。

Power-on-Reset

图7-4表明了时钟在电源上电reset的时序图。晶振在几毫秒开始振荡,当nReset在晶振时钟稳定后释放,PLL开始参照默

认的PLL配置运行。但是,PLL通常在电源启动reset后都不稳定,因此Fin直接代替MPLL作为FCLK,因为此时还没有配置PLLCON.

注意,PLLCON值一定要重新写一遍。

******具体的时序见图P213,非常详细

PLL重新启动后,一定要用软件重新写一遍PLLCON的值,可以获得稳定的系统CLOCK。

Change PLL Settings In Normal Operation Mode

在Normal模式下,用户可以改变频率通过写P M S三个分频器的值,在PLL锁存时间,时钟是被切断的。见图7-5在MPLL改

变频率的时间,FCLK是没有时钟输出的。

USB时钟控制

USB主接口和USB从接口都需要48Mhz的时钟。在S3C2440A内,USB知明需要PLL(upll)产生48Mhz的时钟给USB

******USB的时钟可以使用CLKSLOW寄存器来对USB的时钟进行开关.

FCLK HCLK 和PCLK

FCLK用于ARM920T

HCLK用于AHB总线(高速)上,例如通过ARM920T,内存控制,中断控制,LCD控制,DMA以及USB主时钟块。

PCLK用于APB总线(低速)上,如看门狗,IIS,I2C,PWM,MMC接口,ADC,UART,GPIO,RTC以及SPI.

2440支持FCLK,HCLK,PCLK分频比转换。转换的比例值由CLKDIVN控制寄存器中的HDIVN,PDIVN确定。

*******见P215的表

在经过P M S 3个值设置获得MPLL后,需要Set CLKDIVN寄存器的值, 因此设置CLKDIVN再经过PLL锁存期后的时钟值就是

稳定的值。这个值复位和电源管理模式中都可以用。

*****CLKDIVN的默认设置为1:1:1,在写入CLKDIVN后,改变FCLK:HCLK:PCLK的比例,见P215图7-6所示。

注意

1、CLKDIVN的值需要小心设置,不能超过HCLK,PCLK的极限值。

2、如果HDIVN不为0,根据如下指令,CPU总线模式从Fast Bus Mode 变为Asynchronous(异步总线模式),2440没有同步总

线模式)

MMU_setAsyncBusMode

mrc p15,0,r0,c0,0 ******协处理器

orr r0,r0,#R1_nF:OR:R1_iA

mcr P15,0,r0,c1,c0,0

如果HDIVN不为0,且CPU总线模式为Fast Bus mode,CPU的时钟为HCLK.,这种方式可以用在将CPU频率降低,但是却又不改

变HCLK和PCLK.

电源管理

2440的电源管理模块通过软件控制系统时钟来降低各个模块的电源消耗。原理通PLL,时钟控制逻辑(FCLK,HCLK,PCLK),以

及唤醒信号。如7-7显示了系统时钟的结构图。

2440有4种电源模式,下面描述每个电源管理模式,各个模式并不能自由转换,有条件。查看P218表7-8

*********P218的表7-2指出了各个模式的电源的消耗情况。

NORMAL Mode

在Normal Mode,所有的设备以及基本模块,包括电源管理模块,CPU核心模块,总线控制模块,内存控制模块,中断控制

模块,DMA,以及外总。但是除了基本模块,每个设备模块都能通过软件来设置关闭来降低电源消耗。

IDLE Mode

这个模式主要是将CPU核模块关闭了,其他基本模块都是工作的,利用EINT[23:0]或者RTC时钟中断,或者其他的中断可以

结束IDLE模式(注意 只有当GPIO模块工作时,EINT才有效)

SLOW 模式(非-PLL模式)

在这个模式下电源消耗可以降低,主要是因为系统时钟降低了并且关闭了PLL模块。FCLK不使用PLL,直接来自输入时钟(包

含了外部时钟XTIpll和内部时钟EXTCLK),此模式下的分频滤由CLKSLOW控制寄存器&CLKDIVN控制寄存器的设置决定。

*******见P219的表,CLKSLOW和CLKDIVN寄存器的设置对SLOW模式时钟的影响

在SLOW模式,PLL将被关闭降低PLL的电源消耗。如果要从SLOW模式变成NORMAL模式,PLL需要时间稳定。稳定时间大概在

300us左右。

用户可以使用CLKSLOW寄存器中的SLOW模式bit位来改变频率。见P220的图7-9

CLKSLOW寄存器中的SLOW_BIT位可以将SLOW模式切换至NORMAL模式中,系统时钟稳定时间如图7-10

CLKSLOW寄存器中的SLOW_BIT和MPLL_OFF比特位动作,系统时钟稳定时间如如7-13

SLEEP模式

此模式下内部电源关闭,因此,CPU和内部逻辑模块都没有电源消耗,除了唤醒模块。激活SLEEP模式需要2个独立的电

源,一个支持唤醒模块,一个带电源开关的支持其他模块,包括CPU.在睡眠模式下,只有唤醒模块是工作的,而唤醒睡眠模式

需要依靠EINT[15:0]和定时器中RTC(real time control)中断。

依据以下步骤进入到睡眠模式:(****附三星测试代码中的微量代码说明)

1、设置GPIO,满足SLEEP模式的配置。 ******ConfigSleepGPIO();

2、Mask所有中断.进入INTMSK寄存器设置 ******rINTMSK=BIT_ALLMSK;所有中断屏蔽;

3、设置中断唤醒源包括RTC(EINTMASK寄存器的相应BIt位设置唤醒源,不能mask,因为需要让SRCPN--中断请求和

EINTPEND--中断状态位 的相应位使能。)

************rEINTMASK = rEINTMASK&~(1<<11); //SRCPND:EINT8_23 will be set by EINT11 after wake-up.

4、设置USB悬置

rMISCCR|=(1<<12); //USB port0 = suspend

rMISCCR|=(1<<13); //USB port1 = suspend

5、GSTATUS[4:3]两个信息寄存器

rGSTATUS3=(U32)StartPointAfterSleepWakeUp;//复位后起始点的地址

6、设置微控制单元寄存器MISCCR[1:0]关闭总线,减少电源消耗,另外内存相关的脚位,如D[31:0]等需要置为高阻或者

非活动状态。

********rMISCCR=rMISCCR|(3<<0);

********rMSLCON = (1<<11)|(0<<10)|(0<<9)|(1<<8)|(1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0);查

看P284寄存器可以看此设置

7、清除LCDCON1.ENVID位来停止LCD。

***************rLCDCON1 =rLCDCON1 & 0x3fffe;

8、读取rREFRESH和rCLKCON寄存器???fill the TLB

9、使能SDRAM进入自刷新模式,相应的寄存器位REFRESH[22]=1b.

10、等待自刷新开始。

11、设置:MISCCR[19:17]=111b使得SDRAM的信号(SCLK0,SCLK1,SCLKE)在睡眠模式期间做保护。

12、进入睡眠模式,可以设置CLKCON的SLEEP的Bit【3】位。

注意:当系统运行在NAND的boot模式启动时,硬件脚设置 EINT[23:21]必须设置为输入脚,作为唤醒Sleep启动时有用。

根据下面过程唤醒SLEEP模式

1、如果有唤醒动作时,内部的复位信号就会动作。这和外部的nReset信号非常相似。reset复位期间由内部的16位计数器

逻辑实现,reset复位决断时间可以计算tRST=(65535/XTAL_frequency)

2、核对GSTATUS2[2]来判断是否将由sleep模式唤醒后的电源开启。

3、释放SDRAM的信号保护,通过设置MISCCR[19:17]=000b

4、设置SDRAM内存相关控制

5、等待SDRAM自刷新释放

6、因为使用SLEEP模式下,GSTATUS[3:4]两个寄存器可以保存之前的信息,由用户自由使用

7、EINT[3:0],查看SRCPND寄存器

而EINT[15:4],查看EINTPEND寄存器来确定。

**********仔细看看P223表,关于GPIO的设置

关于VDDi&VDDiarm的电源控制

在睡眠模式下,VDDi,VDDiarm,VDDMPLL以及VDDUPLL会被关闭,使用PWREN脚来控制

*********在硬件设计中,PWREN用来开关CPU以及内部基本逻辑电路的电源开关,如果是设置为高PWREN=1的时候,那么

VDDi以及VDDiarm允许电源输入,当PWREN=0时,关闭,可以采用外部硬件强行设置为一直开状态

注意

即使VDDi,VDDiarm,VDDMPLL以及VDDUPLL可能被关闭,部分其他电源脚也可供电。

电源的电压如P224页图所示

硬件设计中,在睡眠模式,如果你不使用触摸屏,4个触摸接口必须悬空,不能接地,在睡眠模式下,XP,YP都是高状态。

唤醒中断信号EINT[15:0]

满足下面条件,就可以将Sleep模式唤醒

a、中断脚的电压跳变。

b、设置GPIO相应的带中断功能的脚位为中断功能。

c、nBATT_FLT脚必须为高电平,这个在设置GPIO控制寄存器设置外部中断时候是非常重要的。

********此脚一般硬件设计时候,外部接一个10K以上的电阻接VDD3.3

当唤醒后,这些中断就不用来唤醒功能了,也就是说可以当作外部中断请求来响应。

Entering IDLE Mode

如果CLKCON[2]设置为1进入空闲模式,经过一段时间延时2440就进入空闲模式

PLL On/OFF

PLL可以在SLOW模式下被关闭,来降低电源功耗,PLL不能在其他模式下关闭,否则MCU不能保证会不出错

PULL-up Resistors on the Data Bus and SLEEP Mode

在睡眠模式,数据总线(D[31:0 ]or D[15:0])可以选择高阻或者输出低状态

数据总线可以打开pull-up寄存器来设置为高阻状态,主要降低电源消耗,可以由MISCCR控制......这部分上面已经有详

细说明,偷懒一下了:)

Output Port State and SLEEp mode

输出口的电流消耗,总的来说输出口置高的时候电流消耗是最小的,但是如果输出要低,那么需要通过设置DSC0,DSC1来

设置驱动电流,举例如下:

*******rDSC0 = 0x7fffffff;

******rDSC0 &= ~(1<<31); //enable 调节内部的电阻阻值

******rDSC1 = (3<<28)|(3<<26)|(3<24)|(3<<22)|(3<<20)|(3<<18);

Battery Fault Signal(nBATT_FLT)

nBATT_FLT脚有2个功能,如下

1、当CPU不是在SLEEP模式时候(大多数工作时候),此脚将引起中断请求,通过设置BATT_FUNC(MISCCR[22:20])=10xb;中

断为高电平触发。

2、当CPU为SLEEP模式时,设置此脚可以禁止唤醒服务,通过设置BATT_FUNC(MISCCR[22:20])=11xb,因此,任何唤醒中断

都被mask,保护系统工作在低电池能力下。

ADC Power Down

ADCCON设置 P417

时钟发生器&电源管理特殊寄存器

LOCK TIME COUNT REGISTER(LOCKTIME) pll lock time count register

分为UPLL的锁存时间和MPLL的锁存时间,两个PLL功能所在

MPLL control Register

Mpll= ( 2* m * Fin)/ (p * 2 s)

m=(MDIV + 8), p = (PDIV +2 ), s =SDIV

UPLL control Register

Upll =( m* Fin) /( p * 2 s)

m=(MDIV + 8), p = (PDIV +2 ), s =SDIV

具体的频率选择计算 见 P228的表格

后面是相关的寄存器的具体设置,从P 228- P 231 CLKCON,CLKSLOW,CLKDIVN,CAMDIVN等

评论

此博客中的热门博文

【转】AMBA、AHB、APB总线简介

AMBA 简介 随着深亚微米工艺技术日益成熟,集成电路芯片的规模越来越大。数字IC从基于时序驱动的设计方法,发展到基于IP复用的设计方法,并在SOC设计中得到了广泛应用。在基于IP复用的SoC设计中,片上总线设计是最关键的问题。为此,业界出现了很多片上总线标准。其中,由ARM公司推出的AMBA片上总线受到了广大IP开发商和SoC系统集成者的青睐,已成为一种流行的工业标准片上结构。AMBA规范主要包括了AHB(Advanced High performance Bus)系统总线和APB(Advanced Peripheral Bus)外围总线。   AMBA 片上总线        AMBA 2.0 规范包括四个部分:AHB、ASB、APB和Test Methodology。AHB的相互连接采用了传统的带有主模块和从模块的共享总线,接口与互连功能分离,这对芯片上模块之间的互连具有重要意义。AMBA已不仅是一种总线,更是一种带有接口模块的互连体系。下面将简要介绍比较重要的AHB和APB总线。 基于 AMBA 的片上系统        一个典型的基于AMBA总线的系统框图如图3所示。        大多数挂在总线上的模块(包括处理器)只是单一属性的功能模块:主模块或者从模块。主模块是向从模块发出读写操作的模块,如CPU,DSP等;从模块是接受命令并做出反应的模块,如片上的RAM,AHB/APB 桥等。另外,还有一些模块同时具有两种属性,例如直接存储器存取(DMA)在被编程时是从模块,但在系统读传输数据时必须是主模块。如果总线上存在多个主模块,就需要仲裁器来决定如何控制各种主模块对总线的访问。虽然仲裁规范是AMBA总线规范中的一部分,但具体使用的算法由RTL设计工程师决定,其中两个最常用的算法是固定优先级算法和循环制算法。AHB总线上最多可以有16个主模块和任意多个从模块,如果主模块数目大于16,则需再加一层结构(具体参阅ARM公司推出的Multi-layer AHB规范)。APB 桥既是APB总线上唯一的主模块,也是AHB系统总线上的从模块。其主要功能是锁存来自AHB系统总线的地址、数据和控制信号,并提供二级译码以产生APB外围设备的选择信号,从而实现AHB协议到APB协议的转换。 ====================================

【转】GPIO编程模拟I2C入门

ARM编程:ARM普通GPIO口线模拟I2C  请教个问题: 因为需要很多EEPROM进行点对点控制,所以我现在要用ARM的GPIO模拟I2C,管脚方向我设 置的是向外的。我用网上的RW24C08的万能程序修改了一下,先进行两根线的模拟,SDA6, SCL6,但是读出来的数不对。我做了一个简单的实验,模拟SDA6,SCL6输出方波,在示波 器上看到正确方波,也就是说,我的输出控制是没问题的。 哪位大哥能指点一下,是否在接收时管脚方向要设为向内?(不过IOPIN不管什么方向都可 以读出当前状态值的阿) 附修改的RW24C08()程序: #define  SomeNOP() delay(300); /**/ /* *********************************  RW24C08   **************************************** */ /**/ /* ----------------------------------------------------------------------------- ---  调用方式:void I2CInit(void)   函数说明:私有函数,I2C专用 ------------------------------------------------------------------------------- -- */ void  I2CInit( void ) ... {  IO0CLR  =  SCL6;      // 初始状态关闭总线  SomeNOP();  // 延时   I2CStop();  // 确保初始化,此时数据线是高电平 }   /**/ /* ---------------------------------------------------------------------------- ----  调用方式:void I2CStart(void)   函数说明:私有函数,I2C专用 ------------------------------------------------------------------------------- -- */ void  I2CStart( void )

【转】cs8900网卡的移植至基于linux2.6内核的s3c2410平台

cs8900网卡的移植至基于linux2.6内核的s3c2410平台(转) 2008-03-11 20:58 硬件环境:SBC-2410X开发板(CPU:S3C2410X) 内核版本:2.6.11.1 运行环境:Debian2.6.8 交叉编译环境:gcc-3.3.4-glibc-2.3.3 第一部分 网卡CS8900A驱动程序的移植 一、从网上将Linux内核源代码下载到本机上,并将其解压: #tar jxf linux-2.6.11.1.tar.bz2 二、打开内核顶层目录中的Makefile文件,这个文件中需要修改的内容包括以下两个方面。 (1)指定目标平台。 移植前:         ARCH?= $(SUBARCH) 移植后: ARCH            :=arm (2)指定交叉编译器。 移植前: CROSS_COMPILE ?= 移植后: CROSS_COMPILE   :=/opt/crosstool/arm-s3c2410-linux-gnu/gcc-3.3.4-glibc-2.3.3/bin/arm-s3c2410-linux-gnu- 注:这里假设编译器就放在本机的那个目录下。 三、添加驱动程序源代码,这涉及到以下几个方面。(1)、从网上下载了cs8900.c和cs8900.h两个针对2.6.7的内核的驱动程序源代码,将其放在drivers/net/arm/目录下面。 #cp cs8900.c ./drivers/net/arm/ #cp cs8900.h ./drivers/net/arm/ 并在cs8900_probe()函数中,memset (&priv,0,sizeof (cs8900_t));函数之后添加如下两条语句: __raw_writel(0x2211d110,S3C2410_BWSCON); __raw_writel(0x1f7c,S3C2410_BANKCON3); 注:其原因在"第二部分"解释。 (2)、修改drivers/net/arm/目录下的Kconfig文件,在最后添加如下内容: Config ARM_CS8900    tristate "CS8900 support" depends on NET_ETHERNET && A