下面是从原程序中简化出来的部份
按下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();
}