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倍频等。
锁相环是一个闭环的自动控制系统,它能够保证输出的信号的相位和输入信号的相位同步,此时称为锁相环为锁定状态。一旦这两个信号相位不同步了,那么在锁相环能调整的范围内,它会自动调整重新让输出信号的相位与输入信号同步。
图6.2为锁相环的基本功能框图。
图中相位检测器英文为phase detector,环路滤波器英文为loop filter,压控振荡器英文为voltage controlled oscillator。感兴趣的读者可以参阅清华大学出版社出版的《锁相环设计、仿真与应用(影印版)》来具体了解PLL。
6.2 S3C2410A的时钟和功耗管理概述
S3C2410A的时钟和功耗管理模块由三部分组成。其分别为时钟控制、USB控制和功耗控制。
S3C2410A的时钟控制逻辑可产生芯片工作所必须的时钟信号,其中包括了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和所有的外设均有时钟驱动。这种模式中所有的外设都处于打开状态,S3C2410A功耗最大。这里可以利用软件来控制外设的操作。例如,如果一个定时器不需要工作,那么可以将定时器的时钟驱动断开,这样就可以降低芯片的功耗。
SLOW模式:
这种模式下芯片不让PLL工作。与NORMAL模式不同,SLOW模式采用一个外部时钟(XTIpll或EXTCLK)来作为S3C2410A的FCLK而不采用内部PLL的输出信号。这种模式下,芯片的功耗完全由外部时钟的频率所决定(频率越高功耗越大)。此时的总体功耗不计PLL的功耗。
IDLE模式:
这种模式下,FCLK与CPU断开连接,而其他的外设都有时钟驱动。IDLE模式由于CPU核没有供给时钟,所以整体功耗降低。用中断请求就可以唤醒CPU回复到正常状态。
Power_OFF模式:
内部电源模块与其他模块断开连接。这种模式下,除了唤醒逻辑电路工作之外,其他模块全部没有功率消耗。激活Power_OFF需要两个的电源,其中一个电源供给唤醒逻辑,另一个电源供给CPU及其他设备,并且这个电源要可控制。在Power_OFF模式下,给CPU和其他设备供电的那个电源会被关闭。靠外部中断EINT[15:0]或RTC告警中断可以退出Power_OFF模式。
在本课程范围内,S3C2410A都工作在NORMAL模式,故其他几种工作模式在这里就不再详细描述了,感兴趣的读者可以参阅S3C2410A的数据手册。
6.3 S3C2410A的时钟
1.时钟源构架
主时钟源来自外部的晶体(XTIpll)或一个外部时钟源(EXTCLK)。时钟发生器包括了一个振荡器,这个振荡器连接着一个外部晶体。时钟发生器还有两个PLL用来产生S3C2410A工作所用的高频信号。
图6.3 时钟源构架
2.时钟源的选择
用模式控制引脚来选择时钟源。此处的模式控制引脚为OM[3:2]。
OM3和OM2的值在nRESET的上升沿被内部锁存器锁存。
下表描述了芯片启动时的时钟源选择方案。
表6.1
| OM[3:2] | MPLL状态 | UPLL状态 | 主时钟源 | USB时钟源 |
| 00 | 打开 | 打开 | 晶体 | 晶体 |
| 01 | 打开 | 打开 | 晶体 | EXTCLK |
| 10 | 打开 | 打开 | EXTCLK | 晶体 |
| 11 | 打开 | 打开 | EXTCLK | EXTCLK |
图6.4
注意:
① 尽管在复位后MPLL就已经启动了,但是必须在软件中向MPLLCON寄存器中写入可用的设置后,MPLL的输出才可用到系统时钟上。在此写可用设置之前,来自外部晶体的时钟或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分频,然后将此信号输入给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的输出信号转换成一个电压信号并通过外部滤波器驱动VCO。
(3)Loop Filter
由PFD经PUMP产生的控制信号在每次Fvco和Fref相比较时都会产生大量的抖动,为了不干扰VCO正常工作,这里需要一个对高频抑制较好的低通滤波器来消除这些抖动。这个滤波器一般是一个单极点的RC滤波器。
(4)VCO
从loop filter输出的直流电压用来驱动VCO模块,从而让振荡器的频率在这个电压的控制下线性地增大和减小。当Fvco与Fref相匹配时(不存在相位差或同步),PFD就停止给PUMP发送控制信号,则对于loop filter来讲就有一个稳定的输出电压供给VCO,而VCO的输出信号也就不会改变了。
通用的PLL和时钟发生器的工作条件为:
环路滤波电容为5pF;外部晶体频率为10MHz~20MHz;外部晶体振荡电路电容为15~22pF。
注意:FCLK频率必须比晶体频率或外部时钟源频率达3倍以上。
4.时钟控制逻辑
时钟控制逻辑确定了如何选用时钟源,例如是采用Mpll还是直接采用外部时钟源(XTIpll或EXTCLK)。当用一个新的值来配置PLL时,时钟控制逻辑会在PLL输出经PLL lock time(锁定时间)稳定前禁止FCLK信号。这个控制逻辑也可激活上电复位和掉电模式唤醒。图6.6说明了采用外部晶体作为时钟源时上电复位过程中时钟信号的时序。
图6.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会自动加入到时钟时序过程中去。在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 | XTIpll或EXTCLK(外部时钟源) | 关 |
| 用CLKSLOW打开了UPLL | 48MHz | 开 |
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寄存器中。
分频比例如下表所示:
表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 |
在配置PMS值之后,需要对CLKDIVN进行配置。在PLL lock time之后,CLKDIVN的设置才能生效。这个值在复位后或模式改变后仍然是可用的。
6.4 相关寄存器描述
1.LOCK TIME COUNT REGISTER (LOCKTIME)
此寄存器为锁定实践计数寄存器。
建议用户不要改动这个寄存器的值,直接采用该寄存器的初始值即可。
2.MPLLCON和UPLLCON
MPLLCON和UPLLCON中包含MDIV(主分频器控制)、PDIV(预分频器控制)和SDIV(后分频器控制)几部分。如果在程序中连续对MPLL和UPLL进行配置,那么建议先对UPLL进行配置,然后再对MPLL进行配置,中间要有大约7个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_Init(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和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 = (hdivn<<1) | pdivn;
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三个时钟之间的分频比为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。下载本文