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.

MSPM0G3507: Exit standby mode on MSPM0

Part Number: MSPM0G3507

Tool/software:

Hi experts,
Is it possible to exit standby mode with an instruction (like _BIC_SR_IRQ(CPUOFF); // Clear LPM from 0(SR) on an MSP430).
Thanks in advance.
/*
 * Exit_Standby.c
 *
 *  Created on: 7 août 2024
 *      Author: Test Team
 */

#include "ti_msp_dl_config.h"

volatile unsigned char RX_Data = 0;

int main(void)
{
    SYSCFG_DL_init();

    NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN);
    NVIC_EnableIRQ(UART_0_INST_INT_IRQN);
    DL_SYSCTL_enableSleepOnExit();

    while (1) {
        __WFI();
        DL_GPIO_togglePins(GPIO_LEDS_PORT,
            GPIO_LEDS_USER_LED_1_PIN | GPIO_LEDS_USER_TEST_PIN);
    }
}

void UART_0_INST_IRQHandler(void)
{
    switch (DL_UART_Main_getPendingInterrupt(UART_0_INST)) {
        case DL_UART_MAIN_IIDX_RX:
            RX_Data = DL_UART_Main_receiveData(UART_0_INST);
            while (DL_UART_isBusy(UART_0_INST));
            DL_UART_Main_transmitData(UART_0_INST, RX_Data);

            if(RX_Data == "@")
            {
                // Exit standby mode only if RX car is "@"
            }
            break;
        default:
            break;
    }
}

  • Hi Thierry,

    You can use the DL_SYSCTL_disableSleepOnExit() function to disable re-entering a low power mode in your interrupt service routine. If you'd like to re-enter a low power mode later, you can use the DL_SYSCTL_enableSleepOnExit() function again then use the WFE() or WFI() functions to actually enter the sleep mode.

  • Hi Dylan
    DL_SYSCTL_disableSleepOnExit() in interrupt works perfectly.
    Thank you so much.

    /*
     * Exit_Standby.c
     *
     *  Created on: 7 août 2024
     *      Author: Test Team
     */
    
    #include "ti_msp_dl_config.h"
    
    volatile unsigned char RX_Data = 0;
    
    int main(void)
    {
        SYSCFG_DL_init();
    
        NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN);
        NVIC_EnableIRQ(UART_0_INST_INT_IRQN);
        DL_SYSCTL_enableSleepOnExit();
    
        while (1) {
            __WFI();
            DL_GPIO_togglePins(GPIO_LEDS_PORT,
                GPIO_LEDS_USER_LED_1_PIN | GPIO_LEDS_USER_TEST_PIN);
            DL_SYSCTL_enableSleepOnExit();
        }
    }
    
    void UART_0_INST_IRQHandler(void)
    {
        switch (DL_UART_Main_getPendingInterrupt(UART_0_INST)) {
            case DL_UART_MAIN_IIDX_RX:
                RX_Data = DL_UART_Main_receiveData(UART_0_INST);
                while (DL_UART_isBusy(UART_0_INST));
                DL_UART_Main_transmitData(UART_0_INST, RX_Data);
    
                if(RX_Data == "@")
                {
                    // Exit standby mode for toggle led in main only if RX car is "@"
                    DL_SYSCTL_disableSleepOnExit();
                }
                break;
            default:
                break;
        }
    }