MSP430 時(shí)鐘設(shè)置(六)
首先讓我們看一下msp430x20x2.h這個(gè)文件中的內(nèi)容,由于頭文件信息量很大這里就只簡單說明
和以上四個(gè)代碼有關(guān)的部分,其余請大家自行閱讀。
一、WDTCTL=WDTPW+WDTHOLD;//關(guān)閉看門狗定時(shí)器(例1、2、3、4)
頭文件中的相關(guān)說明如下:
/************************************************************
*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)
這個(gè)指令設(shè)置密碼(WDTPW)和停止位定時(shí)器(WDTHOLD),所有的WatchDog配置都需要在WDTPW的輔助下完成。
舉例如下:
A、間隔時(shí)間由Bit0-2位編碼:
1、看門狗的時(shí)鐘由FSMCLK(假設(shè)為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、看門狗的時(shí)鐘由FACLK(假設(shè)為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、看門狗模式——在過期時(shí)間后重啟:
1、看門狗的時(shí)鐘由FSMCLK(假設(shè)為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、看門狗的時(shí)鐘由FACLK(假設(shè)為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關(guān)閉(例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);//關(guān)閉DCO
__bis_SR_register()是在intrinsics.h這個(gè)頭文件中定義了,實(shí)現(xiàn)的功能是將SR中的位置零。
關(guān)于頭文件中的代碼作用
#ifdef__cplusplus
extern"C"
{
#endif
#ifdef__cplusplus
}
#endif/*extern"C"*/
一般用于將C++代碼以標(biāo)準(zhǔn)C形式輸出(即以C的形式被調(diào)用),這是因?yàn)镃++雖然常被認(rèn)為是C的超集,
但是C++的編譯器還是與C的編譯器不同的。C中調(diào)用C++中的代碼這樣定義會(huì)是安全的。
五、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;//設(shè)置值(例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*/
關(guān)于SFR_8BIT的相關(guān)說明:
Externalreferencesresolvedbyadevice-specificlinkercommandfile
(外部引用解決的特定于設(shè)備的連接器命令文件)
#defineSFR_8BIT(address)externvolatileunsignedcharaddress
#defineSFR_16BIT(address)externvolatileunsignedintaddress
七、if(CALBC1_1MHZ==0xFF||CALDCO_1MHZ==0xFF)
{
while(1);//Ifcalconsterased,掛起
}(例3、例4)
請注意這里的陷阱。它可以清除內(nèi)存段信息。
八、IFG1&=~OFIFG;//清除OSCFault標(biāo)志(例1、例4)
時(shí)鐘系統(tǒng)將強(qiáng)制使用的MCLK作為其源的DCO在一個(gè)時(shí)鐘故障的存在。因此,我們必須清除故障標(biāo)志。
FG1中斷標(biāo)志寄存器是1。寄存器中的位域是唯一的振蕩器故障中斷標(biāo)志-OFIFG。
九、while(IFG1&OFIFG)
{
IFG1&=~OFIFG;//清除OSCFault標(biāo)志
_delay_cycles(100000);//為可見標(biāo)志延時(shí)
}(例2、例3)
在上面的代碼我們把OSCFault標(biāo)志繼續(xù)做我們的任務(wù),由于時(shí)鐘系統(tǒng)將默認(rèn)為VLO。
現(xiàn)在,我們希望確保該標(biāo)志保持清零,這意味著晶體是啟動(dòng)并運(yùn)行著的。
如果該故障標(biāo)志是明確的,我們就退出循環(huán)。我們需要等待清算后的標(biāo)志,直到我們再次測試50微秒。
該_delay_cycles(100000)。我們需要它是那么長的時(shí)間,所以我們可以看到在代碼開頭的LED燈。
否則,它會(huì)這么快,我們的光將無法看到它。
評論