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 ...