[资料分享] MSP430G2553学习笔记之二

Jacktang   2017-6-28 21:06 楼主
(二),时钟系统
     1,msp430能做到超低功耗,合理的时钟模块是功不可没的。但是功能强大的时钟模块设置起来也相对复杂一些。
     2,msp430的时钟源有:
(1),外接低频晶振LFXT1CLK:低频模式接手表晶体32768Hz,高频模式450KHz~8MHz;
(2),外接高速晶振XT2CLK:8MHz;
(3),内部数字控制振荡器DCO:是一个可控的RC振荡器,频率在0~16MHz;
(4),超低功耗低频振荡器VLO:不可控,4~20KHz 典型值为12KHz;
     3,时钟模块:430的时钟模块有MCLK  SMCLK  ACLK :
(1),主系统时钟MCLK:提供给MSP430的CPU时钟。可以来自LFXT1CLK  XT2CLK  DCO  VLO可选,默认为DCO。
(2),子系统时钟SMCLK: 提供给高速外设。可以来自LFXT1CLK  XT2CLK  DCO  VLO可选,默认为DCO。
(3),辅助系统时钟ACLK:提供给低速外设。可来自LFXT1CLK  VLO。
     4,内部的振荡器DCO和VLO提供的时钟频率不是很精确,随外部环境变化较大。
DCO默认的频率大概为800KHz,但我用示波器观察的为1.086MHz左右,当DCO设置的过高时,用示波器可以看到波形不再是方波,而是类似于正弦波。DCO可以用CCS提供的宏定义进行相对比较精确的设置,如下:
DCOCTL = CALDCO_12MHZ;   //DCO设为12MHz   这种方法设DCO频率比较精确,实际测得为12.08MHz左右 正弦波
BCSCTL1 = CALBC1_12MHZ;
用这种方法可以设置1,8,12,16MHz
宏定义如下:
#ifndef __DisableCalData

SFR_8BIT(CALDCO_16MHZ);                       
SFR_8BIT(CALBC1_16MHZ);                       
SFR_8BIT(CALDCO_12MHZ);                       
SFR_8BIT(CALBC1_12MHZ);                       
SFR_8BIT(CALDCO_8MHZ);                        
SFR_8BIT(CALBC1_8MHZ);                        
SFR_8BIT(CALDCO_1MHZ);                        
SFR_8BIT(CALBC1_1MHZ);                        

#endif

5,使用超低功耗低频振荡器VLO可以很大程度地降低系统功耗,下面的例子是设置ACLK为VLO,MCLK为VLO的8分频:
#include  

//1延时
//#define CPU_F ((double)16000000)//cpu frequency16000000
#define CPU_F ((double)1630)//cpu frequency1630   //CPU的实际MCLK大约为13.05/8=1.63KHz
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))


void main(void)
{
  volatile unsigned int i;                  // Volatile to prevent removal
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer

  BCSCTL3 |= LFXT1S_2;                      // LFXT1 = VLO  低频时钟选择为VLO ACLK选为VLO

  IFG1 &= ~OFIFG;                           // Clear OSCFault flag  清除振荡器错误中断标志

  __bis_SR_register(SCG1 + SCG0);           // Stop DCO  SCG1禁止SMCLK  SCG0禁止DCO

  BCSCTL2 |= SELM_3 + DIVM_3;               // MCLK = LFXT1/8
  //因为前面已经选择了LFXT1 = VLO 所以MCLK选为VLO  8分频  所以CPU的MCLK大约为1.5KHz

  P1DIR = 0xFF;                             // All P1.x outputs
  P1OUT = 0;                                // All P1.x reset
  P2DIR = 0xFF;                             // All P2.x outputs
  P2OUT = 0;                                // All P2.x reset

  P1SEL |= BIT0+BIT4;                // P10 P14options  功能选择为外围模块
  //p10输出ACLK,来自VLO,p14输出SMCLK,  因为禁止了SMCLK,所以P14脚无波形输出
  //VLO典型值为12KHz  实际用示波器测得为:13.05KHz 左右波动
  //所以CPU的实际MCLK大约为13.05/8=1.63KHz


  for (;;)
  {
    P1OUT ^= BIT6;          // P1.6 闪烁
    delay_ms(1000);
  }
}

  6,如上面的程序所示,其中的延迟函数用那种方法,使用系统的延迟周期函数__delay_cycles(int n); 可以达到比较精确的延迟,如下:

//more_
//1延时
//#define CPU_F ((double)16000000)//cpu frequency16000000
#define CPU_F ((double)12000000)//cpu frequency12000000
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
//2空函数
#define nop() _NOP();

   7,系统上电后默认使用的是DCO时钟,DCO默认的频率大概为800KHz,但我用示波器观察的为1.086MHz左右,当DCO设置的过高时,用示波器可以看到波形不再是方波,而是类似于正弦波。

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复