Forum: Mikrocontroller und Digitale Elektronik STM32L4 Standby-Mode


von Vanye R. (vanye_rijan)


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

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Welchen Wert erwartest Du denn? Welche Taktquelle, welche Frequenz? 
Vergleich mal mit Tabelle 33 Current consumption in Sleep and Low-power 
sleep modes, Flash ON  im Datenblatt.

von Vanye R. (vanye_rijan)


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

von Dieter S. (ds1)


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.

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Setze in die While Schleife nach dem Aufwachen ein GPIO Enable und GPIO 
toggle. Vielleicht laesst ja irgendwas die CPU andauernd aufwachen. Oder 
probier mal das ganze als Bare Metal. Vielleicht macht ja HAL nicht dass 
was es soll...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.