您的位置 首页 FPGA

MSP430 时钟设置(六)

以下将会分析上面4个例子的代码细微差别:首先让我们看一下msp430x20x2.h这个文件中的内容,由于头文件信息量很大这里就只简单说明和以上四…

以下将会剖析上面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)。咱们需求它是那么长的时刻,所以咱们能够看到在代码最初的LED灯。
不然,它会这么快,咱们的光将无法看到它。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/fpga/275038.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部