注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小哲

从今以后,你会是所有幸福的理由!

 
 
 

日志

 
 

MSP430 时钟设置(六)  

2012-03-11 21:27:40|  分类: MSP430 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 
 
以下将会分析上面4个例子的代码细微差别: 
首先让我们看一下msp430x20x2.h这个文件中的内容,由于头文件信息量很大这里就只简单说明 
和以上四个代码有关的部分,其余请大家自行阅读。 
 
一、WDTCTL = WDTPW + WDTHOLD;                // 关闭看门狗定时器(例1、2、3、4) 
头文件中的相关说明如下: 
/************************************************************ 
* WATCHDOG TIMER 
************************************************************/ 
#define __MSP430_HAS_WDT__      /* Definition to show that Module is available */ 
SFR_16BIT(WDTCTL);                /* Watchdog Timer Control */ 
/* The bit names have been prefixed with "WDT" */ 
#define WDTIS0                 (0x0001
#define WDTIS1                 (0x0002
#define WDTSSEL                (0x0004
#define WDTCNTCL              (0x0008
#define WDTTMSEL               (0x0010
#define WDTNMI                 (0x0020
#define WDTNMIES               (0x0040
#define WDTHOLD                (0x0080
#define WDTPW                  (0x5A00
这个指令设置密码(WDTPW)和停止位定时器(WDTHOLD),所有的WatchDog配置都需要在WDTPW的辅助下完成。 
举例如下: 
A、间隔时间由Bit0 - 2位编码: 
1、看门狗的时钟由FSMCLK(假设为1MHz) 
#define WDT_MDLY_32         (WDTPW+WDTTMSEL+WDTCNTCL)                         /* 32ms interval (default) */ 
#define WDT_MDLY_8          (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0)                  /* 8ms     " */ 
#define WDT_MDLY_0_5        (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1)                  /* 0.5ms   " */ 
#define WDT_MDLY_0_064      (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0)           /* 0.064ms " */ 
 
2、看门狗的时钟由FACLK(假设为32KHz) 
#define WDT_ADLY_1000       (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL)                 /* 1000ms " */ 
#define WDT_ADLY_250        (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0)          /* 250ms   " */ 
#define WDT_ADLY_16         (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1)          /* 16ms    " */ 
 
B、看门狗模式——在过期时间后重启: 
1、看门狗的时钟由FSMCLK(假设为1MHz) 
#define WDT_MRST_32         (WDTPW+WDTCNTCL)                                  /* 32ms interval (default) */ 
#define WDT_MRST_8          (WDTPW+WDTCNTCL+WDTIS0)                           /* 8ms     " */ 
#define WDT_MRST_0_5        (WDTPW+WDTCNTCL+WDTIS1)                           /* 0.5ms   " */ 
#define WDT_MRST_0_064      (WDTPW+WDTCNTCL+WDTIS1+WDTIS0)                    /* 0.064ms " */ 
 
2、看门狗的时钟由FACLK(假设为32KHz) 
#define WDT_ARST_1000       (WDTPW+WDTCNTCL+WDTSSEL)                          /* 1000ms " */ 
#define WDT_ARST_250        (WDTPW+WDTCNTCL+WDTSSEL+WDTIS0)                   /* 250ms   " */ 
#define WDT_ARST_16         (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1)                   /* 16ms    " */ 
#define WDT_ARST_1_9        (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0)            /* 1.9ms   " */ 
 
二、P1DIR = 0x40;                               // P1.6 配置输出 
P1OUT = 0;                                 // P1关闭      (例1、2、3、4) 
其中DIR 和P1OUT分别配置IO口的方向和输出值,这里不在赘述,请参考手册。 
 
三、BCSCTL3 |= LFXT1S_2;                   // LFXT1 = VLO       (例1和例4) 
BCSCTL3 |= LFXT1S_0;                   // LFXT1 = 32768Hz    (例2和例3) 
/************************************************************ 
* Basic Clock Module 
************************************************************/ 
#define __MSP430_HAS_BC2__ 
/* Definition to show that Module is available */ 
 
SFR_8BIT(DCOCTL);                         /* DCO Clock Frequency Control */ 
SFR_8BIT(BCSCTL1);                        /* Basic Clock System Control 1 */ 
SFR_8BIT(BCSCTL2);                        /* Basic Clock System Control 2 */ 
SFR_8BIT(BCSCTL3);                        /* Basic Clock System Control 3 */ 
 
#define MOD0                   (0x01)         /* Modulation Bit 0 */ 
#define MOD1                   (0x02)         /* Modulation Bit 1 */ 
#define MOD2                   (0x04)         /* Modulation Bit 2 */ 
#define MOD3                   (0x08)         /* Modulation Bit 3 */ 
#define MOD4                   (0x10)         /* Modulation Bit 4 */ 
#define DCO0                   (0x20)         /* DCO Select Bit 0 */ 
#define DCO1                   (0x40)         /* DCO Select Bit 1 */ 
#define DCO2                   (0x80)         /* DCO Select Bit 2 */ 
 
#define LFXT1OF                (0x01
/* Low/high Frequency Oscillator Fault Flag */ 
#define XT2OF                  (0x02
/* High frequency oscillator 2 fault flag */ 
#define XCAP0                  (0x04)       /* XIN/XOUT Cap 0 */ 
#define XCAP1                  (0x08)       /* XIN/XOUT Cap 1 */ 
#define LFXT1S0                (0x10)       /* Mode 0 for LFXT1 (XTS = 0) */ 
#define LFXT1S1                (0x20)       /* Mode 1 for LFXT1 (XTS = 0) */ 
#define XT2S0                  (0x40)       /* Mode 0 for XT2 */ 
#define XT2S1                  (0x80)       /* Mode 1 for XT2 */ 
 
#define XCAP_0                 (0x00)         /* XIN/XOUT Cap : 0 pF */ 
#define XCAP_1                 (0x04)         /* XIN/XOUT Cap : 6 pF */ 
#define XCAP_2                 (0x08)         /* XIN/XOUT Cap : 10 pF */ 
#define XCAP_3                 (0x0C)         /* XIN/XOUT Cap : 12.5 pF */ 
 
#define LFXT1S_0               (0x00
/* Mode 0 for LFXT1 : Normal operation */ 
#define LFXT1S_1               (0x10)     /* Mode 1 for LFXT1 : Reserved */ 
#define LFXT1S_2               (0x20)     /* Mode 2 for LFXT1 : VLO */ 
#define LFXT1S_3               (0x30
/* Mode 3 for LFXT1 : Digital input signal */ 
 
#define XT2S_0                 (0x00)    /* Mode 0 for XT2 : 0.4 - 1 MHz */ 
#define XT2S_1                 (0x40)    /* Mode 1 for XT2 : 1 - 4 MHz */ 
#define XT2S_2                 (0x80)    /* Mode 2 for XT2 : 2 - 16 MHz */ 
#define XT2S_3                 (0xC0
/* Mode 3 for XT2 : Digital input signal */ 
 
四、__bis_SR_register(SCG1 + SCG0);          // 关闭 DCO 
 
__bis_SR_register()是在intrinsics.h这个头文件中定义了,实现的功能是将SR中的位置零。 
关于头文件中的代码作用 
#ifdef __cplusplus 
extern "C" 

#endif 
#ifdef __cplusplus 

#endif /* extern "C" */ 
一般用于将C++代码以标准C形式输出(即以C的形式被调用),这是因为C++虽然常被认为是C的超集, 
但是C++的编译器还是与C的编译器不同的。C中调用C++中的代码这样定义会是安全的。 
 
五、BCSCTL2 |= SELM_3 + DIVM_3;           // MCLK = VLO/8 
BCSCTL2 |= SELM_3 + DIVM_3;           // MCLK = 32768/8 
BCSCTL2 |= SELM_0 + DIVM_3;          // MCLK = DCO 
BCSCTL2 |= SELM_0 + DIVM_3;          // MCLK = DCO/8 
MSP430中有如下定义: 
#define RSEL0                  (0x01)         /* Range Select Bit 0 */ 
#define RSEL1                  (0x02)         /* Range Select Bit 1 */ 
#define RSEL2                  (0x04)         /* Range Select Bit 2 */ 
#define RSEL3                  (0x08)         /* Range Select Bit 3 */ 
#define DIVA0                  (0x10)         /* ACLK Divider 0 */ 
#define DIVA1                  (0x20)         /* ACLK Divider 1 */ 
#define XTS                    (0x40
/* LFXTCLK 0:Low Freq. / 1: High Freq. */ 
#define XT2OFF                 (0x80)         /* Enable XT2CLK */ 
 
#define DIVA_0                 (0x00)         /* ACLK Divider 0: /1 */ 
#define DIVA_1                 (0x10)         /* ACLK Divider 1: /2 */ 
#define DIVA_2                 (0x20)         /* ACLK Divider 2: /4 */ 
#define DIVA_3                 (0x30)         /* ACLK Divider 3: /8 */ 
 
#define DIVS0                  (0x02)         /* SMCLK Divider 0 */ 
#define DIVS1                  (0x04)         /* SMCLK Divider 1 */ 
#define SELS                   (0x08
/* SMCLK Source Select 0:DCOCLK / 1:XT2CLK/LFXTCLK */ 
#define DIVM0                  (0x10)         /* MCLK Divider 0 */ 
#define DIVM1                  (0x20)         /* MCLK Divider 1 */ 
#define SELM0                  (0x40)         /* MCLK Source Select 0 */ 
#define SELM1                  (0x80)         /* MCLK Source Select 1 */ 
 
#define DIVS_0                 (0x00)         /* SMCLK Divider 0: /1 */ 
#define DIVS_1                 (0x02)         /* SMCLK Divider 1: /2 */ 
#define DIVS_2                 (0x04)         /* SMCLK Divider 2: /4 */ 
#define DIVS_3                 (0x06)         /* SMCLK Divider 3: /8 */ 
 
#define DIVM_0                 (0x00)         /* MCLK Divider 0: /1 */ 
#define DIVM_1                 (0x10)         /* MCLK Divider 1: /2 */ 
#define DIVM_2                 (0x20)         /* MCLK Divider 2: /4 */ 
#define DIVM_3                 (0x30)         /* MCLK Divider 3: /8 */ 
 
#define SELM_0                 (0x00)    /* MCLK Source Select 0: DCOCLK */ 
#define SELM_1                 (0x40)    /* MCLK Source Select 1: DCOCLK */ 
#define SELM_2                 (0x80
/* MCLK Source Select 2: XT2CLK/LFXTCLK */ 
#define SELM_3                 (0xC0
/* MCLK Source Select 3: LFXTCLK */ 
 
六、BCSCTL1 = CALBC1_1MHZ;                //设置值     (例3、4) 
#ifndef __DisableCalData 
SFR_8BIT(CALDCO_16MHZ);          /* DCOCTL Calibration Data for 16MHz */ 
SFR_8BIT(CALBC1_16MHZ);          /* BCSCTL1 Calibration Data for 16MHz */ 
SFR_8BIT(CALDCO_12MHZ);          /* DCOCTL Calibration Data for 12MHz */ 
SFR_8BIT(CALBC1_12MHZ);          /* BCSCTL1 Calibration Data for 12MHz */ 
SFR_8BIT(CALDCO_8MHZ);           /* DCOCTL Calibration Data for 8MHz */ 
SFR_8BIT(CALBC1_8MHZ);           /* BCSCTL1 Calibration Data for 8MHz */ 
SFR_8BIT(CALDCO_1MHZ);           /* DCOCTL Calibration Data for 1MHz */ 
SFR_8BIT(CALBC1_1MHZ);           /* BCSCTL1 Calibration Data for 1MHz */ 
#endif                              /* #ifndef __DisableCalData */ 
 
关于SFR_8BIT的相关说明: 
External references resolved by a device - specific linker command file 
(外部引用解决的特定于设备的连接器命令文件) 
#define SFR_8BIT(address)   extern volatile unsigned char address 
#define SFR_16BIT(address) extern volatile unsigned int address 
 
七、if (CALBC1_1MHZ == 0xFF || CALDCO_1MHZ == 0xFF

    while(1);                            // If cal const erased,挂起 
}                                     (例3、例4
请注意这里的陷阱。它可以清除内存段信息。 
 
八、IFG1 &= ~OFIFG;                       // 清除OSCFault 标志   (例1、例4) 
时钟系统将强制使用的MCLK作为其源的DCO在一个时钟故障的存在。因此,我们必须清除故障标志。 
FG1中断标志寄存器是1。寄存器中的位域是唯一的振荡器故障中断标志 - OFIFG。 
 
九、while(IFG1 &OFIFG) 

    IFG1 &= ~OFIFG;                       // 清除OSCFault 标志 
    _delay_cycles(100000);                 // 为可见标志延时 
}                                    (例2、例3
在上面的代码我们把OSCFault标志继续做我们的任务,由于时钟系统将默认为VLO。 
现在,我们希望确保该标志保持清零,这意味着晶体是启动并运行着的。 
如果该故障标志是明确的,我们就退出循环。我们需要等待清算后的标志,直到我们再次测试50微秒。 
该_delay_cycles(100000)。我们需要它是那么长的时间,所以我们可以看到在代码开头的LED灯。 
否则,它会这么快,我们的光将无法看到它。 
 
 
 
 
  评论这张
 
阅读(596)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017