Clock&power management 模块包含了3部分:Clock控制、USB控制、POWER控制.
时钟控制逻辑单元能够产生2440需要的时钟信号,包括CPU使用的主频FCLK,AHB总线设备使用的HCLK,以及APB总线设备使用的PCLK.2440内部有2个PLL(锁相环):一个MPLL对应FCLK,HCLK,PCLK;另外一个UPLL对应的是USB使用(48MHz)。.时钟控制逻辑单元可以在不使用PLL情况下降低时钟CLOCK的频率,并且可以通过软件来驱使时钟和各个模块的连接/切断,这样做可以减少电源消耗。
[S3C2440 CPU默认的工作主频为12MHz,使用PLL电路可以产生更高的主频供CPU及外围器件使用。S3C2410有两个PLL:MPLL和UPLL,UPLL专用与USB设备。MPLL用于CPU及其他外围器件。通过MPLL会产生三个部分的时钟频率:FCLK、HCLK、PLCK。FCLK用于CPU核,HCLK用于AHB总线的设备(比如SDRAM),PCLK用于APB总线的设备(比如UART)。从时钟结构图中可以查看到使用不同时钟频率的硬件。]
对于电源控制逻辑单元,2440有许多钟电源管理方法来针对不用任务保持相应的电源消耗。电源管理模块包含了4种方式:NORMAL、SLOW,IDLE,SLEEP。
NORMAL:这个模块支持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相关公式如下:
Upll时钟发生器的内部也和Mpll类似
Phase Frequency Detector(PFD) 鉴相器
PFD的作用是检测Fref和Fvco的相位差,然后当检测到相位差时就产生一个控制信号到loop Filter和VCO中。
Charge Pump(PUMP) 电荷泵
电荷泵转变PFD的控制信号成一定比例的电压值,通过一个外部的低通滤波器
loop filter 环路滤波器
PFD输出的控制信号,进入电荷泵时,可能会有大量的纹波(*******本人认为还有谐波分量,辐射以及传导干扰等,VCO需要的是一个非常细致的电压,因此这个模块的设计应该可以看出一个公司的硬件设计功底),因此为了避免VCO过冲,需要低通滤波采样以及滤除器件的高频分量。滤波器采用典型的RC低通滤波。
Voltage Controlled Oscillator (VCO)
输出电压从环路滤波进入VCO,引起振荡频率的变化,当Fref和Fvco没有差别的时候,电压就保持稳定下来,PFD停止送出控制信号到电荷泵,此时PLL系统时钟稳定。
通用条件和时钟发生器
PLL&时钟发生器需要如下硬件满足:环路滤波电容Cmpll=1.3nF,Cupll= 700pF,外部电容C=15~22pF.
时钟控制逻辑
时钟控制逻辑决定那个时钟源的使用,mpll还是直接使用外部时钟。当PLL重新配置时钟频率值时候,时钟控制逻辑关闭Fclk直到PLL输出稳定。时钟控制逻辑单元在上电reset和power-down模式wake -up时候激活。
Power-on-Reset
图7-4(后面的图参照三星的Datesheet)表明了时钟在电源上电reset的时序图。晶振在几毫秒开始振荡,当nReset在晶振时钟稳定后释放,PLL开始参照默认的PLL配置运行。但是,PLL通常在电源启动reset后都不稳定,因此Fin直接代替MPLL作为FCLK,因为此时还没有配置PLLCON.注意,PLLCON值一定要重新写一遍。
******具体的时序见图P213的Figure 7-4,非常详细。
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等
转自:http://hi.baidu.com/whyspai/blog/item/47fba40ec82100e037d122fd.html;在转载的同时对其作了些校验修正工作!