上面一篇给出了MSP430时钟系统的大体框架。下面我们将具体看一下每个时钟模块的内部结构,看一下他们是如何工作的。最后,我们将给出一个例程来设置时钟模块的工作方式和相关的控制寄存器。
首先呢,我们来看一下当一个PUC(上电清除)信号发出后,系统是如何默认设置各个时钟模块的。当产生一个PUC信号后MCLK和SMCLK时钟源被设置为800KHz的DCOCLK,ACLK时钟源来自LFXT1并且工作在低频模式。
有了上面的一些知识后,我们就可以解释前面提到的MSP430的工作模式之间的转换问题。我们可以通过设置寄存器中的状态为SCG0、SCG1、OSCOFF和CPUOFF来开启关闭基础时钟的各个模块,进而让MSP430单片机工作在不同的模式下。
下面呢让我们来看一下MSP430x1xx中的各个振荡器。
LFXT1 Oscillator
当LFXT1振荡器采用32768Hz手表晶体工作在LF模式(XTS=0 )时,支持极小电流消耗。这个时候不需要任何外部器件而仅仅是接一个晶体在XIN和XOUT之间。需要的电容是由内部12pF的负载电容自动匹配的。需要的话还可再接外部电容。
当设置HF模式(XRS=1)并且OSCOFF状态位被清除时,LFXT1振荡器也支持高速晶振或者振荡器。这时高速晶振或振荡器接到XIN和XOUT端并且两端都需外接电容。电容的大小由高速晶振或者振荡器来决定。。
当LFXT1Sx=11且OSCOFF=0时,LFXT1在LF和HF模式下都必须在XIN引脚上加上外部时钟信号。当使用外部信号,外部频率必须满足所选模式的参数。
如果LFXT1不为MCLK或SMCLK提供时钟源,则可以通过软件设OSCOFF位来禁用LFXT1。
当使用LFXT1振荡器时需要注意下面的问题。低频晶体振荡器根据晶振的大小需要几百毫秒的起振时间。超低功耗振荡器如LFXT1在LF模式下必需消除别的信号源的噪音干扰。晶振尽量靠MSP430的晶振引脚并且远离地线。
XT2Oscillator
有些器件有第二个晶体振荡器XT2 。XT2为XT2CLK提供时钟源,特性与XT1在HF模式下相同。 如果XT2没有用作MCLK或者SMCLK的时钟源,那么可以通过设置XT2OFF位来废弃XT2振荡器。
XT2也可使用XT2IN管脚的外部信号。当用于外部信号时,外部频率必须满足XT2的参数要求并且XT2OFF状态位必须被清除。
Digitally-Controlled Oscillator(DCO)
DCO是一个具有RC特性的集成环形振荡器。就像其他的RC振荡器一样,它的频率会随着温度、电压的变化而变化,因此并不准确,但是也足以应付一般的应用。我们可以通过改变DCOx、MODx和RSELx位来改变DCO的频率。
当DCO没有用作SMCLK或者MCLK的源时,我们可以通过设置SCG0位来关闭DCOCLK振荡器。
上图是通过设置DCOx和RSELx得到的不同的DCO频率。当系统复位时,初始化的RSELx=4,DCOx=3,得到一个中频的DCO。
3位RSELx实现对DCO的8种频率范围的选择,在此基础上通过设置3位DCOx来在更加细化频率选择。5位的MODx实现频率在DCOx和更高频率的DCOx+1 之间的转化,有点PWM波高低占空比的意思。当DCOx=07h时,MODx失效。
下面我们用一个程序来演示下时钟模块的设置。我们来设置主时钟信号MCLK=XT2,子时钟信号SMCLK=DCOCLK,将MCLK从MSP430F149的P5.4口输出,在MSP430F149中P5.4和MCLK是复用的。