This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430F6779A:执行系统不可屏蔽中断服务例程的正确流程是什么?

Guru**** 1138100 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1338261/msp430f6779a-what-is-proper-process-to-do-system-non-maskable-interrupt-service-routine

器件型号:MSP430F6779A

因为我们已将复位引脚设置为 NMI、以防止 PMM26

int _system_pre_init(void)
{
/* Insert your low-level initializations here */
__disable_interrupt();
WDTCTL = WDTPW+WDTHOLD;

// Clear RTCHOLD Bit after reset
RTCCTL0_H = RTCKEY_H; // unlock
RTCCTL1 &= ~RTCHOLD; // release RTC
RTCCTL0_H = 0x00; // lock

SFRRPCR = SYSNMI | SYSNMIIES | SYSRSTRE;

/* Return value:
* 1 - Perform data segment initialization.
* 0 - Skip data segment initialization.
*/
return 1;
}

执行系统不可屏蔽中断服务例程的正确过程是什么?

它是否为空白、如下所示?

//------------------------------------------------------------------------------
//                         Interrupt Service Routine
//------------------------------------------------------------------------------
#pragma vector=SYSNMI_VECTOR            /* 0xFFFC System Non-maskable */
__interrupt void int_SYSNMI(void)
{

}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、

    您还需要在 SFRIE1寄存器中设置 NMIIE。  

    我还认为外部 NMIIFG 是一个用户 NMI、所以您的向量应该是 UNMI_VECTOR。 我至少会读取 SYSUNIV 寄存器来清除每个 ISR 中的 NMIIFG。  

    此致、
    布兰登·费舍尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Brandon Fisher、

    感谢您的信息。

    如果 NMIIE 已清零(禁用)。

        SFRIE1 &= ~(NMIIE);            // SFRIE1    �? NMI Interrupt      Disable(b4)
    

    在 NMIIE 清零的情况下、用户 NMI 中断服务例程需要什么进程

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、

    您的 USER_NMI 可能如下所示:  

    // UNMI Interrupt Service Routine
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=UNMI_VECTOR
    __interrupt void UNMI_ISR(void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(UNMI_VECTOR))) UNMI_ISR (void)
    #else
    #error Compiler not supported!
    #endif
    {
        switch(__even_in_range(SYSUNIV, SYSUNIV_AUXSWGIFG))
        {
            case SYSUNIV_NONE: break; // No interrupt Pending
            case SYSUNIV_NMIIFG:
                //Trigger POR
                PMMCTL0 = PMMPW | PMMSWPOR;
                break; // NMIIFG
            case SYSUNIV_OFIFG: break; // OFIFG
            case SYSUNIV_ACCVIFG: break; // ACCVIFG
            case SYSUNIV_AUXSWGIFG: // BUSIFG
                break;
            default: 
                break;
        }
    }

    在 NMIIFG 上、它应该触发一个 POR。

    此致、
    布兰登·费舍尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Brandon Fisher、

    如果在我的当前源中的 USER_NMI 中没有禁用 NMIIE 的过程、是否会出现任何问题?

    SFRIE1 &=~(NMIIE);// SFRIE1

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果 NMIEE 被禁用、我希望你永远不会触发 UNMI ISR。 在这种情况下、处理器内部有什么东西都没有关系。

    此致、
    布兰登·费舍尔