电子系统中,时钟是一个关键的要素,尤其在手持设备中,时钟系统的设计与系统的性能和功耗有直接关系。PXA255提供了丰富的时钟系统的控制能力,能有效地实现性能和功耗的平衡。
2.1 实时时钟RTC
在介绍时钟机制之前,先要说明一下PXA255上的时钟系统。PXA255上的时钟系统主要包含以下5个模块:
n 32.768kHz振荡器;
n 3.6864MHz振荡器;
n 可编程频率核心锁相环PLL;
n 95.85MHz固定频率外设锁相环PLL;
n 147.46MHz固定频率锁相环PLL。
其中32.768kHz和3.6864MHz晶振将与本书讲解的模块有密切联系。
如图2-1所示的32.768kHz晶振可以用来驱动RTC、PWM等模块。但是这个晶振在硬件复位后是被屏蔽的,系统使用3.6864MHz晶振作为时钟源。因此需要软件来设置寄存器,使这个晶振工作。
图2‑1 PXA255时钟系统
3.6864MHz晶振是系统的主要时钟源,可以用来驱动大部分的模块。在没有32.768kHz晶振的情况下,可以将其分频使用。
一个实时时钟是系统在关闭时也能追踪、记录时间的时钟。它经常以集成电路芯片的形式嵌入在系统中。实时时钟可以用于许多种类的计算机,尤其在嵌入式系统中。
一般情况下,实时时钟是依靠备用电池供电的,并不和外部电源直接相连。因此在断电后,仍然能工作,而相比之下,其他依靠外部电源供电的时钟在系统断电后就无法工作了。希望读者不要把一个计算机的实时时钟与其CPU时钟相混淆。
2.1.1 实时时钟的运行原理
PXA255一共提供了以下几个实时时钟控制/状态寄存器:
n RTC精确调整寄存器(RTTR);
n RTC闹钟寄存器(RTAR);
n RTC计数寄存器(RCNR);
n RTC状态寄存器(RTSR)。
RTTR为时钟提供了修正的功能;RTAR为闹钟寄存器,存放了引发中断的时间限制数;RCNR为计数计数器;RTSR为状态寄存器,可以用来触发中断。
在硬件复位或者看门狗复位后,RCNR计数恢复为0,然后在每赫兹时钟的每个下降沿递增1。由于1赫兹产生的脉冲的高电平区只能维持32kHz周期的宽度,而RCNR的递增操作发生在赫兹时钟产生上升沿后的32kHz周期的时间点上,因此看起来就像是在赫兹时钟下降沿递增的。这个寄存器是读/写寄存器,当要把特定的计数值写入这个寄存器时,直接操作即可。RTSR计数器不受系统的睡眠或者是空闲状态改变的影响。
除了计数器以外,PXA255还提供了闹钟寄存器RTAR,可以向RTAR中写入特定的值,每当RCNR计数器递增后就会和RTAR进行比较,如果值相等,则触发中断RTSR[AL](如果中断没有被屏蔽的话)。
赫兹时钟是由两个时钟源中任何一个的频率进行特定运算后得到的频率。在PX255的系统中,要求使用3.6864MHz的晶振和32.768kHz的晶振。系统中可以同时使用这两个时钟源或者其中一个,如果是使用3.6864MHz晶振的话,应当对其进行分频到32.914kHz。
可以通过编程来指定产生赫兹时钟的除法的参数,这同时也提供给开发人员修正时钟误差的机会,关于修正误差,我们将在后续的章节中讨论。
2.1.2 RTC精确调整寄存器(RTTR)
通过设置RTTR寄存器,可以调整赫兹时钟的频率。这个寄存器在复位后的值为0x0000_7FFF,如果晶振为非常精确的32.768kHz的话,那么正好将产生1Hz的输出。如果设置成其他值,也同样会使赫兹时钟产生其他的频率。如果使用的晶振不是32.768kHz的话,也可以通过这个寄存器的值的改变来弥补。在后面的章节中我们将介绍如何计算赫兹时钟的频率。
向RTTC中的一次写入操作将会使RCNR自增。在RTTR中,有一部分被保留的位,这些位应当被设置成0,任何对它们的读操作都将被忽略。RTTR只能通过硬件的重启来复位,不像RCNR可以通过软件方式来复位。RTTR的第32位为Lock功能,如果被置位的话,那么本寄存器就变成只读的了,这样可以更好地保护数据。第32位只能通过硬件复位来清除。RTTR的定义如图2-2与表2-1所示。
图2-2 RTTR
表2-1 RTTR定义
位 号 |
名 称 |
描 述 |
<31> |
LCK |
调整值的锁存位 |
<30:26> |
- |
保留 |
<25:16> |
DEL |
调整用的删除计数 |
<15:0> |
CK_DIV |
时钟除数 |
2.1.3 RTC闹钟寄存器(RTAR)
RTAR闹钟寄存器是一个32位的寄存器。处理器可以进行读/写操作。
在赫兹时钟的每个上升沿,本寄存器的值都将和RCNR的值进行比较,如果它们相等,并且RTSR[ALE]被置位,则RTSR[AL]被设置成1,引发中断。
RTAR寄存器在复位后,值为0x0。
RTAR的定义如图2-3与表2-2所示。
图2‑3 RTAR
表2-2 RTAR定义
位 号 |
名 称 |
描 述 |
<31:0> |
RTMV |
RTC闹钟触发值 |
2.1.4 RTC Counter Register(RCNR)
RCNR是一个读/