请教:MSP430f5438a 当开启RTC中断嵌套,无法进入RTCRDY中断
1、调试环境msp430f5438a + iar7.10
2、调试代码
void rtc_init(void)
{
RTCCTL01 |= RTCAIE + RTCRDYIE + RTCHOLD + RTCMODE;
RTCAMIN = RTCAE;
RTCAHOUR = 0x00;
RTCADOW = 0x00;
RTCADAY = 0x00;
RTCCTL01 &= ~(RTCHOLD);
}
#pragma vector = RTC_VECTOR
__interrupt void RTC_ISR(void)
{
_EINT();
switch (__even_in_range(RTCIV, 16))
{
case RTC_NONE:
_NOP();
break;
case RTC_RTCRDYIFG://注释1:如果不开启中断嵌套(不使用_EINT()),则可以正常进入RTCRDY中断
_NOP();
break;
case RTC_RTCTEVIFG:
_NOP();
break;
case RTC_RTCAIFG:
_NOP();
break;
case RTC_RT0PSIFG:
_NOP();
break;
case RTC_RT1PSIFG:
_NOP();
break;
case 12:
_NOP();
break;
case 14://注释2:如果开启中断嵌套(使用_EINT()),调试发现,程序执行到此处,而这里是保留区域
_NOP();
break;
case 16:
_NOP();
break;
default:
_NOP();
break;
}
}
3、调试现象
当RTC中断中不开启中断嵌套,则程序每秒钟可正常进入RTCRDY中断,如程序中的注释1;
当RTC中断中开启中断嵌套,则程序每秒钟将进入case 14位置,如程序中的注释2;
真的是百思不得其解!恳请各位指教,不胜感激!
再补充下:
1、将switch (__even_in_range(RTCIV, 16))中第二个参数更改,程序指针会case到其它位置(但不是在正确的位置)。
2、通过寄存器窗口查看,RTCIV的值的确是2。如果使用switch(RTCIV),替换switch (__even_in_range(RTCIV, 16)),能够case到正确的位置,也就能正确执行。
很是困惑! 不知道各位是否遇到过类似情况,恳请指教~ case 下面一样,跳到哪都一样,别纠结了{:lol:}
页:
[1]