STM32L4 Standby-Mode

OP #7705727
Lesenswert?

Moin Leute,

Ich frage mich gerade ob ich zu bloed zum programmieren bin und brauch da mal eine externe Bewertung. :-D

Ich habe hier zwei Board mit einem STM32L451 und eines mit einem STM32L452 (STM Nucleo)

Ich habe zu testzwecken meinen eigentlichen Code komplett runtergestrippt.

Ich schalte alles aus:

1
  led_reset();
2

3
  GPIO_InitStruct.Pin = LL_GPIO_PIN_ALL;
4
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
5
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
6
  GPIO_InitStruct.Alternate =  LL_GPIO_AF_0;
7

8
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
9
  LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
10
  LL_GPIO_Init(GPIOC, &GPIO_InitStruct);
11
  LL_GPIO_Init(GPIOD, &GPIO_InitStruct);
12
  LL_GPIO_Init(GPIOE, &GPIO_InitStruct);
13
  LL_GPIO_Init(GPIOH, &GPIO_InitStruct);
14

15
  //Sollte ueberfluessig sein
16
  LL_AHB2_GRP1_DisableClock(LL_AHB2_GRP1_PERIPH_GPIOC); //Disable PortC                              
17
  LL_AHB2_GRP1_DisableClock(LL_AHB2_GRP1_PERIPH_GPIOB); //Disable PortB                              
18
  LL_AHB2_GRP1_DisableClock(LL_AHB2_GRP1_PERIPH_GPIOA); //Disable PortA                              
19

20
  //auch ueberfluessig weil sowieso nicht genutzt
21
  LL_APB1_GRP1_DisableClock(LL_APB1_GRP1_PERIPH_SPI2);
22
  LL_APB1_GRP1_DisableClock(LL_APB1_GRP1_PERIPH_I2C1);
23
  LL_AHB2_GRP1_DisableClock(LL_APB2_GRP1_PERIPH_USART1);
24

25
  LL_APB2_GRP1_DisableClock(LL_APB2_GRP1_PERIPH_SYSCFG);
26

27
  //macht man das nicht ist die Stromaufnahme mit angestecktem
28
  //j-link leicht erhoeht.
29
  LL_DBGMCU_DisableDBGStopMode();
30
  LL_DBGMCU_DisableDBGStandbyMode();
31

32
  __disable_irq();
33

34
  HAL_SuspendTick();
35

36
  PWR->CR1 &=(uint32_t)  ~PWR_CR1_LPMS;
37
  PWR->CR1 |=(uint32_t)  PWR_CR1_LPMS_STANDBY;
38

39
  SCB->SCR |= (uint32_t) SCB_SCR_SLEEPDEEP_Msk;
40

41
  while(1)
42
    {
43
      __ASM volatile ("wfi");
44
    }

Die Controller stehen dann. Aber alle drei Controller ziehen dann noch 140uA. Also etwa 10x mehr wie man es erwarten sollte.

Hab ich noch irgendwas uebersehen?

Beim Nucleoboard messe ich direkt an JP6, also die Corespannungen. Auf meinen Testboards ist nichts drauf bis auf einen externen Quarz und eine LED die mit Widerstand an einem Port haengt, aber hier abgeschaltet ist.

Vanye

OP #7706262
Lesenswert?

Welchen Wert erwartest Du denn?

Nun ja, Standby mode. kein Sleep mode!

Datenblatt (Rev4) Seite 106, Tabelle 38, 3.3V Vcc, 25Grad Raumtemperatur. also so in der Gegend von 720nA. Also sagen wir mal 1uA. Das zehnfache 10uA wuerde mich jetzt auch nicht umbringen, aber 140uA ist so heftig viel das da noch irgendwas laufen muss was ich uebersehen habe.

Vanye

#7706370
Lesenswert?

Man muss vor dem Zugriff auf das PWR Modul dessen Clock einschalten (PWREN in RCC_APB1ENR1). Wenn man das macht kommt man auf die niedrigen Werte des Datenblatt.

Mit einem NUCLEO-L476RG ist das reproduzierbar: schaltet man die PWR Clock nicht ein sind es ca. 120 µA im Standby, mit PWR Clock zeigt ein einfacher Multimeter 0 µA an.

OP #7706509
Lesenswert?

Man muss vor dem Zugriff auf das PWR Modul dessen Clock einschalten (PWREN in RCC_APB1ENR1).

Super das wars! Du hast das Weltklima gerettet. :-D

Wenn man das macht kommt man auf die niedrigen Werte des Datenblatt.

Jetzt sind 12.8uA. Vielleicht muss ich die Platine nochmal ordentlich putzen. :)

Aber erstaunlich. Es geht alles, der ist ja vorher von seinem normalen Betriebsstrom auch runter gefahren, aber irgendein Detail fehlt dann noch...

Vanye

#7706513
Lesenswert?

Vanye R. schrieb:

Ich frage mich gerade ob ich zu bloed zum programmieren bin

Diese Frage musste ich mir bei einem der STM32 auch stellen. Das liegt aber schon soweit zurück, dass ich mich auf die Einzelheiten jetzt nicht mehr erinnern kann. Das Problem habe ich mit einem TPL5111 gelöst und damit für eine bestimmte Zeit allem den Strom abgedreht. Der Verbrauch sank dann auf ein paar nA ... aber mein Ego hast sich von diesem Schock immer noch nicht erholt.

Dass es aber geht, habe ich kürzlich bei einem Webinar von ST gesehen (STM32U0). Die Angaben im Datenblatt sind also durchaus real und die HAL scheint auch zu funktionieren.

#7706523
Lesenswert?

Vanye R. schrieb:

Jetzt sind 12.8uA. Vielleicht muss ich die Platine nochmal ordentlich putzen. :)

Ich habe hier bei dem NUCLEO-L476RG zum Experimentieren mit dem Standby auch noch folgendes drinnen um den Debug-Modus abzuschalten:

1
CoreDebug->DHCSR = 0xA05F0000;

Ob das den Unterschied ausmacht weiss ich aber nicht.

Mit dem APC Bit in PWR_CR3 könnte man ebenfalls experimentieren, dann braucht man die GPIOs nicht gezielt abschalten, zumindest solange PWR_PUCRx und PWR_PDCRx auf den Reset-Defaults stehen.

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