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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 我學(xué)MSP430G2553的心得之一

          我學(xué)MSP430G2553的心得之一

          作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò) 收藏
          學(xué)習(xí)MSP430G2553,已有7天有余。個(gè)人覺(jué)著:低功耗是其最大亮點(diǎn)。為此可謂是處心積慮。因而中斷/低功耗模式在430的應(yīng)用中便顯得千嬌百媚,楚楚動(dòng)人!這里,先跟大伙看下這個(gè)中斷的情況。
          #include<msp430g2553.h>
          #include"in430.h"
          intmain(void)
          {
          WDTCTL=WDTPW+WDTHOLD;//禁止看門狗計(jì)數(shù)
          P1DIR=BIT0+BIT1;//P1.01設(shè)置為輸出,P1.4/5是輸入
          P1OUT=BIT0+BIT1+BIT4+BIT5;//P1.01為高,P.4/5上拉
          P1REN=BIT4+BIT5;//P1.4上拉使能
          P1IE=BIT4+BIT5;//P1.4開(kāi)中斷
          P1IES=BIT4+BIT5;//中斷沿選擇
          __enable_interrupt();//開(kāi)總中斷
          while(1);//沒(méi)事做
          }
          #pragmavector=PORT1_VECTOR
          __interruptvoidPORT1()//P1口中斷服務(wù)程序
          {
          unsignedinti=0;
          unsignedcharPushKey=0;
          PushKey=P1IFG&(BIT4+BIT5);//讀取是哪個(gè)鍵按下
          for(i=0;i<65535;i++);//延時(shí)后再作判斷,避免是抖動(dòng)
          if(!(P1IN&PushKey))//沒(méi)有按下,則為抖動(dòng),標(biāo)志清零
          P1IFG=0;
          if((P1IN&PushKey))//判斷是否有鍵按下
          {
          for(i=0;i<65535;i++);
          if((P1IN&PushKey))
          {
          if((PushKey&BIT4))
          P1OUT^=BIT0;
          if((PushKey&BIT5))
          P1OUT^=BIT1;
          }
          P1IFG&=~(BIT4+BIT5);
          }
          }
          這個(gè)程序,最出彩的地方在于“while(1);”這個(gè)等待的語(yǔ)句。
          中斷沒(méi)發(fā)生前,程序在停這兒等待,就相當(dāng)于CPU一直停在兒沒(méi)事做歇著,也許是在等待戈多。一旦中斷條件發(fā)生,在這里是按鍵,它便好像逮著什么似的,便進(jìn)入中斷,去執(zhí)行中斷程序中的代碼。
          這里,我們可見(jiàn)。中斷沒(méi)來(lái)之前,CPU它無(wú)所事事,卻沒(méi)有關(guān)閉,仍在耗電。中斷來(lái)了之后,它趕忙地處理中斷程序。前前后后,他總在折騰??隙ɡ鄣脡驊?。
          那CPU在哪段時(shí)間內(nèi)本可好好休息,不必浪費(fèi)精力呢???大伙都知道,肯定是等待戈多那個(gè)時(shí)間里。所以便會(huì)讓它在等待戈多的時(shí)間里去休眠。中斷來(lái)了確實(shí)需它出面處理時(shí),它再醒來(lái)處理中斷事件,更為妥當(dāng)?。?!
          于是乎,便有了下面的程序。
          #include
          #define uchar unsigned char
          uchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
          uchar i,num,flag;
          void TimeAInit(void)
          {
          TACTL=TASSEL0+MC0+TACLR;//SMCL時(shí)鐘,up,清零
          TACCTL0|=CCIE;
          }
          void SetTime(unsigned int time)
          {
          TACCR0=time;
          }
          int main(void)
          {
          WDTCTL=WDTPW+WDTHOLD;
          P1DIR=0xff;
          TimeAInit();
          SetTime(100);
          __enable_interrupt();
          while(1)
          {
          LPM3;
          if(flag==0)
          {
          i++;
          if(i==10)
          {
          i=0;
          P1OUT^=table[num++];
          P1OUT=table[num];
          }
          if(num==8)
          flag=1;
          }
          if(flag==1)
          {
          i++;
          if(i==10)
          {
          i=0;
          P1OUT^=table[num--];
          P1OUT=table[num];
          }
          if(num==0)
          flag=0;
          }
          }
          }
          #pragma vector=TIMER0_A0_VECTOR//只是喚醒
          __interrupt void Timer(void)
          {
          LPM3_EXIT;
          }
          這里最大與上面最大的不同就是,用LPM3;替代了上面的While(1);這樣一來(lái),在中斷沒(méi)來(lái)之前,CPU不再作無(wú)謂的等待而耗電,而是處在休眠狀態(tài)里。中斷發(fā)生后,CPU便會(huì)自動(dòng)喚醒,進(jìn)入中斷去處理中斷程序。實(shí)現(xiàn)了低功耗的目的。
          這里的低耗模式的實(shí)現(xiàn)是這樣的,中斷程序中是喚醒CPU,而后進(jìn)入主程序,執(zhí)行相應(yīng)的功能模塊。相應(yīng)的功能模塊,全在主程序中。
          這便是所謂的中斷中只用喚醒用。我們可以采用另一種方式,主程序中斷只用休眠用。且看下面程序。
          #include
          #define uchar unsigned char
          uchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
          uchar i,num,flag;
          int main(void)
          {
          WDTCTL=WDTPW+WDTHOLD;//關(guān)閉看門狗
          TACTL=TASSEL1+MC1+TACLR;//定時(shí)器時(shí)鐘源為SMCLK,up,不分頻,清零
          CCTL0|=CCIE;//使能比較器中斷
          CCR0=50000;//計(jì)數(shù)器終值
          P1DIR=0xff;//P1輸出口
          __enable_interrupt();//使能全局中斷,C編譯器中的內(nèi)部函數(shù)
          LPM3;
          }
          #pragma vector=TIMER0_A0_VECTOR
          __interrupt void Timer(void)
          {
          if(flag==0)
          {
          i++;
          if(i==10)//定時(shí)0.5s
          {
          i=0;
          P1OUT^=table[num++];
          P1OUT=table[num];
          }
          if(num==8)
          flag=1;
          }
          if(flag==1)
          {
          i++;
          if(i==10)//定時(shí)0.5s
          {
          i=0;
          P1OUT^=table[num--];
          P1OUT=table[num];
          }
          if(num==0)
          flag=0;
          }
          }
          這里,主程序中只用休眠,一旦中斷條件發(fā)生,則進(jìn)入中斷,而進(jìn)入中斷后,CPU便自動(dòng)喚醒。因?yàn)橐幚碇袛喾?wù)程序。不過(guò),中斷完了之后,會(huì)恢復(fù)到中斷前的狀態(tài),在這里便又回到了休眠狀態(tài)。
          休眠的寫法中,有一個(gè)點(diǎn)要注意。若主函數(shù)中只作休眠,則中斷函數(shù)中不必寫喚醒的語(yǔ)句;若中斷中只作喚醒,則主函數(shù)中休眠+待執(zhí)行語(yǔ)句,要用循環(huán)。
          相信通過(guò)這里的講解,大伙已明白低功耗和中斷的關(guān)系了吧。明白了中斷為什么在430中猶為重要了吧。


          關(guān)鍵詞: MSP430G2553心

          評(píng)論


          技術(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); })();