Forum: Mikrocontroller und Digitale Elektronik MSP430 Sleep Mode


von sleep_msp_sleep (Gast)


Lesenswert?

Hallo zusammen,

ich arbeite mit einem MSP430FR5739 und versuche mich am LPM 3.5.

Ich schicke den MSP über folgende Funktion schlafen:
1
void enter_lpm4()
2
{
3
  WDTCTL = WDTPW + WDTHOLD;                   // Stop WDT
4
5
    // Configure Ports
6
    P1DIR = 0xFF;
7
    P1OUT = 0x00;
8
    P2OUT = 0x00;
9
    P2DIR = 0xFF;
10
    P3OUT = 0x00;
11
    P3DIR = 0xFF;
12
    P4OUT = 0x00;
13
    P4DIR = 0xFF;
14
15
    // Configure Wake-Up Port
16
    P1DIR &= ~BIT0;
17
    P1IE |= BIT0;
18
    P1IFG &= ~BIT0;
19
20
    // Configure RTC
21
    PJSEL0 |= BIT4 | BIT5;
22
    RTCPS1CTL &= ~RT1PSIE;
23
    RTCPS1CTL &= ~RTCTEVIFG;
24
    RTCCTL01 &= ~(RTCHOLD);                   // Start RTC
25
26
    // Enter LPM3.5
27
    PMMCTL0_H = PMMPW_H;                        // Open PMM Registers for write
28
    PMMCTL0_L |= PMMREGOFF;                    // and set PMMREGOFF
29
30
    __bis_SR_register(LPM4_bits | GIE);
31
}

Der MSP430 geht schlafen, ich zeichne den Strombedarf mit dem Energy 
Trace Tool auf und das sieht nach einem schlafenden MSP430 aus.

Zum aufwecken verwende ich folgende Service Routine:
1
#pragma vector=PORT1_VECTOR
2
__interrupt void PORT1(void)
3
{
4
  P1IFG &= ~BIT0;
5
  __bic_SR_register_on_exit(LPM4_bits);        // Clear CPUOFF bit from 0(SR)
6
}

Problem:

Er springt nach dem aufwecken beim Neustart diese Routine nicht an:
1
init_board();
2
3
PM5CTL0 &= ~LOCKLPM5;
4
5
if (SYSRSTIV == SYSRSTIV_LPM5WU)
6
{
7
  RTCPS1CTL |= RT1IP_5 + RT1PSIE + RTCTEVIFG;
8
  RTCCTL01 &= ~(RTCHOLD);                     // Start RTC
9
10
  /// Dieses Bit wird nicht gesetzt --> Er läuft hier nicht rein nach dem Reset
11
  P3OUT |= BIT1;
12
  P3DIR |= BIT1;
13
}
14
else
15
{
16
  init_RTC();
17
}

Ich bin mir langsam nicht mehr sicher, ob er wirklich in den 
Tiefschalfmodus geht ...

von Clemens L. (c_l)


Lesenswert?

Ich vermute mal, init_board() ist harmlos?

Probier mal, PMMIFG.PMMLPM5IFG zu lesen.

von sleep_msp_sleep (Gast)


Lesenswert?

Ja, in der Init steht nur die Portkonfiguration, clock, timer, etc. 
drin.

Erst dachte ich, das kommt davon weil ich den Debugger noch dran habe, 
aber auch wenn ich den Debugger abziehe und einfach nur den Port messe, 
läuft er nicht in die if/else Bedingung. Als würde er gar nicht neu 
starten sondern einfach nur dort weiter machen, wo er aufgehört hat.

Das PMMLPM5IFG  ist nicht gesetzt :-(

Sieht irgendwie danach aus, als wäre ich im Normalen LPM4 gelandent, 
statt im LPM3.5

von Stefan S. (mexakin)


Lesenswert?

Also beim LPM macht er ja eigentlich wenn du ihm nichts sagst genau da 
weiter wo er in den Schlaf gefallen ist.

einfach seriell so wie C eben ist.

Ich habe einmal eine Jump : Marke anweisung verwendet, aber ich denke 
dass empfiehlt sich nicht wirklich.

Eigentlich alle in einer großen while Schleife laufen lassen und bei 
aufwecken eben den gewünschten Teil neu initialisieren.

von Clemens L. (c_l)


Lesenswert?

Du solltest dich entscheiden, ob du LPM3.5 oder LPM4.5 willst. (Das 
macht für dieses Problem aber keinen Unterschied.)

Was misst du am VCORE-Pin?

Welchen Wert (oder welche Werte) hat SYSRSTIV?

von sleep_msp_sleep (Gast)


Lesenswert?

Hi,

es lag doch am Debugger. Den sollte man vollständig abziehen. Dann muss 
man sich auch nicht wundern ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.