擦鞋匠 发表于 2018-10-15 19:10:06

请教: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;

真的是百思不得其解!恳请各位指教,不胜感激!

擦鞋匠 发表于 2018-10-15 21:26:30

再补充下:
1、将switch (__even_in_range(RTCIV, 16))中第二个参数更改,程序指针会case到其它位置(但不是在正确的位置)。
2、通过寄存器窗口查看,RTCIV的值的确是2。如果使用switch(RTCIV),替换switch (__even_in_range(RTCIV, 16)),能够case到正确的位置,也就能正确执行。
很是困惑!

擦鞋匠 发表于 2018-10-16 11:04:20

不知道各位是否遇到过类似情况,恳请指教~

helloshi 发表于 2018-10-16 14:35:17

case 下面一样,跳到哪都一样,别纠结了{:lol:}
页: [1]
查看完整版本: 请教:MSP430f5438a 当开启RTC中断嵌套,无法进入RTCRDY中断