在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

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

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

            作者: 時間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
            學(xué)習(xí)MSP430G2553,已有7天有余。個人覺著:低功耗是其最大亮點。為此可謂是處心積慮。因而中斷/低功耗模式在430的應(yīng)用中便顯得千嬌百媚,楚楚動人!這里,先跟大伙看下這個中斷的情況。
            #include<msp430g2553.h>
            #include"in430.h"
            intmain(void)
            {
            WDTCTL=WDTPW+WDTHOLD;//禁止看門狗計數(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開中斷
            P1IES=BIT4+BIT5;//中斷沿選擇
            __enable_interrupt();//開總中斷
            while(1);//沒事做
            }
            #pragmavector=PORT1_VECTOR
            __interruptvoidPORT1()//P1口中斷服務(wù)程序
            {
            unsignedinti=0;
            unsignedcharPushKey=0;
            PushKey=P1IFG&(BIT4+BIT5);//讀取是哪個鍵按下
            for(i=0;i<65535;i++);//延時后再作判斷,避免是抖動
            if(!(P1IN&PushKey))//沒有按下,則為抖動,標(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);
            }
            }
            這個程序,最出彩的地方在于“while(1);”這個等待的語句。
            中斷沒發(fā)生前,程序在停這兒等待,就相當(dāng)于CPU一直停在兒沒事做歇著,也許是在等待戈多。一旦中斷條件發(fā)生,在這里是按鍵,它便好像逮著什么似的,便進入中斷,去執(zhí)行中斷程序中的代碼。
            這里,我們可見。中斷沒來之前,CPU它無所事事,卻沒有關(guān)閉,仍在耗電。中斷來了之后,它趕忙地處理中斷程序。前前后后,他總在折騰??隙ɡ鄣脡驊辍?br />那CPU在哪段時間內(nè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時鐘,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);這樣一來,在中斷沒來之前,CPU不再作無謂的等待而耗電,而是處在休眠狀態(tài)里。中斷發(fā)生后,CPU便會自動喚醒,進入中斷去處理中斷程序。實現(xiàn)了低功耗的目的。
            這里的低耗模式的實現(xiàn)是這樣的,中斷程序中是喚醒CPU,而后進入主程序,執(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;//定時器時鐘源為SMCLK,up,不分頻,清零
            CCTL0|=CCIE;//使能比較器中斷
            CCR0=50000;//計數(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)//定時0.5s
            {
            i=0;
            P1OUT^=table[num++];
            P1OUT=table[num];
            }
            if(num==8)
            flag=1;
            }
            if(flag==1)
            {
            i++;
            if(i==10)//定時0.5s
            {
            i=0;
            P1OUT^=table[num--];
            P1OUT=table[num];
            }
            if(num==0)
            flag=0;
            }
            }
            這里,主程序中只用休眠,一旦中斷條件發(fā)生,則進入中斷,而進入中斷后,CPU便自動喚醒。因為要處理中斷服務(wù)程序。不過,中斷完了之后,會恢復(fù)到中斷前的狀態(tài),在這里便又回到了休眠狀態(tài)。
            休眠的寫法中,有一個點要注意。若主函數(shù)中只作休眠,則中斷函數(shù)中不必寫喚醒的語句;若中斷中只作喚醒,則主函數(shù)中休眠+待執(zhí)行語句,要用循環(huán)。
            相信通過這里的講解,大伙已明白低功耗和中斷的關(guān)系了吧。明白了中斷為什么在430中猶為重要了吧。


            關(guān)鍵詞: MSP430G2553心

            評論


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

            關(guān)閉