新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > MSP430 時鐘設(shè)置(六)

        MSP430 時鐘設(shè)置(六)

        作者: 時間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
        以下將會分析上面4個例子的代碼細(xì)微差別:
        首先讓我們看一下msp430x20x2.h這個文件中的內(nèi)容,由于頭文件信息量很大這里就只簡單說明
        和以上四個代碼有關(guān)的部分,其余請大家自行閱讀。

        一、WDTCTL=WDTPW+WDTHOLD;//關(guān)閉看門狗定時器(例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)
        這個指令設(shè)置密碼(WDTPW)和停止位定時器(WDTHOLD),所有的WatchDog配置都需要在WDTPW的輔助下完成。
        舉例如下:
        A、間隔時間由Bit0-2位編碼:
        1、看門狗的時鐘由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、看門狗的時鐘由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、看門狗模式——在過期時間后重啟:
        1、看門狗的時鐘由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、看門狗的時鐘由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這個頭文件中定義了,實(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++中的代碼這樣定義會是安全的。

        五、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)
        時鐘系統(tǒng)將強(qiáng)制使用的MCLK作為其源的DCO在一個時鐘故障的存在。因此,我們必須清除故障標(biāo)志。
        FG1中斷標(biāo)志寄存器是1。寄存器中的位域是唯一的振蕩器故障中斷標(biāo)志-OFIFG。

        九、while(IFG1&OFIFG)
        {
        IFG1&=~OFIFG;//清除OSCFault標(biāo)志
        _delay_cycles(100000);//為可見標(biāo)志延時
        }(例2、例3)
        在上面的代碼我們把OSCFault標(biāo)志繼續(xù)做我們的任務(wù),由于時鐘系統(tǒng)將默認(rèn)為VLO。
        現(xiàn)在,我們希望確保該標(biāo)志保持清零,這意味著晶體是啟動并運(yùn)行著的。
        如果該故障標(biāo)志是明確的,我們就退出循環(huán)。我們需要等待清算后的標(biāo)志,直到我們再次測試50微秒。
        該_delay_cycles(100000)。我們需要它是那么長的時間,所以我們可以看到在代碼開頭的LED燈。
        否則,它會這么快,我們的光將無法看到它。


        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 大同市| 赞皇县| 怀柔区| 博爱县| 长治县| 通州市| 云林县| 泰州市| 会宁县| 通河县| 新巴尔虎左旗| 台中市| 建阳市| 安远县| 宁化县| 呈贡县| 丰顺县| 汝南县| 莒南县| 修水县| 霍邱县| 阿鲁科尔沁旗| 依安县| 灵寿县| 金堂县| 如东县| 玉林市| 苗栗县| 罗甸县| 台东市| 建宁县| 察隅县| 长乐市| 十堰市| 彝良县| 和田县| 博客| 航空| 墨脱县| 白水县| 巧家县|