您的位置 首页 系统

我学MSP430G2553的心得之一

学习MSP430G2553,已有7天有余。个人觉着:低功耗是其最大亮点。为此可谓是处心积虑。因而中断低功耗模式在430的应用中便显得千娇百媚,楚

学习MSP430G2553,已有7天有余。个人觉着:低功耗是其最大亮点。为此可谓是挖空心思。因此中止/低功耗形式在430的使用中便显得千娇百媚,楚楚动人!这儿,先跟大伙看下这个中止的状况。
#include<msp430g2553.h>
#include“in430.h”
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//制止看门狗计数
P1DIR=BIT0+BIT1;//P1.01设置为输出,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口中止服务程序
{
unsignedinti=0;
unsignedcharPushKey=0;
PushKey=P1IFG&(BIT4+BIT5);//读取是哪个键按下
for(i=0;i<65535;i++);//延时后再作判别,防止是颤动
if(!(P1IN&PushKey))//没有按下,则为颤动,标志清零
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);”这个等候的句子。
中止没产生前,程序在停这儿等候,就相当于CPU一向停在儿没事做歇着,也许是在等候戈多。一旦中止条件产生,在这儿是按键,它便如同逮着什么似的,便进入中止,去履行中止程序中的代码。
这儿,咱们可见。中止没来之前,CPU它无所事事,却没有封闭,仍在耗电。中止来了之后,它急忙地处理中止程序。前前后后,他总在折腾。必定累得够戗。
那CPU在哪段时间内本可好好歇息,不用糟蹋精力呢???大伙都知道,必定是等候戈多那个时间里。所以便会让它在等候戈多的时间里去休眠。中止来了确实需它出头处理时,它再醒来处理中止事情,更为稳当!!!
于是乎,便有了下面的程序。
#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不再作无谓的等候而耗电,而是处在休眠状况里。中止产生后,CPU便会主动唤醒,进入中止去处理中止程序。完成了低功耗的意图。
这儿的低耗形式的完成是这样的,中止程序中是唤醒CPU,然后进入主程序,履行相应的功能模块。相应的功能模块,全在主程序中。
这便是所谓的中止中只用唤醒用。咱们能够选用另一种方法,主程序中止只用休眠用。且看下面程序。
#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;//封闭看门狗
TACTL=TASSEL1+MC1+TACLR;//守时器时钟源为SMCLK,up,不分频,清零
CCTL0|=CCIE;//使能比较器中止
CCR0=50000;//计数器终值
P1DIR=0xff;//P1输出口
__enable_interrupt();//使能大局中止,C编译器中的内部函数
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;
}
}
这儿,主程序中只用休眠,一旦中止条件产生,则进入中止,而进入中止后,CPU便主动唤醒。由于要处理中止服务程序。不过,中止完了之后,会康复到中止前的状况,在这儿便又回到了休眠状况。
休眠的写法中,有一个点要注意。若主函数中只作休眠,则中止函数中不用写唤醒的句子;若中止中只作唤醒,则主函数中休眠+待履行句子,要用循环。
信任经过这儿的解说,大伙已理解低功耗和中止的联系了吧。理解了中止为什么在430中犹为重要了吧。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/xitong/259132.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部