MSP430 LPM Verzweiflung

Gast #4263945
Lesenswert?

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
#4263994
Lesenswert?

sleep_msp_sleep schrieb:
> Laut Datenblatt geht er automatisch in den LPM3.5, sobald:
>  RTCCTL01 &= ~(RTCHOLD);                   // Start RTC
> gesetzt ist.

Falls du Abschnitt 13.2.6 Nr. 3 des User's Guide (nicht des Datenblatts) 
meinst: das "if the RTC is enabled with RTCHOLD = 0" bezieht sich nur 
auf den Teilsatz ab dem "except".

Und kannst du dich bitte endlich mal entscheiden, ob du LPM3.5 oder 
LPM4.5 willst?
Gast #4264002
Lesenswert?

Hi Clemens

> Und kannst du dich bitte endlich mal entscheiden, ob du LPM3.5 oder
>LPM4.5 willst?

Ich brauche die RTC, also möchte ich ganz klar LPM 3.5


Ich stolpere auch immer wieder über folgende Zeile:
1
__bis_SR_register(LPM4_bits | GIE);

Aber die Tiefschlaf-Modi werden doch darüber erreicht? 3.5 oder 4.5 
hängt dann davon ab, ob die RTC konfiguriert ist oder nicht.

Verstehe ich das richtig?
#4264053
Lesenswert?

sleep_msp_sleep schrieb:
> __bis_SR_register(LPM4_bits | GIE);
>
> Aber die Tiefschlaf-Modi werden doch darüber erreicht?

Darüber wird LPM4 erreicht (oder LPM4.5, wenn PMMREGOFF gesetzt ist).

LPM3 (oder .5) erreicht man durch setzen der LPM3_bits.

> 3.5 oder 4.5 hängt dann davon ab, ob die RTC konfiguriert ist
> oder nicht.

Nein, das ist davon unabhängig. Du kannst die RTC immer konfigurieren, 
aber wenn du dann in LPM4 gehst, läuft sie halt nicht.
Gast #4264065
Lesenswert?

Hi Clemens,

AHA! Ich habe mich hierbei an den TI Code-Beispielen orientiert, und die 
sehen beim LPM3.5 wie folgt aus:
1
void EnterLPM35(void)
2
{
3
  PMMCTL0_H = PMMPW_H;                      // Open PMM Registers for write
4
  PMMCTL0_L |= PMMREGOFF;                   // and set PMMREGOFF
5

6
  // Enter LPM3.5 mode with interrupts enabled. Note that this operation does
7
  // not return. The LPM3.5 will exit through a RESET event, resulting in a
8
  // re-start of the code.
9
  __bis_SR_register(LPM4_bits | GIE);
10
}

Ich probiere das gleich mal mit den LPM3_bits aus. Das hatte ich sogar 
schon mal, allerdings ist er dann über das Port-Interrupt nicht mehr 
aufgewacht ...

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