<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

          作者: 時(shí)間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
          以下將會(huì)分析上面4個(gè)例子的代碼細(xì)微差別:
          首先讓我們看一下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ì)這么快,我們的光將無法看到它。


          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();