我學(xué)MSP430G2553的心得之一
#include<msp430g2553.h>
#include
int
{
}
#pragma
__interrupt
{
}
這個(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)了之后,它趕忙地處理中斷程序。前前后后,他總在折騰??隙ɡ鄣脡驊辍?br />那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)
{
}
void SetTime(unsigned int time)
{
}
int main(void)
{
}
#pragma vector=TIMER0_A0_VECTOR//只是喚醒
__interrupt void Timer(void)
{
}
這里最大與上面最大的不同就是,用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)
{
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer(void)
{
}
這里,主程序中只用休眠,一旦中斷條件發(fā)生,則進(jìn)入中斷,而進(jìn)入中斷后,CPU便自動(dòng)喚醒。因?yàn)橐幚碇袛喾?wù)程序。不過(guò),中斷完了之后,會(huì)恢復(fù)到中斷前的狀態(tài),在這里便又回到了休眠狀態(tài)。
休眠的寫(xiě)法中,有一個(gè)點(diǎn)要注意。若主函數(shù)中只作休眠,則中斷函數(shù)中不必寫(xiě)喚醒的語(yǔ)句;若中斷中只作喚醒,則主函數(shù)中休眠+待執(zhí)行語(yǔ)句,要用循環(huán)。
相信通過(guò)這里的講解,大伙已明白低功耗和中斷的關(guān)系了吧。明白了中斷為什么在430中猶為重要了吧。
評(píng)論