PLL0 支持从 32kHz~25MHz范围内的输入时钟频率。时钟源在CLKSRCSEL寄存器中选择(见 2.2.2 节中的描述)。PLL将输入时钟倍频,然后再分频,以提供给CPU、外设或USB子系统使用的实际时钟。PLL0 可产生的时钟频率高达 100MHz,是CPU所允许的最大值。
PLL输入(频率范围为 32kHz~50MHz)首先被一个“ N ”值分频,“ N ”值的范围为1~256。该输入分频在相同的输入频率下,提供更多种可能的输出频率范围。
PLL倍频器(见图 2-4 中的 M 倍频)的操作在PLL输入分频器之后进行。通过使用电流控制振荡器(CCO)由“ M ”的值(支持的 M 值范围为 6~512,以及表 2-12 中所示的值)来倍频输入分频器的输出。因此,产生的频率必须在 275~550MHz频率范围内。倍频器操作是先使用 M 值分频CCO输出,然后使用相位-频率检测器将分频后的CCO输出与倍频器输入相比较。可以根据比较的偏差值调节CCO的振荡频率。
PLL0 的输出还连接有其他的分频器,使其频率下降到CPU、外设和USB子系统所需要的值。PLL0 的方框图如图 2-4 所示。
图 2-4 PLL0 的方框图
PLL0 控制寄存器控制PLL有效。PLL0 配置寄存器控制PLL0 倍频器和分频器的值。为了避免程序对PLL0 正在使用的相关参数进行意外修改或PLL失效,芯片厂商对这两个寄存器进行了保护。由于所有的芯片操作,包括看门狗定时器,在这种配置情况下都可能依赖于PLL0(如当PLL正在提供芯片时钟时),所以意外改变PLL0 的设置将导致微控制器执行不期望或错误的操作。保护是由一个类似于操作看门狗定时器的代码序列来实现的,详情请参阅PLL0FEED寄存器的描述。
PLL0 在系统进入掉电模式时会自动关闭并断开。PLL0 必须通过软件配置、使能和连接到系统。
注意: 一定要按照PLL0 设置序列的设置步骤来进行,否则PLL可能不操作!
当在用户Flash中没有有效代码(由校验和字段决定)或在启动时拉低ISP使能引脚(P2.10)时,芯片将进入ISP模式,并且引导代码使用IRC设置PLL。因此,当用户启动JTAG来调试应用代码时,不能假设PLL被禁能。用户启动代码必须按照本章中说明的步骤来断开与PLL的连接。
1.PLL0 寄存器的描述
PLL0 由PLL0 寄存器进行控制,如表 2-5 所示。
表 2-5 PLL0 寄存器
注:[1]复位值仅指在使用位中保存的数据,不包括保留位的内容。
注意: PLL0 值的不正确设定会导致器件不能正确地操作!
1)PLL0 控制寄存器(PLL0CON-0x400FC080)
PLL0 控制寄存器包含了使能和连接PLL0 的位。该寄存器可以使能PLL0,以允许它尝试锁定倍频器和分频器的当前设定值。连接PLL0 的位,可以使PLL0 的输出用做处理器和大多数片内外设的时钟源。对PLL0 控制寄存器的更改,只有在对PLL0FEED执行了正确的PLL0 馈送序列后才生效。
PLL0 控制寄存器的位描述如表 2-6 所示。
表 2-6 PLL0 控制寄存器的位描述
PLL0 在用做时钟源之前必须进行设置、使能并锁定。当PLL时钟源从振荡器时钟切换到PLL0 输出或反过来操作时,为确保不产生问题,内部电路同步化该操作。此外,当PLL0 脱离锁定状态时,硬件是不会主动断开PLL0 连接的,这时振荡器很可能已变得不稳定,此时再断开PLL0 也没用了。
2)PLL0 配置寄存器(PLL0CFG-0x400F C084)
PLL0 配置寄存器包含PLL0 倍频器和分频器值。在执行正确的PLL馈送序列之前,改变PLLC0 配置寄存器的值不会生效。
PLL0 配置寄存器的位描述如表 2-7 所示。
表 2-7 PLL0 配置寄存器的位描述
3)PLL0 状态寄存器(PLL0STAT-0x400FC088)
PLL0 状态寄存器提供了当前生效的PLL0 真实工作参数和状态,它是一个只读寄存器。PLL0STAT中的值可能与PLL0CON和PLL0CFG中的值不同,这是因为对这些寄存器的更改只有在执行了正确的PLL0 馈送序列后才生效。
PLL0 状态寄存器的位描述如表 2-8 所示。
表 2-8 PLL0 状态寄存器的位描述
PLL0STAT的PLOCK0 位反映PLL0 的锁定状态。当使能PLL0 或改变参数时,PLL0在新的条件下需要一些时间来完成锁定。可通过监控PLOCK0 位来确定连接PLL0 的时间。当PLL参考频率(参考频率 F REF 与 N 分频器输出的频率相等,即 F REF = F IN / N )小于100kHz或大于 20MHz时,PLOCK0 的值可能不稳定。在这些情况下,可假设PLL启动后经过一段时间才稳定下来。当 F REF 大于 400kHz时,这个时间为 50s;当 F REF 小于 400kHz时,这个时间为 200/ F REF s。
PLOCK0 位连接到中断控制器,这样可使用软件使能PLL0,而无须等待PLL0 锁定。当发生中断时,可以连接PLL0 并禁止中断。
PLL0STAT[24]和PLL0STAT[25],即PLLC0 和PLLE0 的组合解释如表 2-9 所示。
表 2-9 PLL0 控制位的组合
4)PLL0 馈送寄存器(PLL0FEED-0x400F C08C)
必须将正确的馈送序列写入PLL0FEED寄存器,才能使PLL0CON和PLL0CFG寄存器的更改生效。馈送序列如下:
① 将值 0xAA写入PLL0FEED;
② 将值 0x55 写入PLL0FEED。
这两个写操作的顺序必须正确,而且必须在相同的地址空间(0x400F C000~0x400F FFFF)内没有其他寄存器访问。如果有一个中断服务程序在对该空间内的一个寄存器执行写操作,则在执行PLL0 馈送操作时必须禁止中断。如果写入的值不正确或没有满足前两个条件,则对PLL0CON或PLL0CFG寄存器的更改都不会生效。
PLL0 馈送寄存器的位描述如表 2-10 所示。
表 2-10 PLL0 馈送寄存器的位描述
2.PLL0 和掉电模式
掉电模式会自动关闭并断开PLL0。从掉电模式唤醒不会自动恢复原先的PLL0 参数,必须在软件中恢复PLL0。通常可以在中断服务程序的开始激活PLL0、等待锁定并连接PLL0,该中断服务程序也可以在掉电唤醒时调用。需要注意一点,那就是不要试图在掉电唤醒之后简单地执行馈送序列来重新启动PLL0,在建立PLL锁定之前,这种操作将会同时使能并连接PLL0。
3.PLL0 的频率计算
在进行PLL0 参数的设置时,需要的参数信息如表 2-11 所示。
表 2-11 PLL0 的参数信息
PLL0 输出频率(当PLL0 被激活且连接时)的计算公式为
F CCO =(2× M × F IN ) / N
PLL输入和设定必须满足下面的条件。
(1) F IN 的范围:32kHz~50MHz;
(2) F CCO 的范围:275~550MHz。
可通过求解PLL等式来得到其他的PLL参数:
M =( F CCO × N ) /(2× F IN )
N =(2× M × F IN )/ F CCO
F IN =( F CCO × N )/(2× M )
允许的 M 值:
(1)在较高的振荡器频率下(超过 1MHz),允许 M 值的范围为 6~512,这是支持主振荡器和IRC操作的整个 M 值范围;
(2)对于较低频率,特别是当RTC振荡器用来计时PLL0 时,选择了 65 个 M 值用于支持波特率产生和CAN/USB操作,这些值在表 2-12 中给出。
表 2-12 使用低频时钟输入的倍频值
4.确定PLL0 频率参数的过程
通过使用NXP提供的电子数据表可简单确定PLL0 参数。如果要手动确定PLL0 参数,可按照下面的步骤来进行。
(1)确定是否需要使用USB,以及是否由PLL0 驱动。USB要求一个占空比为 50%的48MHz时钟源,也就是说, F CCO 必须是 48MHz的偶数整数倍(即 96MHz的整数倍),误差范围极小。
(2)选择所需的处理器操作频率( F CCLK ),这取决于处理器的吞吐量要求,所支持的特定的UART波特率等。外设可在较低时钟频率下运行,这个频率可以低于处理器的频率(见 2.2.4 节“时钟分频器”和 2.2.5 节“功率控制”)。找出与所需 F CCLK 的倍数接近的一个 F CCO 值,再与步骤(1)中USB所要求的 F CCO 值相比较,较低的 F CCO 值,处理器的功耗也更低。
(3)选择PLL输入频率( F IN )的值。可从主振荡器、RTC振荡器或片内RC振荡器中选择。使用USB功能时,需要选择主振荡器。如果使用PLL1 而不是PLL0 来驱动USB子系统,会影响选择主振荡器的频率。
(4)计算 M 和 N 的值来产生十分精确的 F CCO 频率。将所需的 M 值减 1(即 M -1)写入PLL0CFG的MSEL0 字段,将所需的 N 值减 1(即 N -1)写入PLL0CFG的NSEL0字段。
总的来说,建议使用一个较小的 N 值,这样可以降低 F CCO 的倍频数。由于在某些情况下很难找到最好的值,所以可以使用电子数据表或类似的方法来立即获得多种可能的值,再从中选择出一个最好的值。
5.PLL0 的设置步骤
要想对PLL0 进行正确的初始化,必须按照下列步骤操作。
(1)如果PLL0 已被连接,则用一个馈送序列断开与PLL0 的连接。
(2)用一个馈送序列禁止PLL0。
(3)如果需要,可在没有PLL0 的情况下改变CPU时钟分频器的设置以加速操作。
(4)操作“时钟源选择控制寄存器”以改变时钟源。
(5)写PLL0CFG并用一个馈送序列使其有效。PLL0CFG只能在PLL0 被禁止时更新。
(6)用一个馈送序列使能PLL0。
(7)改变CPU时钟分频器的设置,使之与PLL0 一起操作。在连接PLL0 之前完成这个操作是很重要的。
(8)通过监控PLL0STAT寄存器的PLOCK0 位,或使用PLOCK0 中断来等待PLL0 实现锁定。此外,当使用低频时钟作为PLL0 的输入时(也就是 32kHz),需要等待一个固定的时间。当PLL参考频率(REFCLK的频率 F REF 与预分频器值分频所得的PLL输入频率相等)少于 100kHz或大于 20MHz时,PLOCK0 的值可能不稳定。在这些情况下,启动PLL后等待一段时间即可。当 F REF 大于 400kHz时,这个时间为 500s;当 F REF 小于 400kHz时,这个时间为 200/ F REF s。
(9)用一个馈送序列连接PLL0。
需要注意的是不要合并上面的任何一个步骤。例如,不能用相同的馈送序列同时更新PLL0CFG和使能PLL0。