请教,用低功耗模式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口输出取反
} 你的终端程序里面没有唤醒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
-----------------------------------------------------------------------
问题已经解决,和大家共享一下吧。程序没有问题,完全可以运行。只是有点瑕疵而已,貌似
LPM3; //CPU进入LPM3模式
被中断唤醒以后,终端服务程序结束,返回。(不知中断返回,是应该返回到哪里,期待行家的指点)
若是返回点是这句以后,就不能再进低功耗模式了 #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 学习 回复【3楼】-----------------------------------------------------------------------
受教了,谢了 回复【1楼】pang5bo
-----------------------------------------------------------------------
我还是觉得你说的在理,他们说的我都不懂。进入低功耗后,CPU OFF了,程序当然不能执行,一旦从低功耗出来就可以继续了。是这样理解吗? MARK我现在也在学习MSP430的低功耗模式 回复【3楼】peterliuzq
-----------------------------------------------------------------------
这么快就解决了,我还想速度解决些技术性问题好让他不把俺删了呢 基础的学习很重要学习到了 我也出现类似问题 开始时,会遇到这个问题的额 很容易犯的错误,还有中断的服务程序也要合适,否则有可能出现堆栈溢出的情况
页:
[1]