关于设计,生活和电子的二三事

走进MSP430(3)——MSP430x2系列时钟部分

对于所有系统,运行速度越快耗电量越大,因此在不需要高速运行时候降低速度可以节约电量。MSP430低功耗的关键便是其时钟部分,通过多种工作模式和灵活的时钟配置使得MSP430能够在需要时候快速唤醒,在平时进入低功耗模式,从而降低平均电流消耗。
首先看一下MSP430时钟架构图。在MSP430x2系列数据手册中的名称是Basic Clock Module+,在MSP430x5系列中名称是Unified Clock System。

MSP430x2系列(包括MSP430G2)有3个或4个时钟源,分别是图上VLOCLK,LFXT1CLK,XT2CLK和DCOCLK。其中XT2CLK只在部分型号中有(所有G2系列都没有XT2CLK),时钟总线有3个(所有MSP430系列都一样),是上图右侧ACLK,MCLK,SMCLK。其中MCLK共给CPU运算部分使用,外设部分可选择SMCLK或ACLK。左边为控制各时钟源运行的寄存器,右侧为时钟总线选择时钟源和控制时钟分频的寄存器。
DCOCLK为MSP430内部集成的振荡器,在G2553上可提供最高16MHz的频率,足够大多数程序使用。LFXT1CLK是外部低频振荡器提供的时钟,时钟频率就是晶振频率,在G2系列只支持低频晶振,可以使用32.768KHz晶振,在F2系列上可以使用低频或高频晶振。VLOCLK是内部集成的低频晶振,频率一般为12KHz,一直保持开启状态,可随时切换至VLOCLK,其他两个时钟源需先开启才能切换。
在上电后,系统MCLK和SMCLK被配置为从DCOCLK输入,DCOCLK频率约为1.1MHz。调节DCOCLK频率通过改变RSEL和DCO寄存器值实现。RSEL有16个可选值,DCO有8个可选值,RSEL,DCO和DCO频率关系如下图:

通过改变RSEL和DCO组合即可确定DCO频率。对于G2系列,实现起来相当简单。因为上电后默认SMCLK和MCLK时钟源为DCOCLK,并且在芯片出厂时已经写入对应频率的RSEL和DCO配置值,只需调用即可。

   DCOCTL = 0;                               // Select lowest DCOx and MODx settings
   BCSCTL1 = CALBC1_16MHZ;                   // Set range
   DCOCTL = CALDCO_16MHZ;                    // Set DCO step + modulation


这是TI给出的调节DCO频率到16MHz的程序,其中CALBC1_16MHZ和CALDCO_16MHZ是头文件定义好的,只需调用即可。
DCO还有一个特性,就是频率调制(Modulation),就是将输出频率在设定的DCO频率和相邻的较高的DCO频率之间切换,调制图形见下图。这样的好处是可以分散时钟频谱,降低发射出去的时钟信号功率,减少由于时钟对其他芯片和设备产生的干扰。这个功能一般不需要特别关注,使用默认值就行。

LFXT1CLK的配置也很简单,只需配置LFXT1Sx=00即可启用低频晶振XT1,同时将ACLK选择为使用LFXT1。如果没有加外部晶振电容,可以使用内部晶振电容,电容容量可以使用XCAPx寄存器选择。
ACLK只能从VLO和LFXT1中选择之一,配置LFXT1SEL同时就选择好了ACLK的时钟源。
MCLK可以从LFXT1CLK/VLOCLK,DCOCLK,XT2CLK中选择。配置SELMx寄存器可以选择MCLK时钟源。
SMCLK可以从DCOCLK,LFXT1CLK/VLOCLK/XT2CLK中选择,配置SELSx寄存器可以选择SMCLK时钟。
DIVAx,DIVMx,DIVSx三个寄存器用来配置时钟预分频,即将实际输出时钟降低为选择的时钟源频率的1/1(相当于不降低),1/2,1/4,1/8。
在CCS的MSP430Ware中有个例程是演示DCOCLK时钟配置的,例程名字是msp430g2xx3_dco_calib,按上一节方法打开,然后编译运行。需要板子上焊上附带的32.768KHz晶振,并将晶振旁边的R28、R29去掉。焊好的板子如图所示。

注意芯片右边的晶振,R28、R29已经去掉。运行上面的程序,在LAUNCHPAD的P1.0,P1.1和P1.4引脚会输出ACLK,MCLK/10, SMCLK时钟信号,可以用示波器观察。部分程序如下:


//1Mhz
  if (CALBC1_1MHZ==0xFF)                    // If calibration constant erased<br>
  {                                            <br>
    while(1);                               // do not load, trap CPU!!    <br>
  } <br>
  DCOCTL = 0;                               // Select lowest DCOx and MODx settings<br>
  BCSCTL1 = CALBC1_1MHZ;                    // Set range<br>
  DCOCTL = CALDCO_1MHZ;                     // Set DCO step + modulation */

/* //8Mhz
  if (CALBC1_8MHZ==0xFF)                    // If calibration constant erased<br>
  {                                            <br>
    while(1);                               // do not load, trap CPU!!    <br>
  }<br>
  DCOCTL = 0;                               // Select lowest DCOx and MODx settings<br>
  BCSCTL1 = CALBC1_8MHZ;                    // Set range<br>
  DCOCTL = CALDCO_8MHZ;                     // Set DCO step + modulation */

将程序中从“//1Mhz”开始到“/* //8Mhz”之前的部分注释掉,编译下载,然后观察时钟信号频率,能看到SMCLK时钟频率由约1MHz变为约8MHz,ACLK时钟没有变化。尝试自己改写DCO和RSEL寄存器,观察时钟频率变化。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据