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.

MSP430FR2433: Which IFGs will cause a reset?

Part Number: MSP430FR2433

Will a VMAIFG cause a reset?

  • Part Number: MSP430FR2433

    Will a JMBINIFG or JMBOUTIFG cause a reset?

  • Part Number: MSP430FR2433

    Will a CBDIFG or UBDIFG cause a reset?

  • Will a VMAIFG cause a reset?

    No, but if required, you could manually trigger a software reset if this IFG has been set.

    Will a JMBINIFG or JMBOUTIFG cause a reset?

    No, these IFGs behave the same way as VMAIFG.

    Will a CBDIFG or UBDIFG cause a reset?

    CBDIFG will not cause a reset. UBDIFG will cause a reset only if UBDRSTEN is enabled.

  • I'm confused about the VMAIFG, and here is why.

    The "Vacant Memory Space" on page 45 of the user guide (slau445i), seems to say that it will cause a PUC, and the Operating Modes diagram, on page 38, says that a Peripheral Area Fetch will cause a PUC. That sounds like both are referring to the VMAIFG. Are they not the same things?

  • Per the user's guide, vacant memory is nonexistent memory space. I assume that means addresses outside of the memory map defined for the specific device.

    Vacant peripheral space is related to the memory range from 0FFFh to 0000h on MSP430FR2433 devices. An example scenario for vacant peripheral space would be an ISR that has been called by an interrupt, but that ISR is not found in the vector table (e.g. FFFFh). Jens-Michael Gross describes it well in the following thread.

    Reset interrupt vector SYSRSTIV is set to 001Eh (peripheral/configuration area fetch - PERF) even before entering main.

    I hope that helps clarify the difference.

  • I'm grateful for your help, but that last reply didn't answer my last question.

    So here's my perceptions.

    Will accessing vacant memory set the the VMAIFG? I think yes.

    Is a peripheral area fetch going to set the VMAIFG? I do not know.

    Is accessing vacant memory and a peripheral area fetch the same thing? I think not, but I really don't know.

  • Will accessing vacant memory set the the VMAIFG? I think yes.

    Yes. This includes accessing (e.g. reading) vacant (e.g. 0x3FFF contents) memory in nonexistent memory locations (e.g. 0x3100 address) and existing memory locations, even in the peripherals memory range (e.g. 0x077C). See code attached below.

    Is a peripheral area fetch going to set the VMAIFG? I do not know.

    Possibly, but since a PUC is generated, VMAIFG probably doesn't matter at that point.

    Is accessing vacant memory and a peripheral area fetch the same thing? I think not, but I really don't know.

    No. The big difference here is access versus fetch. Access or read is related to reading a value stored at a specific address, and fetch is related to executing whatever is stored at a specific address.

    The user's guide summarizes this well on page 45:

    Reads from vacant memory result in the value 3FFFh. In the case of a fetch, this is taken as JMP $. Fetch accesses from vacant
    peripheral space result in a PUC.

    Does this make more sense?

    #include <msp430.h>
    
    volatile unsigned int value;
    
    int main(void)
    {
        WDTCTL = WDTPW | WDTHOLD;               // Stop watchdog timer
    
        P1OUT &= ~BIT0;                         // Clear P1.0 output latch for a defined power-on state
        P1DIR |= BIT0;                          // Set P1.0 to output direction
    
        PM5CTL0 &= ~LOCKLPM5;                   // Disable the GPIO power-on default high-impedance mode
                                                // to activate previously configured port settings
    
        // Activate vacant memory interrupt
        SFRIE1 = VMAIE;
    
        while(1)
        {
            // Read from vacant nonexistent memory between 0xC3FF - 0x3000
            // will cause  VMAIFG SNMI interrupt
            value = *((unsigned int*)0x3100);
    
            __delay_cycles(100000);             // Delay for 100000*(1/MCLK)=0.1s
    
            // Read from vacant peripheral memory between 0x0FFF - 0x0000
            // will not cause  VMAIFG SNMI interrupt
            value = *((unsigned int*)0x077C);
    
            __delay_cycles(100000);             // Delay for 100000*(1/MCLK)=0.1s
    
            // Read from nonvacant peripheral memory between 0x0FFF - 0x0000
            // will not cause  VMAIFG SNMI interrupt
            value = *((unsigned int*)0x04DA);
    
            __delay_cycles(100000);             // Delay for 100000*(1/MCLK)=0.1s
        }
    }
    
    // SYSNMI interrupt service routine
    #pragma vector=SYSNMI_VECTOR
    __interrupt void SYSNMI_ISR(void)
    {
        if(VMAIFG)
        {
            P1OUT ^= BIT0;                      // Toggle P1.0 using exclusive-OR
            SFRIFG1 &= ~VMAIFG;                 // Clear VMAIFG
        }
    }
    
    

    msp430fr243x_vmaifg_detection.c.zip

  • For your reference, here are the memory contents for the addresses used in the attached example.

  • James:

    Thank you for the answers and elaborations with code example. I now understand. I'm grateful.

  • Excellent. I'm glad it was helpful! Thanks for letting us know and for clicking the Resolved button.

**Attention** This is a public forum