MSP430G2553与MSP430F5336系列单片机总结1——时钟说明与低功耗模式简介

  在进行MSP430单片机的编程时,时钟的运用很重要,MSP430一共有5个时钟源,分别是外接的XT1和XT2时钟源,介绍如下:

  1.XT1CLK:低频/高频振荡器,我的MSP430F5336使用的就是32768HZ的晶振

  2.VLOCLK:内部超低功耗低低频振荡器,典型频率是12khz;

  3.REFOCLK:内部调整低频参考振荡器,典型值为32768hz;

  4.DCOCLK:内部数字时钟振荡器,可由FLL稳定后得到;

  5.XT2CLK:高频外界振荡器,我F5336接的是20MHZ晶振;

  以上五个时钟大家可以理解为晶振,有的是内部自带的,如2,3,4,这三个,有的是外接自己设计的,如XT1和XT2,当我们需要用单片机处理一些高速计算时,例如做图像处理或者一些迭代计算,此时要求计算速度比较高,所以可以选用外界的XT2或者DCOCLK调整后得到。如果你需要精确定时或者计时,可以使用REFOCLK或者VLOCLK,因为他们频率较为稳定,计时精确。用的比较多的是32768HZ的频率。DCOCLK的调整比较灵活,有专门的锁频环公式,在datasheet上可以找到DCO频率的设置条件表格,可以根据它直接调整出适合的频率。

  但是MSP430的时钟调用却没有那么简单,你可以想象时钟设计为做菜,上面的五个时钟只是五种最基本的食材,通过寄存器的一些特殊调用,可以利用上面的时钟源做出三道菜,分别是ACLK辅助时钟,MCLK主时钟,SMCLK子系统时钟,而我们编程所用的时钟源(也就是我们要吃的菜),是这三种时钟提供的。所以举个栗子说,我需要一个32768hz的时钟来精确定时,同时需要一个1.2M或者的时钟来控制串口通信的波特率,同时我希望我的MCU频率可以到20M,这样我恶意设置MCLK=20Mhz(MCLK时钟是系统时钟),设置ACLK时钟为32768HZ,时钟计时是我选用ACLK为时钟源,设置SMCLK时钟为1.2Mhz,串口通信时选择时钟源为SMCLK,但是我们如何使ACLK为32768hz,使MCLK为20Mhz,使SMCLK为1.2M呢,这就是通过调配这三个时钟的原料为上面的五种不同晶振。所以实际上我们在程序中一旦定下了ACLK,MCLK,SMCLK的频率,之后基本都不用管之前的5个晶振,因为都是和这三个时钟打交道。而时钟的控制一般写成一个初始化函数,在程序中调用一次就可以了。刚刚开始接触时很容易搞不清楚时钟,觉得很复杂,其实弄清楚原理还是很简单的。

  现在我用一些程序来说明时钟的用法,以下我看到的一份MSP430G2553的时钟程序库,进行了一些修改,其中的函数功能等均有注释,至于那样设置的原理可以看UserGuide的寄存器说明,里面一些特定的寄存器的位代表了一些信息,例如分频系数,时钟源等等,大家可以自己参考用户手册一句一句翻译对照,相信很快能弄懂时钟的设定原理:

  然后再说说如何测试自己的程序时钟设置的正不正确呢,MSP430系列的单片机有的引脚的第二功能是专门的时钟输出,所以只要把这些引脚设置为时钟输出格式,并且用示波器观察输出方波的周期即可知道时钟是否正确。例如G2553的引脚第二功能可以这样观察,首先到datasheet中看引脚说明:

SouthEast - MSP430G2553与MSP430F5336系列单片机总结1——时钟说明与低功耗模式简介

  不难看出,P1DIR.0=1,P1SEL.0=1,P1SEL2.0=1是,P1.0管教为ACLK输出,所以编程代码为:

P1DIR |=BIT0; //  |= BITx; 是MSP430中位置1的语句,如果要多个位置1,那么就使用 |=BIT0+BIT1+BIT2+...的格式

P1SEL |= BIT0; //  ^=BITx;  是MSP430中位取反的语句,如果要多个位取反,那么就使用 ^=BIT0+BIT1+BIT2+...的格式

P1SEL2 &=~BIT0; //  &=~ BITx; 是MSP430中位置0的语句,如果要多个0,那么就使用 &=~(BIT0+BIT1+BIT2+...)的格式

  通过以上的设置,P1.0就会输出ACLK频率的方波,SMCLK是P1.4引脚的第二功能,设置方式以此类推。

  举一反三,我们可以发现IO口有很多第二功能,例如P1.0可以做IO口,可以做定时器TA0的时钟输出,可以做ACLK输出,可以做A0,还可以做捕捉比较器A0,之后我们将要用到很多的功能,一个引脚的复用就是用这样的方式进行,这样可以省下许多引脚,提高利用率,但是这也意味着一个引脚上的多个功能是不能同时使用的,所以在引脚功能设置时要根据需求斟酌处理。不要浪费了一些重要的资源。

  同样,接下来是F5336时钟配置的代码,要了解代码书写的原因找UserGuide一看便知,里面的代码很多没有经过测试,不确定是正确的,所以大家斟酌使用,主要是了解时钟设置的原理和思路。以下是库函数:

  以下是主函数:

  时钟最好在一开始就设置好,例如我使用MSP430F5336做飞控,ACLK设置为32768HZ作为低频计数,MCLK设置为20M作为系统运行时钟,SMCLK为1.04Mhz用以设置波特率等参数,最后我的始终初始化代码如下:

  所以大家可以根据自己的需要处理时钟,其中DCOCLK的是时钟频率可以自己设置,范围很大,使用很灵活,我没有仔细讲,但是上面的代码都有相关函数,大家可以根据自己的需要利用起来。

  最后再讲一讲我对于低功耗的理解,工作模式有AM模式(活动模式),LPM0(低功耗模式0),LPM1(低功耗模式1)……,AM模式所有的始终资源都使用,低功耗模式禁止CPU和部分始终,所以有时候代码跑不出来,可以看看是不是选择了不同的低功耗模式造成的错误,例如你用串口通信波特率始终是SMCLK,但是进入了低功耗模式3(LPM3)是禁止了SMCLK的,这样程序当然有问题,低功耗模式在实际应用中能节省资源,减少功耗。是MSP430单片机的特色之一,可以根据需要选择使用。