视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
嵌入式技术应用教程——基于S3C2410第六章
2025-09-30 19:45:01 责编:小OO
文档
第六章  时钟和功耗管理

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打开打开EXTCLKEXTCLK
达盛公司的实验系统上采用的是OM[3:2]=00b的情况,即时钟源全部来自外部的晶体时钟源(12MHz)。如图6.4所示。

图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
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寄存器中。

分频比例如下表所示:

表6.3

HDIVN1HDIVNPDIVNFCLKHCLKPCLK比例关系
000FCLKFCLKFCLK1:1:1
001FCLKFCLKFCLK/21:1:2
010FCLKFCLK/2FCLK/21:2:2
011FCLKFCLK/2FCLK/41:2:4
100FCLKFCLK/4FCLK/41:4:4
这里推荐使用1:2:4的比例设置。开机默认比例为1:1:1。

在配置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。下载本文

显示全文
专题