MSP430 时钟设置(六)
时间:11-11
来源:互联网
点击:
以下将会分析上面4个例子的代码细微差别:
首先让我们看一下msp430x20x2.h这个文件中的内容,由于头文件信息量很大这里就只简单说明
和以上四个代码有关的部分,其余请大家自行阅读。
一、WDTCTL=WDTPW+WDTHOLD;//关闭看门狗定时器(例1、2、3、4)
头文件中的相关说明如下:
/************************************************************
*WATCHDOGTIMER
************************************************************/
#define__MSP430_HAS_WDT__/*DefinitiontoshowthatModuleisavailable*/
SFR_16BIT(WDTCTL);/*WatchdogTimerControl*/
/*Thebitnameshavebeenprefixedwith"WDT"*/
#defineWDTIS0(0x0001)
#defineWDTIS1(0x0002)
#defineWDTSSEL(0x0004)
#defineWDTCNTCL(0x0008)
#defineWDTTMSEL(0x0010)
#defineWDTNMI(0x0020)
#defineWDTNMIES(0x0040)
#defineWDTHOLD(0x0080)
#defineWDTPW(0x5A00)
这个指令设置密码(WDTPW)和停止位定时器(WDTHOLD),所有的WatchDog配置都需要在WDTPW的辅助下完成。
举例如下:
A、间隔时间由Bit0-2位编码:
1、看门狗的时钟由FSMCLK(假设为1MHz)
#defineWDT_MDLY_32(WDTPW+WDTTMSEL+WDTCNTCL)/*32msinterval(default)*/
#defineWDT_MDLY_8(WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0)/*8ms"*/
#defineWDT_MDLY_0_5(WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1)/*0.5ms"*/
#defineWDT_MDLY_0_064(WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0)/*0.064ms"*/
2、看门狗的时钟由FACLK(假设为32KHz)
#defineWDT_ADLY_1000(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL)/*1000ms"*/
#defineWDT_ADLY_250(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0)/*250ms"*/
#defineWDT_ADLY_16(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1)/*16ms"*/
B、看门狗模式——在过期时间后重启:
1、看门狗的时钟由FSMCLK(假设为1MHz)
#defineWDT_MRST_32(WDTPW+WDTCNTCL)/*32msinterval(default)*/
#defineWDT_MRST_8(WDTPW+WDTCNTCL+WDTIS0)/*8ms"*/
#defineWDT_MRST_0_5(WDTPW+WDTCNTCL+WDTIS1)/*0.5ms"*/
#defineWDT_MRST_0_064(WDTPW+WDTCNTCL+WDTIS1+WDTIS0)/*0.064ms"*/
2、看门狗的时钟由FACLK(假设为32KHz)
#defineWDT_ARST_1000(WDTPW+WDTCNTCL+WDTSSEL)/*1000ms"*/
#defineWDT_ARST_250(WDTPW+WDTCNTCL+WDTSSEL+WDTIS0)/*250ms"*/
#defineWDT_ARST_16(WDTPW+WDTCNTCL+WDTSSEL+WDTIS1)/*16ms"*/
#defineWDT_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)
/************************************************************
*BasicClockModule
************************************************************/
#define__MSP430_HAS_BC2__
/*DefinitiontoshowthatModuleisavailable*/
SFR_8BIT(DCOCTL);/*DCOClockFrequencyControl*/
SFR_8BIT(BCSCTL1);/*BasicClockSystemControl1*/
SFR_8BIT(BCSCTL2);/*BasicClockSystemControl2*/
SFR_8BIT(BCSCTL3);/*BasicClockSystemControl3*/
#defineMOD0(0x01)/*ModulationBit0*/
#defineMOD1(0x02)/*ModulationBit1*/
#defineMOD2(0x04)/*ModulationBit2*/
#defineMOD3(0x08)/*ModulationBit3*/
#defineMOD4(0x10)/*ModulationBit4*/
#defineDCO0(0x20)/*DCOSelectBit0*/
#defineDCO1(0x40)/*DCOSelectBit1*/
#defineDCO2(0x80)/*DCOSelectBit2*/
#defineLFXT1OF(0x01)
/*Low/highFrequencyOscillatorFaultFlag*/
#defineXT2OF(0x02)
/*Highfrequencyoscillator2faultflag*/
#defineXCAP0(0x04)/*XIN/XOUTCap0*/
#defineXCAP1(0x08)/*XIN/XOUTCap1*/
#defineLFXT1S0(0x10)/*Mode0forLFXT1(XTS=0)*/
#defineLFXT1S1(0x20)/*Mode1forLFXT1(XTS=0)*/
#defineXT2S0(0x40)/*Mode0forXT2*/
#defineXT2S1(0x80)/*Mode1forXT2*/
#defineXCAP_0(0x00)/*XIN/XOUTCap:0pF*/
#defineXCAP_1(0x04)/*XIN/XOUTCap:6pF*/
#defineXCAP_2(0x08)/*XIN/XOUTCap:10pF*/
#defineXCAP_3(0x0C)/*XIN/XOUTCap:12.5pF*/
#defineLFXT1S_0(0x00)
/*Mode0forLFXT1:Normaloperation*/
#defineLFXT1S_1(0x10)/*Mode1forLFXT1:Reserved*/
#defineLFXT1S_2(0x20)/*Mode2forLFXT1:VLO*/
#defineLFXT1S_3(0x30)
/*Mode3forLFXT1:Digitalinputsignal*/
#defineXT2S_0(0x00)/*Mode0forXT2:0.4-1MHz*/
#defineXT2S_1(0x40)/*Mode1forXT2:1-4MHz*/
#defineXT2S_2(0x80)/*Mode2forXT2:2-16MHz*/
#defineXT2S_3(0xC0)
/*Mode3forXT2:Digitalinputsignal*/
四、__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中有如下定义:
#defineRSEL0(0x01)/*RangeSelectBit0*/
#defineRSEL1(0x02)/*RangeSelectBit1*/
#defineRSEL2(0x04)/*RangeSelectBit2*/
#defineRSEL3(0x08)/*RangeSelectBit3*/
#definedivA0(0x10)/*ACLKDivider0*/
#definedivA1(0x20)/*ACLKDivider1*/
#defineXTS(0x40)
/*LFXTCLK0:LowFreq./1:HighFreq.*/
#defineXT2OFF(0x80)/*EnableXT2CLK*/
#definedivA_0(0x00)/*ACLKDivider0:/1*/
#definedivA_1(0x10)/*ACLKDivider1:/2*/
#definedivA_2(0x20)/*ACLKDivider2:/4*/
#definedivA_3(0x30)/*ACLKDivider3:/8*/
#definedivS0(0x02)/*SMCLKDivider0*/
#definedivS1(0x04)/*SMCLKDivider1*/
#defineSELS(0x08)
/*SMCLKSourceSelect0:DCOCLK/1:XT2CLK/LFXTCLK*/
#definedivM0(0x10)/*MCLKDivider0*/
#definedivM1(0x20)/*MCLKDivider1*/
#defineSELM0(0x40)/*MCLKSourceSelect0*/
#defineSELM1(0x80)/*MCLKSourceSelect1*/
#definedivS_0(0x00)/*SMCLKDivider0:/1*/
#definedivS_1(0x02)/*SMCLKDivider1:/2*/
#definedivS_2(0x04)/*SMCLKDivider2:/4*/
#definedivS_3(0x06)/*SMCLKDivider3:/8*/
#definedivM_0(0x00)/*MCLKDivider0:/1*/
#definedivM_1(0x10)/*MCLKDivider1:/2*/
#definedivM_2(0x20)/*MCLKDivider2:/4*/
#definedivM_3(0x30)/*MCLKDivider3:/8*/
#defineSELM_0(0x00)/*MCLKSourceSelect0:DCOCLK*/
#defineSELM_1(0x40)/*MCLKSourceSelect1:DCOCLK*/
#defineSELM_2(0x80)
/*MCLKSourceSelect2:XT2CLK/LFXTCLK*/
#defineSELM_3(0xC0)
/*MCLKSourceSelect3:LFXTCLK*/
六、BCSCTL1=CALBC1_1MHZ;//设置值(例3、4)
#ifndef__DisableCalData
SFR_8BIT(CALDCO_16MHZ);/*DCOCTLCalibrationDatafor16MHz*/
SFR_8BIT(CALBC1_16MHZ);/*BCSCTL1CalibrationDatafor16MHz*/
SFR_8BIT(CALDCO_12MHZ);/*DCOCTLCalibrationDatafor12MHz*/
SFR_8BIT(CALBC1_12MHZ);/*BCSCTL1CalibrationDatafor12MHz*/
SFR_8BIT(CALDCO_8MHZ);/*DCOCTLCalibrationDatafor8MHz*/
SFR_8BIT(CALBC1_8MHZ);/*BCSCTL1CalibrationDatafor8MHz*/
SFR_8BIT(CALDCO_1MHZ);/*DCOCTLCalibrationDatafor1MHz*/
SFR_8BIT(CALBC1_1MHZ);/*BCSCTL1CalibrationDatafor1MHz*/
#endif/*#ifndef__DisableCalData*/
关于SFR_8BIT的相关说明:
Externalreferencesresolvedbyadevice-specificlinkercommandfile
(外部引用解决的特定于设备的连接器命令文件)
#defineSFR_8BIT(address)externvolatileunsignedcharaddress
#defineSFR_16BIT(address)externvolatileunsignedintaddress
七、if(CALBC1_1MHZ==0xFF||CALDCO_1MHZ==0xFF)
{
while(1);//Ifcalconsterased,挂起
}(例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)。我们需要它是那么长的时间,所以我们可以看到在代码开头的
首先让我们看一下msp430x20x2.h这个文件中的内容,由于头文件信息量很大这里就只简单说明
和以上四个代码有关的部分,其余请大家自行阅读。
一、WDTCTL=WDTPW+WDTHOLD;//关闭看门狗定时器(例1、2、3、4)
头文件中的相关说明如下:
/************************************************************
*WATCHDOGTIMER
************************************************************/
#define__MSP430_HAS_WDT__/*DefinitiontoshowthatModuleisavailable*/
SFR_16BIT(WDTCTL);/*WatchdogTimerControl*/
/*Thebitnameshavebeenprefixedwith"WDT"*/
#defineWDTIS0(0x0001)
#defineWDTIS1(0x0002)
#defineWDTSSEL(0x0004)
#defineWDTCNTCL(0x0008)
#defineWDTTMSEL(0x0010)
#defineWDTNMI(0x0020)
#defineWDTNMIES(0x0040)
#defineWDTHOLD(0x0080)
#defineWDTPW(0x5A00)
这个指令设置密码(WDTPW)和停止位定时器(WDTHOLD),所有的WatchDog配置都需要在WDTPW的辅助下完成。
举例如下:
A、间隔时间由Bit0-2位编码:
1、看门狗的时钟由FSMCLK(假设为1MHz)
#defineWDT_MDLY_32(WDTPW+WDTTMSEL+WDTCNTCL)/*32msinterval(default)*/
#defineWDT_MDLY_8(WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0)/*8ms"*/
#defineWDT_MDLY_0_5(WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1)/*0.5ms"*/
#defineWDT_MDLY_0_064(WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0)/*0.064ms"*/
2、看门狗的时钟由FACLK(假设为32KHz)
#defineWDT_ADLY_1000(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL)/*1000ms"*/
#defineWDT_ADLY_250(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0)/*250ms"*/
#defineWDT_ADLY_16(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1)/*16ms"*/
B、看门狗模式——在过期时间后重启:
1、看门狗的时钟由FSMCLK(假设为1MHz)
#defineWDT_MRST_32(WDTPW+WDTCNTCL)/*32msinterval(default)*/
#defineWDT_MRST_8(WDTPW+WDTCNTCL+WDTIS0)/*8ms"*/
#defineWDT_MRST_0_5(WDTPW+WDTCNTCL+WDTIS1)/*0.5ms"*/
#defineWDT_MRST_0_064(WDTPW+WDTCNTCL+WDTIS1+WDTIS0)/*0.064ms"*/
2、看门狗的时钟由FACLK(假设为32KHz)
#defineWDT_ARST_1000(WDTPW+WDTCNTCL+WDTSSEL)/*1000ms"*/
#defineWDT_ARST_250(WDTPW+WDTCNTCL+WDTSSEL+WDTIS0)/*250ms"*/
#defineWDT_ARST_16(WDTPW+WDTCNTCL+WDTSSEL+WDTIS1)/*16ms"*/
#defineWDT_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)
/************************************************************
*BasicClockModule
************************************************************/
#define__MSP430_HAS_BC2__
/*DefinitiontoshowthatModuleisavailable*/
SFR_8BIT(DCOCTL);/*DCOClockFrequencyControl*/
SFR_8BIT(BCSCTL1);/*BasicClockSystemControl1*/
SFR_8BIT(BCSCTL2);/*BasicClockSystemControl2*/
SFR_8BIT(BCSCTL3);/*BasicClockSystemControl3*/
#defineMOD0(0x01)/*ModulationBit0*/
#defineMOD1(0x02)/*ModulationBit1*/
#defineMOD2(0x04)/*ModulationBit2*/
#defineMOD3(0x08)/*ModulationBit3*/
#defineMOD4(0x10)/*ModulationBit4*/
#defineDCO0(0x20)/*DCOSelectBit0*/
#defineDCO1(0x40)/*DCOSelectBit1*/
#defineDCO2(0x80)/*DCOSelectBit2*/
#defineLFXT1OF(0x01)
/*Low/highFrequencyOscillatorFaultFlag*/
#defineXT2OF(0x02)
/*Highfrequencyoscillator2faultflag*/
#defineXCAP0(0x04)/*XIN/XOUTCap0*/
#defineXCAP1(0x08)/*XIN/XOUTCap1*/
#defineLFXT1S0(0x10)/*Mode0forLFXT1(XTS=0)*/
#defineLFXT1S1(0x20)/*Mode1forLFXT1(XTS=0)*/
#defineXT2S0(0x40)/*Mode0forXT2*/
#defineXT2S1(0x80)/*Mode1forXT2*/
#defineXCAP_0(0x00)/*XIN/XOUTCap:0pF*/
#defineXCAP_1(0x04)/*XIN/XOUTCap:6pF*/
#defineXCAP_2(0x08)/*XIN/XOUTCap:10pF*/
#defineXCAP_3(0x0C)/*XIN/XOUTCap:12.5pF*/
#defineLFXT1S_0(0x00)
/*Mode0forLFXT1:Normaloperation*/
#defineLFXT1S_1(0x10)/*Mode1forLFXT1:Reserved*/
#defineLFXT1S_2(0x20)/*Mode2forLFXT1:VLO*/
#defineLFXT1S_3(0x30)
/*Mode3forLFXT1:Digitalinputsignal*/
#defineXT2S_0(0x00)/*Mode0forXT2:0.4-1MHz*/
#defineXT2S_1(0x40)/*Mode1forXT2:1-4MHz*/
#defineXT2S_2(0x80)/*Mode2forXT2:2-16MHz*/
#defineXT2S_3(0xC0)
/*Mode3forXT2:Digitalinputsignal*/
四、__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中有如下定义:
#defineRSEL0(0x01)/*RangeSelectBit0*/
#defineRSEL1(0x02)/*RangeSelectBit1*/
#defineRSEL2(0x04)/*RangeSelectBit2*/
#defineRSEL3(0x08)/*RangeSelectBit3*/
#definedivA0(0x10)/*ACLKDivider0*/
#definedivA1(0x20)/*ACLKDivider1*/
#defineXTS(0x40)
/*LFXTCLK0:LowFreq./1:HighFreq.*/
#defineXT2OFF(0x80)/*EnableXT2CLK*/
#definedivA_0(0x00)/*ACLKDivider0:/1*/
#definedivA_1(0x10)/*ACLKDivider1:/2*/
#definedivA_2(0x20)/*ACLKDivider2:/4*/
#definedivA_3(0x30)/*ACLKDivider3:/8*/
#definedivS0(0x02)/*SMCLKDivider0*/
#definedivS1(0x04)/*SMCLKDivider1*/
#defineSELS(0x08)
/*SMCLKSourceSelect0:DCOCLK/1:XT2CLK/LFXTCLK*/
#definedivM0(0x10)/*MCLKDivider0*/
#definedivM1(0x20)/*MCLKDivider1*/
#defineSELM0(0x40)/*MCLKSourceSelect0*/
#defineSELM1(0x80)/*MCLKSourceSelect1*/
#definedivS_0(0x00)/*SMCLKDivider0:/1*/
#definedivS_1(0x02)/*SMCLKDivider1:/2*/
#definedivS_2(0x04)/*SMCLKDivider2:/4*/
#definedivS_3(0x06)/*SMCLKDivider3:/8*/
#definedivM_0(0x00)/*MCLKDivider0:/1*/
#definedivM_1(0x10)/*MCLKDivider1:/2*/
#definedivM_2(0x20)/*MCLKDivider2:/4*/
#definedivM_3(0x30)/*MCLKDivider3:/8*/
#defineSELM_0(0x00)/*MCLKSourceSelect0:DCOCLK*/
#defineSELM_1(0x40)/*MCLKSourceSelect1:DCOCLK*/
#defineSELM_2(0x80)
/*MCLKSourceSelect2:XT2CLK/LFXTCLK*/
#defineSELM_3(0xC0)
/*MCLKSourceSelect3:LFXTCLK*/
六、BCSCTL1=CALBC1_1MHZ;//设置值(例3、4)
#ifndef__DisableCalData
SFR_8BIT(CALDCO_16MHZ);/*DCOCTLCalibrationDatafor16MHz*/
SFR_8BIT(CALBC1_16MHZ);/*BCSCTL1CalibrationDatafor16MHz*/
SFR_8BIT(CALDCO_12MHZ);/*DCOCTLCalibrationDatafor12MHz*/
SFR_8BIT(CALBC1_12MHZ);/*BCSCTL1CalibrationDatafor12MHz*/
SFR_8BIT(CALDCO_8MHZ);/*DCOCTLCalibrationDatafor8MHz*/
SFR_8BIT(CALBC1_8MHZ);/*BCSCTL1CalibrationDatafor8MHz*/
SFR_8BIT(CALDCO_1MHZ);/*DCOCTLCalibrationDatafor1MHz*/
SFR_8BIT(CALBC1_1MHZ);/*BCSCTL1CalibrationDatafor1MHz*/
#endif/*#ifndef__DisableCalData*/
关于SFR_8BIT的相关说明:
Externalreferencesresolvedbyadevice-specificlinkercommandfile
(外部引用解决的特定于设备的连接器命令文件)
#defineSFR_8BIT(address)externvolatileunsignedcharaddress
#defineSFR_16BIT(address)externvolatileunsignedintaddress
七、if(CALBC1_1MHZ==0xFF||CALDCO_1MHZ==0xFF)
{
while(1);//Ifcalconsterased,挂起
}(例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)。我们需要它是那么长的时间,所以我们可以看到在代码开头的
MSP430时钟设置应用总 相关文章:
- MSP430时钟设置及应用总结(11-25)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)