Part Number: MSP430FR5994
Hello all,
I'm having a problem to get my MCU to go into LPM3 or lower ones.
I copied the code that TI provided as an example code for LPM3.5. (Code provided bellow)
When in standalone mode, MCU is disconnected completely from everything. Even the jumpers to the programmable part are disconnected.
In that case MCU is supplied by external source through 3.3V supply pin. On that line in serial the high resolution mutimeter is connected. (as an Ampermeter, resolution 1 nano Amper)
Current consuption is constantly around 2mA. (even though in LPM3.5 it shoud be way bellow 1 micro Amper)
So in this case the MCU either doesn't enter (most probably) LPM at all or there is something else.
Any help is appreciated.
Thank you.
#include <msp430.h>
void Board_Init(void);
void RTC_Init(void);
void EnterLPM35(void);
void WakeUpLPM35(void);
volatile unsigned i;
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop WDT
Board_Init(); // Regular init code for GPIO and CS
while(1)
{
EnterLPM35(); // This function will NOT return.
}
// }
}
void Board_Init(void)
{
// Port Configuration
P1OUT = 0;
P1DIR = 0xFF;
P2OUT = 0;
P2DIR = 0xFF;
P3OUT = 0;
P3DIR = 0xFF;
P4OUT = 0;
P4DIR = 0xFF;
P5OUT = 0;
P5DIR = 0xFF;
P6OUT = 0;
P6DIR = 0xFF;
P7OUT = 0;
P7DIR = 0xFF;
P8OUT = 0;
P8DIR = 0xFF;
PJOUT = 0x00;
PJSEL0 |= BIT4 | BIT5;
PJDIR = 0xFFFF;
// Disable the GPIO power-on default high-impedance mode to activate
// previously configured port settings
PM5CTL0 &= ~LOCKLPM5;
// Setup Clocks
CSCTL0_H = CSKEY >> 8; // Unlock CS registers
CSCTL1 = DCOFSEL_0; // Set DCO to 1MHz
CSCTL2 = SELA__LFXTCLK | SELS__DCOCLK | SELM__DCOCLK; // set ACLK = XT1; MCLK = DCO
CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1; // Set all dividers to 1
CSCTL4 &= ~LFXTOFF; // Enable LFXT1
do
{
CSCTL5 &= ~LFXTOFFG; // Clear XT1 fault flag
SFRIFG1 &= ~OFIFG;
} while (SFRIFG1 & OFIFG); // Test oscillator fault flag
CSCTL0_H = 0; // Lock CS registers
}
void EnterLPM35(void)
{
PMMCTL0_H = PMMPW_H; // Open PMM Registers for write
PMMCTL0_L |= PMMREGOFF; // and set PMMREGOFF
// Enter LPM3.5 mode with interrupts enabled. Note that this operation does
// not return. The LPM3.5 will exit through a RESET event, resulting in a
// re-start of the code.
__bis_SR_register(LPM3_bits | GIE);
}
void WakeUpLPM35(void)
{
// Restore Port settings
P1OUT = 0x00;
P1DIR = 0xFF;
P2OUT = 0x00;
P2DIR = 0xFF;
P3OUT = 0x00;
P3DIR = 0xFF;
P4OUT = 0x00;
P4DIR = 0xFF;
PJOUT = 0x00;
PJSEL0 |= BIT4 | BIT5;
PJDIR = 0xFFFF;
// Reconfig/start RTC
RTCCTL0_H = RTCKEY_H; // Unlock RTC key protected registers
RTCCTL0_L |= RTCTEVIE; // enable RTC event interrupt for each minute
RTCCTL1 = RTCBCD | RTCHOLD | RTCTEV__MIN; // BCD mode, RTC hold
RTCCTL1 &= ~RTCHOLD;
RTCCTL0_H = 0; // Lock RTC key protected registers
// Disable the GPIO power-on default high-impedance mode to activate
// previously configured port settings. This will also re-activate the RTC
// settings.
PM5CTL0 &= ~LOCKLPM5;
// Restore Clocks so that RTC will be read
CSCTL0_H = CSKEY >> 8; // Unlock CS registers
CSCTL1 = DCOFSEL_0; // Set DCO to 1MHz
CSCTL2 = SELA__LFXTCLK | SELS__DCOCLK | SELM__DCOCLK; // Set ACLK = XT1; MCLK = DCO
CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1; // Set all dividers to 1
CSCTL4 &= ~LFXTOFF; // Enable LFXT1
do
{
CSCTL5 &= ~LFXTOFFG; // Clear XT1 fault flag
SFRIFG1 &= ~OFIFG;
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
CSCTL0_H = 0; // Lock CS registers
}