MSP430 Sleep Mode

Gast #4259299
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 ...
Gast #4259349
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
#4259351
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren