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






