Hallo zusammen,
ich habe vor ein paar Tagen schon mal einen Artikel verfasst, weil ich
mit meinem MSP430FR5729 nicht in den Sleep Mode LPM3.5 kam.
Das hat sich nun erledigt. Aber schon stehe ich vor der nächsten
Herausforderung:
Die Uhr läuft im Tiefschlafmodus nicht weiter. Hier zunächst mal die
entscheidenden Stellen:
Gehe in LPM3.5:
1 | void enter_lpm35()
|
2 | {
|
3 | WDTCTL = WDTPW + WDTHOLD; // Stop WDT
|
4 |
|
5 | __disable_interrupt();
|
6 |
|
7 | P1DIR = 0xFF;
|
8 | P1OUT = 0x00;
|
9 | P2OUT = 0x00;
|
10 | P2DIR = 0xFF;
|
11 | P3OUT = 0x00;
|
12 | P3DIR = 0xFF;
|
13 | P4OUT = 0x00;
|
14 | P4DIR = 0xFF;
|
15 |
|
16 | // Configure RTC
|
17 | PJOUT = 0x00;
|
18 | PJSEL0 |= BIT4 | BIT5;
|
19 | PJDIR = 0xFFFF;
|
20 | RTCCTL01 &= ~(RTCHOLD); // Start RTC
|
21 |
|
22 | // Configure Wake-Up Pin
|
23 | P1DIR &= ~BIT0;
|
24 | P1IE |= BIT0;
|
25 | P1IFG &= ~BIT0;
|
26 |
|
27 | PMMCTL0_H = PMMPW_H; // Open PMM Registers for write
|
28 | PMMCTL0_L |= PMMREGOFF + SVSHE + SVSLE; // and set PMMREGOFF
|
29 |
|
30 | // Enter LPM4 Note that this operation does not return. The LPM4.5
|
31 | // will exit through a RESET event, resulting in a re-start
|
32 | // of the code.
|
33 | //__bis_SR_register(LPM4_bits | GIE);
|
34 | __bis_SR_register(LPM4_bits | GIE);
|
35 | }
|
Wache nach Neustart wieder auf:
1 | if (SYSRSTIV == SYSRSTIV_LPM5WU)
|
2 | {
|
3 | init_board();
|
4 |
|
5 | // Re-Init RTC
|
6 | PJOUT = 0x00;
|
7 | PJSEL0 |= BIT4 | BIT5;
|
8 | PJDIR = 0xFFFF;
|
9 | RTCCTL01 &= ~(RTCHOLD); // Start RTC
|
10 |
|
11 | PM5CTL0 &= ~LOCKLPM5;
|
12 | }
|
13 | else
|
14 | {
|
15 | init_board();
|
16 | }
|
17 |
|
18 | __enable_interrupt();
|
Der MSP430 geht definitiv schlafen und durchläuft beim aufwachen auch
die if/else Bedingung. Das habe ich ausführlich getestet.
Ich verstehe nur nicht warum die Uhr nicht weiter läuft. Laut Datenblatt
geht er automatisch in den LPM3.5, sobald:
1 | RTCCTL01 &= ~(RTCHOLD); // Start RTC
|
gesetzt ist.
Ich hoffe sehr, dass mir Jemand den entscheidenden Tipp geben kann.
#Verzweiflung :D