1、第六章 时钟和功耗管理6.1 相关基础知识概述1. 分频器分频器是同步时序电路中的典型应用,其功能是按照具体的数值降低时钟源的频率以满足一定的应用。常用的分频器有2分频、4分频和8分频等偶数分频。当然改变电路形式还可以实现较复杂的奇数分频(半整数分频)或任意小数分频。图6.1图6.1为2、4、8和16分频(对应A、B、C和D)的时序波形图。2. 锁相环(PLL)与分频器相对应,锁相环(PLLphase lock loop)可以用作倍频器。即对输入的频率信号进行乘法操作,如2倍频、4倍频和8倍频等。锁相环是一个闭环的自动控制系统,它能够保证输出的信号的相位和输入信号的相位同步,此时称为锁相环为锁
2、定状态。一旦这两个信号相位不同步了,那么在锁相环能调整的范围内,它会自动调整重新让输出信号的相位与输入信号同步。 图6.2为锁相环的基本功能框图。图中相位检测器英文为phase detector,环路滤波器英文为loop filter,压控振荡器英文为voltage controlled oscillator。感兴趣的读者可以参阅清华大学出版社出版的锁相环设计、仿真与应用(影印版)来具体了解PLL。6.2 S3C2410A的时钟和功耗管理概述S3C2410A的时钟和功耗管理模块由三部分组成。其分别为时钟控制、USB控制和功耗控制。S3C2410A的时钟控制逻辑可产生芯片工作所必须的时钟信号,其
3、中包括了CPU核所用的FCLK信号、ABH总线所用的HCLK信号和APB总线所用的PCLK信号。S3C2410A内部有两个PLL(锁相环),其中一个PLL用于产生FCLK、HCLK和PCLK;另一个PLL用于产生USB工作所用48MHz时钟信号。时钟控制逻辑可以让PLL停止而使时钟频率降低,也可以将时钟与外设模块断开连接,这样一来可以控制芯片的功耗。对于功耗控制逻辑,S3C2410A有不同的功耗管理方案,以便对一个既定任务有一个最优的功耗设定。S3C2410A中的功耗管理模式共有四种:NORMAL模式、SLOW模式、IDLE模式和Power_OFF模式。NORMAL模式:CPU和所有的外设均有
4、时钟驱动。这种模式中所有的外设都处于打开状态,S3C2410A功耗最大。这里可以利用软件来控制外设的操作。例如,如果一个定时器不需要工作,那么可以将定时器的时钟驱动断开,这样就可以降低芯片的功耗。SLOW模式:这种模式下芯片不让PLL工作。与NORMAL模式不同,SLOW模式采用一个外部时钟(XTIpll或EXTCLK)来作为S3C2410A的FCLK而不采用内部PLL的输出信号。这种模式下,芯片的功耗完全由外部时钟的频率所决定(频率越高功耗越大)。此时的总体功耗不计PLL的功耗。IDLE模式:这种模式下,FCLK与CPU断开连接,而其他的外设都有时钟驱动。IDLE模式由于CPU核没有供给时钟
5、,所以整体功耗降低。用中断请求就可以唤醒CPU回复到正常状态。Power_OFF模式:内部电源模块与其他模块断开连接。这种模式下,除了唤醒逻辑电路工作之外,其他模块全部没有功率消耗。激活Power_OFF需要两个独立的电源,其中一个电源供给唤醒逻辑,另一个电源供给CPU及其他设备,并且这个电源要可控制。在Power_OFF模式下,给CPU和其他设备供电的那个电源会被关闭。靠外部中断EINT15:0或RTC告警中断可以退出Power_OFF模式。在本课程范围内,S3C2410A都工作在NORMAL模式,故其他几种工作模式在这里就不再详细描述了,感兴趣的读者可以参阅S3C2410A的数据手册。6.
6、3 S3C2410A的时钟1. 时钟源构架主时钟源来自外部的晶体(XTIpll)或一个外部时钟源(EXTCLK)。时钟发生器包括了一个振荡器,这个振荡器连接着一个外部晶体。时钟发生器还有两个PLL用来产生S3C2410A工作所用的高频信号。图6.3 时钟源构架2. 时钟源的选择用模式控制引脚来选择时钟源。此处的模式控制引脚为OM3:2。OM3和OM2的值在nRESET的上升沿被内部锁存器锁存。下表描述了芯片启动时的时钟源选择方案。表6.1OM3:2MPLL状态UPLL状态主时钟源USB时钟源00打开打开晶体晶体01打开打开晶体EXTCLK10打开打开EXTCLK晶体11打开打开EXTCLKEX
7、TCLK达盛公司的实验系统上采用的是OM3:2=00b的情况,即时钟源全部来自外部的晶体时钟源(12MHz)。如图6.4所示。图6.4注意: 尽管在复位后MPLL就已经启动了,但是必须在软件中向MPLLCON寄存器中写入可用的设置后,MPLL的输出才可用到系统时钟上。在此写可用设置之前,来自外部晶体的时钟或EXTXLK将直接作用于系统时钟。即使用户不想改变MPLLCON的初始默认的设置,也要向MPLLCON中写入与默认设置相同的值后才可使用MPLL的输出。 当OM1:0=11b时,OM3:2用在Test模式中。3. PLL在时钟发生器中,MPLL是一个用参考输入信号来同步输出信号频率和相位功能
8、的电路。图6.5为S3C2410A中的PLL模块框图。图6.5 S3C2410A中的PLL模块VCO(压控振荡器)根据一个直流输入电压来成比例地输出频率信号。分频器P将输入的信号Fin进行p分频(频率降低p倍)。分频器M对VCO的输出信号进行m分频,然后将此信号输入给PFD(相频检测器)。分频器S对VCO的输出信号进行s分频,所得信号即为Mpll(MPLL模块的输出信号)。除了这几个分频器、VCO和PFD,PLL内还有电泵和环路滤波器功能电路。Mpll输出只与Fin相关,具体关系为:其中m=M+8,p=P+2。M为分频器M的分频值,P为分频器P的分频值。UPLL模块与MPLL模块完全相同,这里
9、就不赘述了。下面来叙述一下PLL各个模块的具体功能。(1) PFDPFD监视Fref和Fvco之间的相位差,并当检测出Fref和Fvco之间存在相位差时产生一个控制信号。Fref为参考输入频率。(2) PUMP这个模块将PFD的输出信号转换成一个电压信号并通过外部滤波器驱动VCO。(3)Loop Filter由PFD经PUMP产生的控制信号在每次Fvco和Fref相比较时都会产生大量的抖动,为了不干扰VCO正常工作,这里需要一个对高频抑制较好的低通滤波器来消除这些抖动。这个滤波器一般是一个单极点的RC滤波器。(4)VCO从loop filter输出的直流电压用来驱动VCO模块,从而让振荡器的频
10、率在这个电压的控制下线性地增大和减小。当Fvco与Fref相匹配时(不存在相位差或同步),PFD就停止给PUMP发送控制信号,则对于loop filter来讲就有一个稳定的输出电压供给VCO,而VCO的输出信号也就不会改变了。通用的PLL和时钟发生器的工作条件为:环路滤波电容为5pF;外部晶体频率为10MHz20MHz;外部晶体振荡电路电容为1522pF。注意:FCLK频率必须比晶体频率或外部时钟源频率达3倍以上。4. 时钟控制逻辑时钟控制逻辑确定了如何选用时钟源,例如是采用Mpll还是直接采用外部时钟源(XTIpll或EXTCLK)。当用一个新的值来配置PLL时,时钟控制逻辑会在PLL输出经
11、PLL lock time(锁定时间)稳定前禁止FCLK信号。这个控制逻辑也可激活上电复位和掉电模式唤醒。图6.6说明了采用外部晶体作为时钟源时上电复位过程中时钟信号的时序。图6.6晶体振荡器在几个ms(毫秒)内开始起振。在OSC(XTIpll)时钟稳定之后,nRESET信号被释放(复位结束),PLL开始按照默认配置工作。然而,PLL在上电复位后不会立刻稳定,所以在软件重新配置PLLCON之前,FCLK就是Fin上的时钟信号而不是Mpll。用软件配置PLLCON是必须要进行的工作。在软件配置之后,PLL开始按照新的频率设置来锁定输出信号。在锁定后,FCLK就可以变为Mpll信号了。5. 在NO
12、RMAL模式下改变PLL配置在NORMAL模式下操作S3C2410A,用户可以靠写PMS来改变PLL输出频率,改写PMS之后,PLL lock time会自动加入到时钟时序过程中去。在PLL lock time中,输出时钟不会作用到S3C2410A的内部模块上。图6.7说明了上述过程。图6.76. USB时钟控制USB Host(USB主机)接口和USB Device(USB设备)接口需要48Mhz时钟。在S3C2410A中,USB要靠PLL产生的48MHz信号来工作。配置PLL(UPLL)之后,UCLK可以应用到USB接口上。表6.2条件UCLK状态UPLL状态复位后XTIpll或EXTCL
13、K(外部时钟源)开配置PLL之后锁定前为低电平,锁定后为48MHz开用CLKSLOW关闭了UPLLXTIpll或EXTCLK(外部时钟源)关用CLKSLOW打开了UPLL48MHz开7. FCLK、HCLK和PCLKFCLK用于内核ARM920T。HCLK用于AHB总线,总线上挂有ARM920T、存储器控制器、中断控制器、LCD控制器、DMA和USB Host控制器。PCLK用于APB总线,总线上挂有外设WDT、IIS、I2C、PWM定时器、MMC接口、ADC、UART、GPIO、RTC和SPI。S3C2410A支持几种FCLK、HCLK和PCLK之间的分频比例,这个比例由HDIVN和PDIV
14、N确定,它们都在CLKDIVN寄存器中。分频比例如下表所示:表6.3HDIVN1HDIVNPDIVNFCLKHCLKPCLK比例关系000FCLKFCLKFCLK1:1:1001FCLKFCLKFCLK/21:1:2010FCLKFCLK/2FCLK/21:2:2011FCLKFCLK/2FCLK/41:2:4100FCLKFCLK/4FCLK/41:4:4这里推荐使用1:2:4的比例设置。开机默认比例为1:1:1。在配置PMS值之后,需要对CLKDIVN进行配置。在PLL lock time之后,CLKDIVN的设置才能生效。这个值在复位后或模式改变后仍然是可用的。6.4 相关寄存器描述1.
15、 LOCK TIME COUNT REGISTER (LOCKTIME)此寄存器为锁定实践计数寄存器。建议用户不要改动这个寄存器的值,直接采用该寄存器的初始值即可。2. MPLLCON和UPLLCONMPLLCON和UPLLCON中包含MDIV(主分频器控制)、PDIV(预分频器控制)和SDIV(后分频器控制)几部分。如果在程序中连续对MPLL和UPLL进行配置,那么建议先对UPLL进行配置,然后再对MPLL进行配置,中间要有大约7个NOP的延迟。PLL配置值对照表。按照表6.4就可以配置出不同的时钟来。表6.43. CLOCK CONTROL REGISTER (CLKCON)该寄存器为时钟
16、控制寄存器。这个寄存器的功能就是使能或禁止相关设备的时钟。4. CLOCK SLOW CONTROL (CLKSLOW) REGISTER该寄存器为慢速时钟控制寄存器。5. CLOCK DIVIDER CONTROL (CLKDIVN) REGISTER该寄存器为时钟分频控制寄存器。6.5 程序分析在TARGET.c程序中有:void Target_Init(void)MMU_Init();ChangeClockDivider(1,1); / 1:2:4 ChangeMPllValue(0xa1,0x3,0x1); / FCLK=202.8MHz Isr_Init(); Port_Init()
17、; Timer1_init(); Timer1INT_Init(); Uart_Init(0,115200); Uart_Select(0); 其中ChangeClockDivider和ChangeMPllValue两个函数负责对S3C2410A的工作时钟进行配置。这两个函数在文件2410LIB.c中有定义。void ChangeClockDivider(int hdivn,int pdivn) / hdivn,pdivn FCLK:HCLK:PCLK / 0,0 1:1:1 / 0,1 1:1:2 / 1,0 1:2:2 / 1,1 1:2:4 rCLKDIVN = (hdivn1) | p
18、divn; if(hdivn) MMU_SetAsyncBusMode(); else MMU_SetFastBusMode();这个函数负责配置FCLK、HCLK和PCLk三个时钟之间的分频比。rCLKDIVN = (hdivn1) | pdivn;是设置寄存器CLKDIVN,在Target_Init(void)中,ChangeClockDivider函数调用值为(1,1),即hdivn=1和pdivn=1,也就是说CLKDIVN1=1b,CLKDIVN0=1b,即FCLK、HCLK和PCLk三个时钟之间的分频比为1:2:4。void ChangeMPllValue(int mdiv,int pdiv,int sdiv) rMPLLCON = (mdiv12) | (pdiv4) | sdiv;这个函数负责对MPLLCON进行配置。前面已经讲到,配置MPLLCON是必须要进行的工作。这个函数在调用时,调用值为0xa1,0x3和0x1,即表6.3.4中的倒数第四行设置,FCLK=202.8MHz。rMPLLCON = (mdiv12) | (pdiv4) | sdiv;解释为MPLLCON19:12= 0xa1,MPLLCON9:4= 0x3,MPLLCON1:0= 0x1。