TI中文支持网
TI专业的中文技术问题搜集分享网站

TimerA0 与 P1中断 一起用导致 跑飞?

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

楼主你好,你的问题解决了吗?

觉得两个中断服务程序里的代码执行时间都太长了,而且有嵌套。觉得可能是嵌套的太多,有地址越界了

赞(0)
未经允许不得转载:TI中文支持网 » TimerA0 与 P1中断 一起用导致 跑飞?
分享到: 更多 (0)