5.7 时钟电路
LPC17xx包括3个独立的时钟源,分别为主时钟振荡器、RTC时钟振荡器和内部RC振荡器,在LPC17xx复位后,LPC17xx将由内部RC振荡器提供时钟直至由软件切换到另外的时钟振荡源为止,这使得系统可以不依赖于外部时钟进行操作,而且使引导加载程序可以在一个确定的频率下进行操作。
图5.10为LPC17xx的时钟系统发生示意图。

1.内部RC振荡器(Internal RC Oscillator,IRC)
内部RC振荡器(IRC)可以作为看门狗的时钟源,也可以作为时钟,驱动锁相环(PLL)提供给CPU。IRC的精度不足,因此不能用于USB接口,通常IRC频率是4MHz,在开机或者芯片复位时,LPC17xx使用IRC作为时钟源,之后可以通过软件切换使用其他时钟源。
2.主晶振(Main Oscillator)
主晶振可用于使用或不使用PLL0为CPU提供时钟,其频率范围为1~24MHz,这个频率可以通过主PLL(PLL0)倍频至更高的频率直至CPU操作的最大频率。通常把主晶振输出的时钟称为OSC_CLK,PLL0输入引脚上的时钟称为PLLCLKIN,ARM处理器时钟频率称为CCLK。当使用主晶振提供时钟并不激活PLL时,PLLCLKIN和CCLK的值是相等的。
LPC17xx的板上晶振源可以工作在两种模式下:从属模式和振荡模式,在从属模式下,输入时钟信号(XTAL1引脚)与一个100pF电容相连,其幅值不少于200mV,XTAL2引脚不连接。在振荡模式下,由于片内集成了反馈电阻,所以只需要在外部链接一个晶体和电容CX1和CX2就可以形成基本模式振荡。两种振荡器模式的示意图如图5.11所示。

3.RTC晶振(RTC Oscillator)
RTC晶振的频率为32.768KHz,一般用于给RTC实时时钟提供时钟源,RTC时钟源可以提供1Hz的时钟频率给RTC并且可以输出32kHz的时钟频率,作为PLL0和CPU或者看门狗定时器使用时钟源。
4,时钟源选择
主晶振、RTC晶振以及内部IRC三个时钟源均有可能用来驱动PLL0从而给CPU和片内外设提供时钟,当PLL0未连接时,系统才可以安全的切换时钟源。
表5.8 时钟源选择寄存器(CLKSRCSEL,0x400FC10C)

5.8 锁相环PLL0(Phase Locked Loop 0)
PLL0接受输入的时钟频率范围为32kHz~50MHz。时钟源由CLKSRCSEL寄存器(见表5.9)选择。输入频率可以被倍频到一个较高的频率上,之后可以通过分频为CPU、外设以及可选的USB子系统提供精确的时钟。值得注意的是USB子系统拥有自己专用的PLL。PLL0可以产生最高至CPU允许的最大100MHz的频率。
PLL0的输入频率通过一个预分频器分频成为PLL内部频率,预分频的值用变量N表示,范围1到256之间。然后再通过一个电流控制振荡器(CCO,Curren Controlled Oscillator)倍频增到范围275~550MHz之间,倍频器的值用变量M表示。CCO频率再通过CPU频率设置寄存器分频成为提供给CPU的CCLK时钟。
PLL的使能是由PLL0CON寄存器控制,PLL0倍频器和分频器的值都是由PLL0CFG寄存器控制。为了防止PLL0参数发生意外改变或PLL0失效,对这两个寄存器进行了保护。当PLL0提供芯片时钟时,由于芯片的所有操作,包括看门狗定时器在内都依赖于它,因此PLL0的设置的意外改变将导致CPU执行不期望的操作。
在芯片复位或者进入掉电模式后,PLL0将被关闭或者屏蔽,PLL0必须由软件配置、使能连接到系统中。PLL0接口框图如图5.12所示。

以下将描述PLL0涉及的寄存器及其功能描述。
1.PLL0控制寄存器PLL0 Control register(PLL0CON,0x400F C080)
PLL0CON寄存器可以用于使能和连接PLL0,使能PLL0锁定到当前倍频器和分频器值设定的频率上,连接PLL0将使处理器和大多数片内功能都根据PLL0的输出时钟来工作。对PLL0CON的更改只有在对PLL0CON寄存器执行了正确的PLL馈送序列后才生效。
表5.9 PLL0控制寄存器

PLL0在作为时钟源之前必须进行设置、使能并锁定。将振荡器时钟切换到PLL0输出或者翻过来操作时,内部电路对操作进行同步以确保不会产生干扰,硬件不能确保PLL在连接之前锁定或在PLL0在失去锁定时自动断开连接。在PLL0失去锁定的情况下,振荡器很可能已经变的不稳定,这样即使断开PLL0也挽救不了这种情况。
2.PLL0配置寄存器PLL Configuration register(PLL0CFG, 0x400F C084)
PLL0CFG寄存器是最新的PLL0配置值的保存寄存器,包含PLL倍频器和分频器的值。在执行正确的PLL0馈送序列之前改变PLL0CFG寄存器的值不会生效。
表5.10 PLL0配置寄存器

3.PLL0状态寄存器PLL0 Status Register(PLL0STAT, 0x400F C088)
PLL0STAT为只读寄存器,它是PLL0控制和配置信息的回读寄存器,反映了正在使用的真实PLL0的参数和状态。PLL0STAT可能和PLL0CON和PLL0CFG中的值不同,这是因为没有执行正确的PLL0馈送序列,这两个寄存器中的值并未生效。
表5.11 PLL0状态寄存器

PLL0STAT寄存器中的PLOCK0位连接到中断控制器,这样可以使用软件打开PLL0并连接到其他功能,不需要等待PLL0锁定。当发生中断时(PLOCK0=1),可以连接PLL0并禁止中断。只能通过禁止PLL0中断的方式返回。
PLL0有3种可能的工作方式,由PLLE0和PLLC0位组合获得。
表5.12 PLL0的工作模式

4.PLL0馈送寄存器PLL0 Feed register(PLL0FEED,0x400F C08C)
必须将正确的馈送序列写入PLL0FEED寄存器才能使PLL0CON和PLL0CFG寄存器的更改生效,馈送序列如下:
将值0xAA写入PLL0FEED
将值0x55写入PLL0FEED
这两个写操作的顺序必须正确,而且在两次操作之间必须没有其他的寄存器访问相同的地址空间(从0x400F C000到0x400F FFFF),这就意味着尽量在执行PLL0馈送操作的时候禁止中断,不管写入的值不正确还是没有满足前两个条件,对PLL0CON或者PLL0CFG寄存器的更改都不会生效。
表5.13 PLL0馈送寄存器

5.PLL0和掉电模式
掉电模式会自动关闭并断开PLL0,从掉电模式唤醒不会自动恢复PLL0的设置,PLL0的恢复必须由软件来完成。通常,一个将PLL0激活并等待锁定,然后将PLL0连接的子程序可以在任何中断服务程序的开始调用,有一点非常重要,那就是不要试图在掉电唤醒后简单的执行馈送序列来重新启动PLL0,这会出现在PLL0锁定建立之前同时使能并连接PLL0的危险。
6.PLL0频率计算
表5.14 PLL0所需变量表

当LPC17xxx微处理器系统需要使用PLL0时,应当按照以下原则进行计算配置。
* 确定应用是否需要USB接口,并且USB是否由PLL0提供时钟,USB需要一个准确的50%占空比48MHz时钟信号,这就意味着FCCO必须为48MHz的整数倍(如96MHz)并且FCCO要相当准确;
* 确定处理器的时钟频率CCLK。这可以根据对处理器的整体要求来决定,外围器件的时钟频率可以低于处理器的频率;
* 选择PLL输入频率FIN的值;
* 计算M和N的值,以产生一个有效且精确的FCCO的频率。
PLL0的输出频率公式为:FCCO=(2×M×FIN)/N
例如,系统不需要USB接口,目标CPU速率为72MHz,32.768kHz的RTC时钟作为系统的时钟源。M=(FCCO×N)/(2×FIN),可以产生CPU需求频率并且PLL0可以正常操作范围内的最小FCCO频率是288MHz(4×72MHz)。由N=1开始计算,所以M=288×106/(2×32,768)=4,394.53125。计算所得并不是一个整数,所以CPU的频率不是精确的288MHz。
评论
谈的很详细!
非常有价值!谢谢创新网!