下面是从原程序中简化出来的部份
按下MSP430G2553 LaunchPad的P1.3按键后会来亮起P1.0触发定时器
计时完灭P1.3
运行起来很正常,但是当P1.3中断第26次时都会跑飞,并跳回main函数的头重新执行
能请教是否还有哪边没设置好而导致此跑飞的问题?
#include"MSP430G2553.h" char sendCount; void main(void){ WDTCTL= WDTPW + WDTHOLD; //关狗 DCOCTL=CALDCO_16MHZ; BCSCTL1=CALBC1_16MHZ; /* Set DCO to16MHz */ BCSCTL2 = SELM_0 + DIVM_0 + DIVS_1; //SMCLK频率为MCLK/2=8Mhz P1REN|= BIT3; //启用P1.3内部上下拉电阻 P1OUT = BIT3; //将电阻设为上拉 P1DIR&=~BIT3; // P1.3输入 P1IES = BIT3; // P1.3下降沿中断 P1IE = BIT3; // 允许P1.3中断 P1IFG=0; //清P1中断标志 P1DIR|= BIT0 + BIT6; //P1.0、P1.6设为输出LED TA0CCR0=30000; CCTL0= CCIE; _BIS_SR(GIE); //开启总中断致能 _bis_SR_register(LPM3_bits); } //------------------------发射------------------------ #pragma vector=PORT1_VECTOR __interrupt void port1(void){ P1IFG=0; //清除P1中断旗标 P1IE &=~BIT3; //停用发射键P1.3中断,避免按键弹跳导致重覆中断 __delay_cycles(160000); //10ms P1IE |= BIT3; //启用P1.3中断 if((P1IN&0x08)!=0) //如果变为按键放开 return; if(P1IN & BIT3 != 0) //确定触发中断的是P1.3 return; P1IE=0; //关P1中断 CCTL0= CCIE; //设置定时器CCRO中断致能 sendCount=0; //重置目前收发數據计数 CCR0+=9000; //设置中断间隔 TA0CTL= TASSEL_2 + MC_2 + ID_3; //设置Timer_A0的时钟源为SMCLK,工作模式MC_0~3,除频8,clk=1Mhz P1OUT|=1; //开始发射,LED亮 _BIS_SR(GIE); _bis_SR_register(LPM0_bits); } void SendIr(void){ if(sendCount==80){ TACTL=MC_0; //停用计时器 P1IE=BIT3; //* 启用发射键中断 P2IE=BIT3; //* sendCount=0; P1OUT&=~1; //LED暗 while((P1IN&0x08)==0); //确定P1.3已放开 _BIS_SR(GIE); _bis_SR_register(LPM0_bits); return; } CCR0+=1200; sendCount++; } #pragma vector=TIMER0_A0_VECTOR __interrupt void Timer_A(void){ SendIr(); }
灰小子:
楼主你好,你的问题解决了吗?
觉得两个中断服务程序里的代码执行时间都太长了,而且有嵌套。觉得可能是嵌套的太多,有地址越界了