balance 发表于 2010-8-21 09:43:30

请教,用低功耗模式3控制led亮灭,进入低功耗模式,出不来

以下是LT-1BMSP430学习板上的一个程序。用的好像是p2口控制led灯亮灭,也有其他的一些设置。可是这个程序好像是进入了低功耗模式就出不来。不知道为什么。这个程序用的32768的晶振,如果改用8M的晶振就没有问题了。


/***************************************************
程序功能:控制8个LED闪烁,用于测试下载功能是否正常
---------------------------------------------------
测试说明:观察LED闪烁
***************************************************/
#include<msp430x14x.h>
#include"BoardConfig.h"

/****************主函数****************/
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗
    BoardConfig(0xf0);            //关闭数码管和电平转换,打开流水灯

    CCTL0 = CCIE;                   //使能CCR0中断
    CCR0 = 2047;                  //设定周期0.5S               
    TACTL = TASSEL_1 + ID_3 + MC_1; //定时器A的时钟源选择ACLK,增计数模式

    P1DIR = 0xff;                   //设置P1口方向为输出
    P1OUT = 0x0f;   
    P2DIR = 0xff;                   //设置P2口方向为输出
    P2OUT = 0x00;
    P3DIR = 0xff;                   //设置P3口方向为输出
    P3OUT = 0x00;   
    P4DIR = 0xff;                   //设置P4口方向为输出
    P4OUT = 0x00;
    P5DIR = 0xff;                   //设置P5口方向为输出
    P5OUT = 0x00;   
    P6DIR = 0xff;                   //设置P6口方向为输出
    P6OUT = 0x00;

    _EINT();                        //使能全局中断
    LPM3;                           //CPU进入LPM3模式      
}

/*******************************************
函数名称:Timer_A
功    能:定时器A的中断服务函数
参    数:无
返回值:无
********************************************/
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
    P1OUT ^= 0xff;                  //P2口输出取反
    P2OUT ^= 0xff;                  //P2口输出取反
    P3OUT ^= 0xff;                  //P2口输出取反
    P4OUT ^= 0xff;                  //P2口输出取反
    P5OUT ^= 0xff;                  //P2口输出取反
    P6OUT ^= 0xff;                  //P2口输出取反   
}

pang5bo 发表于 2010-8-21 20:08:37

你的终端程序里面没有唤醒CPU的程序,它当然出不来啦
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
    P1OUT ^= 0xff;                  //P2口输出取反
    P2OUT ^= 0xff;                  //P2口输出取反
    P3OUT ^= 0xff;                  //P2口输出取反
    P4OUT ^= 0xff;                  //P2口输出取反
    P5OUT ^= 0xff;                  //P2口输出取反
    P6OUT ^= 0xff;                  //P2口输出取反   
__low_power_mode_off_on_exit();
}

balance 发表于 2010-8-22 11:23:45

回复【楼主位】balance
-----------------------------------------------------------------------

问题已经解决,和大家共享一下吧。程序没有问题,完全可以运行。只是有点瑕疵而已,貌似
LPM3;                           //CPU进入LPM3模式
被中断唤醒以后,终端服务程序结束,返回。(不知中断返回,是应该返回到哪里,期待行家的指点)
若是返回点是这句以后,就不能再进低功耗模式了

peterliuzq 发表于 2010-8-24 09:24:06

#include<msp430x14x.h>
#include"BoardConfig.h"

/****************主函数****************/
void main(void)
{   
    WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗
    BoardConfig(0xf0);            //关闭数码管和电平转换,打开流水灯

    CCTL0 = CCIE;                   //使能CCR0中断
    CCR0 = 2047;                  //设定周期0.5S               
    TACTL = TASSEL_1 + ID_3 + MC_1; //定时器A的时钟源选择ACLK,增计数模式

    P1DIR = 0xff;                   //设置P1口方向为输出
    P1OUT = 0x0f;   
    P2DIR = 0xff;                   //设置P2口方向为输出
    P2OUT = 0x00;
    P3DIR = 0xff;                   //设置P3口方向为输出
    P3OUT = 0x00;   
    P4DIR = 0xff;                   //设置P4口方向为输出
    P4OUT = 0x00;
    P5DIR = 0xff;                   //设置P5口方向为输出
    P5OUT = 0x00;   
    P6DIR = 0xff;                   //设置P6口方向为输出
    P6OUT = 0x00;

    _EINT();                        //使能全局中断

    while(1)                        //在此处加个while(1)循环
    {
      _NOP();
      LPM3;                           //CPU进入LPM3模式
    }      
}

在主程序加个while(1)循环,这样一旦在中断中退出低功耗,执行相应的程序后,执行主循环程序,进入低功耗

另外你的中断程序也得改一下


#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
    LPM3_EXIT;
    P1OUT ^= 0xff;                  //P2口输出取反   
    P2OUT ^= 0xff;                  //P2口输出取反
    P3OUT ^= 0xff;                  //P2口输出取反   
    P4OUT ^= 0xff;                  //P2口输出取反
    P5OUT ^= 0xff;                  //P2口输出取反   
    P6OUT ^= 0xff;                  //P2口输出取反   
   
}



欢迎交流

QQ:892364156

http://shop61810118.taobao.com

dszx 发表于 2010-11-11 19:02:45

学习

culourwq 发表于 2010-11-12 11:04:35

回复【3楼】-----------------------------------------------------------------------

受教了,谢了

Lijin 发表于 2011-3-20 23:02:28

回复【1楼】pang5bo
-----------------------------------------------------------------------

我还是觉得你说的在理,他们说的我都不懂。进入低功耗后,CPU OFF了,程序当然不能执行,一旦从低功耗出来就可以继续了。是这样理解吗?

tianyaxtujxlg 发表于 2011-12-19 16:53:11

MARK我现在也在学习MSP430的低功耗模式

tengguodong 发表于 2011-12-24 09:25:12

回复【3楼】peterliuzq
-----------------------------------------------------------------------

这么快就解决了,我还想速度解决些技术性问题好让他不把俺删了呢

kihell 发表于 2012-5-30 14:26:43

基础的学习很重要学习到了 我也出现类似问题

sunmoonxzit001 发表于 2012-6-6 08:53:53

开始时,会遇到这个问题的额

dadongleilei 发表于 2012-6-6 08:59:31

很容易犯的错误,还有中断的服务程序也要合适,否则有可能出现堆栈溢出的情况
页: [1]
查看完整版本: 请教,用低功耗模式3控制led亮灭,进入低功耗模式,出不来