程序运行后,P2.1开中断,并进入低功耗,中断后退出低功耗,初始化定时器,每隔125 US进入定时器中断服务程序,我要判断进入定时器中断的次数(page_length),满足条件后,退出定时器中断,我在主程序中判断 if(k>page_length)break; ,但怎么关不了中断,而且执行不到while后面的语句.
#include <MSP430x14x.h>
#define CLE BIT3
#define ALE BIT3
#define WE BIT6
#define CE BIT4
#define RE BIT5
#define page_length 2142 //85E=2142,总共85F页,即0-85E
#define RD BIT0
#define RB BIT7
void InitSys(); //系统初始化
unsigned int j,k=0,j1,j2=0,j3=0,j4=0;
unsigned char ISR_Symbol;
unsigned int i;
int main (void)
{
WDTCTL = WDTPW + WDTHOLD;
P2DIR &= ~BIT1;
P2SEL &= ~BIT1; //P2.1口允许中断;
P2IES |= BIT1;
P2IE |= BIT1;
P2IFG = 0;
P4DIR |= 0x00;
P5DIR |= 0x00;
P6DIR |= 0xFF;
ISR_Symbol = 0;
_EINT();
while(1)
{
LPM4;
if(ISR_Symbol)break;
}
ISR_Symbol = 0;
InitSys();
_NOP();
_NOP();
while(1)
{
if(k>page_length)break; //判断次数
}
TACTL |= 0x00;
while(1)
{
_NOP();
}
}
void InitSys() //系统初始化
{
unsigned int iq0;
BCSCTL1 &= ~XT2OFF;
do
{
IFG1 &= ~OFIFG;
for(iq0=0xFF; iq0>0; iq0--);
}
while ((IFG1 & OFIFG)!= 0);
BCSCTL2 = SELM_2 + SELS + DIVS_1; //启动XT2晶振;
TACTL = TASSEL1 + TACLR + MC0;
CCTL0 = CCIE; //初始化TA定时器
CCR0 = 500;
_EINT();
}
#pragma vector = PORT2_VECTOR
__interrupt void Port2()
{
LPM4_EXIT;
_NOP();
_NOP();
P2DIR &= ~BIT1;
if((P2IN&BIT1)==0)return;
for(j=0;j<100;j++);
if((P2IN&BIT1)==0)return;
P3DIR |= BIT1 + BIT4;
P3OUT |= BIT4; //为1
P3OUT &= ~BIT1; //为0 //P2口中断,给AD上电
_NOP();
_NOP();
_NOP();
P1DIR |= BIT0 + BIT7 + BIT6 + BIT5;
P1OUT |= BIT7 + BIT6; //A1、A2为1
P1OUT &= ~BIT5; //A0为0
P2IFG &= ~BIT1;
_DINT();
P2IFG = 0;
P2IE = 0;
ISR_Symbol = 0xff;
return;
}
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA0()
{
P1OUT ^= BIT0;
P1OUT ^= BIT0; //产生HOLD
for(j1=0xFF; j1>0; j1--); //延时
k++; //HOLD个数i加1
return;
}
另外小弟还问一个问题,我用MSP430F149的P6口与FLASH存储器I/O口相联,但一执行P6DIR|=0XFF,定义输出时,仿真器就出错,不知为什么.
LPM4好像把MCLK ACLK SMCLK都关了,进入LPM4后你的Timer_A用什么时钟源?
while(1)
{
LPM4;
if(ISR_Symbol)break;
}
LPM4使系统进入低功耗,相应完又进入低功耗,好像无法执行if(ISR_Symbol)break;语句
大虾们看一下程序,程序中有一段P2口的中断服务程序
#pragma vector = PORT2_VECTOR
__interrupt void Port2()
{
LPM4_EXIT;
.
.
.
.
.
ISR_Symbol = 0xff;
return;
}
主程序中在关闭看门狗后允许P2.1中断,并进入低功耗,我在P2.1与地之间焊了一个按键开关,当开关按下时,进入P2口中断服务程序并退出低功耗,初始化定时器,然后执行后面语句.我用仿真器调试过没问题,但在定时中断次数到了之后,还执行定时器中断服务程序,甚至还跳回到低功耗处.
请大虾们仔细的耐心的帮我看一下程序,看看有什么办法解决.我看到有的资料上说:MSP430 在进入睡眠后,如果发生事件产生中断,那么单片机会退出睡眠,自动执行中断程序,但是当中断返回时,主程序又重新进入睡眠状态。如果要在发生中断后,主程序需要退出睡眠,那么需要在中断程序中修改SP 堆栈中的内容,C 语言没有指令可以修改堆栈内的内容.不知道我的问题是不是就这个问题.
TACTL |= 0x00;???????????????????????????
停不了
请问楼主,_BIC_SR_IRQ(LPM0_bits)和LPM0_EXIT是不是一样?
#include <In430.h>
#define LPM0 _BIS_SR(LPM0_bits) /* Enter Low Power Mode 0 */
#define LPM0_EXIT _BIC_SR_IRQ(LPM0_bits) /* Exit Low Power Mode 0 */
#define LPM1 _BIS_SR(LPM1_bits) /* Enter Low Power Mode 1 */
#define LPM1_EXIT _BIC_SR_IRQ(LPM1_bits) /* Exit Low Power Mode 1 */
#define LPM2 _BIS_SR(LPM2_bits) /* Enter Low Power Mode 2 */
#define LPM2_EXIT _BIC_SR_IRQ(LPM2_bits) /* Exit Low Power Mode 2 */
#define LPM3 _BIS_SR(LPM3_bits) /* Enter Low Power Mode 3 */
#define LPM3_EXIT _BIC_SR_IRQ(LPM3_bits) /* Exit Low Power Mode 3 */
#define LPM4 _BIS_SR(LPM4_bits) /* Enter Low Power Mode 4 */
#define LPM4_EXIT _BIC_SR_IRQ(LPM4_bits) /* Exit Low Power Mode 4 */
#endif /* End #defines for C */
yiyang