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 的
3、时钟和功耗管理概述 S3C2410A 的时钟和功耗管理模块由三部分组成。其分别为时钟控制、USB 控制和功耗 控制。 S3C2410A 的时钟控制逻辑可产生芯片工作所必须的时钟信号,其中包括了 CPU 核所用 的 FCLK 信号、ABH 总线所用的 HCLK 信号和 APB 总线所用的 PCLK 信号。S3C2410A 内部有 两个 PLL(锁相环) ,其中一个 PLL 用于产生 FCLK、HCLK 和 PCLK;另一个 PLL 用于产生 USB 工作所用 48MHz 时钟信号。时钟控制逻辑可以让 PLL 停止而使时钟频率降低,也可以将时 钟与外设模块断开连接,这样一来可以控制芯片的功耗。 对
4、于功耗控制逻辑,S3C2410A 有不同的功耗管理方案,以便对一个既定任务有一个最 优的功耗设定。S3C2410A 中的功耗管理模式共有四种:NORMAL 模式、SLOW 模式、IDLE 模式和 Power_OFF 模式。 NORMAL 模式: CPU 和所有的外设均有时钟驱动。这种模式中所有的外设都处于打开状态,S3C2410A 功耗最大。这里可以利用软件来控制外设的操作。例如,如果一个定时器不需要工作,那 么可以将定时器的时钟驱动断开,这样就可以降低芯片的功耗。 SLOW 模式: 这种模式下芯片不让 PLL 工作。与 NORMAL 模式不同,SLOW 模式采用一个外部时钟 (XTIpll
5、或 EXTCLK)来作为 S3C2410A 的 FCLK 而不采用内部 PLL 的输出信号。这种模式下, 芯片的功耗完全由外部时钟的频率所决定(频率越高功耗越大) 。此时的总体功耗不计 PLL 的功耗。 IDLE 模式: 这种模式下,FCLK 与 CPU 断开连接,而其他的外设都有时钟驱动。IDLE 模式由于 CPU 核没有供给时钟,所以整体功耗降低。用中断请求就可以唤醒 CPU 回复到正常状态。 Power_OFF 模式: 内部电源模块与其他模块断开连接。这种模式下,除了唤醒逻辑电路工作之外,其他 模块全部没有功率消耗。激活 Power_OFF 需要两个独立的电源,其中一个电源供给唤醒逻 辑
6、,另一个电源供给 CPU 及其他设备,并且这个电源要可控制。在 Power_OFF 模式下,给 CPU 和其他设备供电的那个电源会被关闭。靠外部中断 EINT15:0或 RTC 告警中断可以退出 Power_OFF 模式。 在本课程范围内,S3C2410A 都工作在 NORMAL 模式,故其他几种工作模式在这里就 不再详细描述了,感兴趣的读者可以参阅 S3C2410A 的数据手册。 6.3 S3C2410A 的时钟 1. 时钟源构架 主时钟源来自外部的晶体(XTIpll)或一个外部时钟源(EXTCLK) 。时钟发生器包括了 一个振荡器,这个振荡器连接着一个外部晶体。时钟发生器还有两个 PLL
7、用来产生 S3C2410A 工作所用的高频信号。 图 6.3 时钟源构架 2. 时钟源的选择 用模式控制引脚来选择时钟源。此处的模式控制引脚为 OM3:2。 OM3 和 OM2 的值在 nRESET 的上升沿被内部锁存器锁存。 下表描述了芯片启动时的时钟源选择方案。 表 6.1 OM3:2 MPLL 状态 UPLL 状态 主时钟源 USB 时钟源 00 打开 打开 晶体 晶体 01 打开 打开 晶体 EXTCLK 10 打开 打开 EXTCLK 晶体 11 打开 打开 EXTCLK EXTCLK 达盛公司的实验系统上采用的是 OM3:2=00b 的情况,即时钟源全部来自外部的晶体 时钟源(12
8、MHz ) 。如图 6.4 所示。 图 6.4 注意: 尽管在复位后 MPLL 就已经启动了,但是必须在软件中向 MPLLCON 寄存器中写入可 用的设置后,MPLL 的输出才可用到系统时钟上。在此写可用设置之前,来自外部晶体的时 钟或 EXTXLK 将直接作用于系统时钟。即使用户不想改变 MPLLCON 的初始默认的设置,也 要向 MPLLCON 中写入与默认设置相同的值后才可使用 MPLL 的输出。 当 OM1:0=11b 时,OM3:2用在 Test 模式中。 3. PLL 在时钟发生器中,MPLL 是一个用参考输入信号来同步输出信号频率和相位功能的电路。 图 6.5 为 S3C2410
9、A 中的 PLL 模块框图。 图 6.5 S3C2410A 中的 PLL 模块 VCO(压控振荡器)根据一个直流输入电压来成比例地输出频率信号。分频器 P 将输 入的信号 Fin 进行 p 分频(频率降低 p 倍) 。分频器 M 对 VCO 的输出信号进行 m 分频,然 后将此信号输入给 PFD(相频检测器) 。分频器 S 对 VCO 的输出信号进行 s 分频,所得信号 即为 Mpll(MPLL 模块的输出信号) 。除了这几个分频器、VCO 和 PFD,PLL 内还有电泵和环 路滤波器功能电路。Mpll 输出只与 Fin 相关,具体关系为: =2 其中 m=M+8, p=P+2。M 为分频器
10、M 的分频值,P 为分频器 P 的分频值。 UPLL 模块与 MPLL 模块完全相同,这里就不赘述了。 下面来叙述一下 PLL 各个模块的具体功能。 (1 ) PFD PFD 监视 Fref 和 Fvco 之间的相位差,并当检测出 Fref 和 Fvco 之间存在相位差时产生一个 控制信号。F ref 为参考输入频率。 (2 ) PUMP 这个模块将 PFD 的输出信号转换成一个电压信号并通过外部滤波器驱动 VCO。 (3 ) Loop Filter 由 PFD 经 PUMP 产生的控制信号在每次 Fvco 和 Fref 相比较时都会产生大量的抖动,为 了不干扰 VCO 正常工作,这里需要一个
11、对高频抑制较好的低通滤波器来消除这些抖动。这 个滤波器一般是一个单极点的 RC 滤波器。 (4 ) VCO 从 loop filter 输出的直流电压用来驱动 VCO 模块,从而让振荡器的频率在这个电压的 控制下线性地增大和减小。当 Fvco 与 Fref 相匹配时(不存在相位差或同步) ,PFD 就停止给 PUMP 发送控制信号,则对于 loop filter 来讲就有一个稳定的输出电压供给 VCO,而 VCO 的 输出信号也就不会改变了。 通用的 PLL 和时钟发生器的工作条件为: 环路滤波电容为 5pF;外部晶体频率为 10MHz20MHz;外部晶体振荡电路电容为 1522pF。 注意:
12、FCLK 频率必须比晶体频率或外部时钟源频率达 3 倍以上。 4. 时钟控制逻辑 时钟控制逻辑确定了如何选用时钟源,例如是采用 Mpll 还是直接采用外部时钟源 (XTIpll 或 EXTCLK) 。当用一个新的值来配置 PLL 时,时钟控制逻辑会在 PLL 输出经 PLL lock time(锁定时间)稳定前禁止 FCLK 信号。这个控制逻辑也可激活上电复位和掉电模式唤醒。 图 6.6 说明了采用外部晶体作为时钟源时上电复位过程中时钟信号的时序。 图 6.6 晶体振荡器在几个 ms(毫秒)内开始起振。在 OSC(XTIpll)时钟稳定之后,nRESET 信号被释放(复位结束) ,PLL 开始
13、按照默认配置工作。然而,PLL 在上电复位后不会立刻 稳定,所以在软件重新配置 PLLCON 之前,FCLK 就是 Fin 上的时钟信号而不是 Mpll。用软 件配置 PLLCON 是必须要进行的工作。 在软件配置之后,PLL 开始按照新的频率设置来锁定输出信号。在锁定后,FCLK 就可 以变为 Mpll 信号了。 5. 在 NORMAL 模式下改变 PLL 配置 在 NORMAL 模式下操作 S3C2410A,用户可以靠写 PMS 来改变 PLL 输出频率,改写 PMS 之后, PLL lock time 会自动加入到时钟时序过程中去。在 PLL lock time 中,输出时钟不 会作用到
14、 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 XTIpll 或 EXTCLK(
15、外部时钟源) 关 用 CLKSLOW 打开了 UPLL 48MHz 开 7. FCLK、HCLK 和 PCLK FCLK 用于内核 ARM920T。 HCLK 用于 AHB 总线,总线上挂有 ARM920T、存储器控制器、中断控制器、LCD 控制 器、DMA 和 USB Host 控制器。 PCLK 用于 APB 总线,总线上挂有外设 WDT、IIS、I 2C、PWM 定时器、MMC 接口、 ADC、UART、GPIO 、RTC 和 SPI。 S3C2410A 支持几种 FCLK、HCLK 和 PCLK 之间的分频比例,这个比例由 HDIVN 和 PDIVN 确定,它们都在 CLKDIVN 寄
16、存器中。 分频比例如下表所示: 表 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 lock time 之后,CLKDIVN
17、的设 置才能生效。这个值在复位后或模式改变后仍然是可用的。 6.4 相关寄存器描述 1. LOCK TIME COUNT REGISTER (LOCKTIME) 此寄存器为锁定实践计数寄存器。 建议用户不要改动这个寄存器的值,直接采用该寄存器的初始值即可。 2. MPLLCON 和 UPLLCON MPLLCON 和 UPLLCON 中包含 MDIV(主分频器控制) 、PDIV(预分频器控制)和 SDIV(后分频器控制)几部分。如果在程序中连续对 MPLL 和 UPLL 进行配置,那么建议先 对 UPLL 进行配置,然后再对 MPLL 进行配置,中间要有大约 7 个 NOP 的延迟。 PLL
18、配置值对照表。按照表 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_Init(void) MMU_Init(); ChangeClockDiv
19、ider(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 和 ChangeMPllValue 两个函数负责对 S3C2410A 的工作时钟进 行配置。这两个函数在文件 2410LIB.c 中有定义。 void ChangeClockDivider(int hdivn,int pdivn) /
20、 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) | pdivn; if(hdivn) MMU_SetAsyncBusMode(); else MMU_SetFastBusMode(); 这个函数负责配置 FCLK、HCLK 和 PCLk 三个时钟之间的分频比。rCLKDIVN = (hdivn1) | pdivn;是设置寄存器 CLKDIVN,在 Target_Init(void)中, ChangeClockDivider 函数调用值为 (1,1 )
21、,即 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。