各位工程师,您好!我的程序流程大概是这样的:上电后MCU先进入LMP4,然后在P1.6的按键中断中退出LMP4,speak()(蜂鸣器函数)响一声,之后开启SD24中断,并且若有P1.7中断,则调用cal()函数,同时speak()使蜂鸣器响一声,在cal()中如果有CASE TRUE,则speak()调用两次,即蜂鸣器响两声。
我遇到的问题是:P1.6中断后,蜂鸣器可以响一声,而之后的再调用speak()时,蜂鸣器根本不响,但但这个函数还可以单步运行(在线测试过)!我把部分代码粘贴在下方,希望您不吝赐教,帮忙解决下,非常感谢!
代码:
蜂鸣器函数:
void speak()
{
unsigned char si;
P1DIR|=BIT4;
P1OUT|=BIT4;
for(si=0;si<200;si++)
{
delay_us(200);
P1OUT^=BIT4;
}
P1OUT|=BIT4;
}
部分主函数: WDTCTL=WDTPW+WDTHOLD; //关闭看门狗
InitialToLMP4(); //进入低功耗前的初始化函数
speak();
__bis_SR_register(LPM4_bits + GIE); //开机就进入低功耗LMP4模式
speak();
Initial(); //单片机初始化
//while(1);
SD24CCTL0 |= SD24SC;//开始AD转换
_EINT();
delay_ms(100);//保证完成一次ad采集
while(1)
{
…………
}
按键中断:#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
switch(P1IFG&0xC0)
{
case 0x40:
__bic_SR_register_on_exit(LPM4_bits);
P1IFG &= ~BIT6;
Speak();//可以响
if(status==1)
{
OutLMP4();
}
break;
case 0x80:
P1IFG &= ~BIT7;
speak();//蜂鸣器不响
Cal();
break;
default:
P1IFG = 0x00;
break;
}
}
SD24初始化及其中断:
SD24CTL = SD24XDIV_3+SD24DIV_3+SD24SSEL_1+SD24REFON ;//
//二级48分频,一级8分频,ad时钟选为SMCLK=mclk,启用内部参考电压
SD24INCTL0 = SD24INTDLY0+SD24GAIN_2+SD24INCH_0;
// Interrupt on 3rd sample,AD Gain: 2 AD通道选择A0
SD24CCTL0 = SD24UNI+SD24OSR_1024+SD24IE;
//单极模式,连续转换、过采样1024点,Enable interrupt
#pragma vector = SD24_VECTOR
__interrupt void SD24ISR(void)
{
unsigned int out=0;
switch(SD24IV)
{
case 2:
break;
case 4:
out=SD24MEM0;//结果是16位
break;
case 6:
break;
case 8:
break;
default:
break;
}
gaoyang9992006:
上电后MCU先进入LMP4,然后在P1.6的按键中断中退出LMP4,speak()(蜂鸣器函数)响一声,之后开启SD24中断,并且若有P1.7中断,则调用cal()函数,同时speak()使蜂鸣器响一声,在cal()中如果有CASE TRUE,则speak()调用两次,即蜂鸣器响两声。
********************************************************************************************
根据你的描述,原因是,后面根本没有进入中断程序,前面的那个1.6的进去了,而后面的1.7的没有进去。
bin jiao:
回复 gaoyang9992006:
谢谢您的回答,不过中断可以进去,在线测试过