Forum: Mikrocontroller und Digitale Elektronik STM32 Low Power: LSI? Strombedarf?


von Christin (Gast)


Lesenswert?

Hallo zusammen :)
Ich habe einen STM32G031 und ihn so konfiguriert, dass ich mit dem HSI 
im Low Power Mode bei 1MHz auf ca 250µA komme. Jetzt möchte ich den 
Strombedarf noch weiter senken und dafür den LSI mit 32kHz nutzen. 
Konfiguriere ich den LSI, läuft der Controller zwar mit 32kHz (Programm 
funktioniert und MCO kontrolliert), benötigt aber 10mA bei selber 
Anwendung.

Es läuft nur TIM1 mit CH1: IC, CH2: IC, CH4: OC

Was habe ich falsch gemacht. Die Dokumentation sagt irgendwas im kleinen 
µA-Bereich :/

Danke

von Sodalit (Gast)


Lesenswert?

Misst du den Strom auf einem Entwicklungsboard? An welcher Stelle?

Die Entwicklungsboards haben immer einen höheren Strombedarf, weil LDO, 
LEDs und Co noch mit versorgt werden.

von Christin (Gast)


Lesenswert?

Ich messe genau vor dem Controller. Und wie gesagt komme ich mit dem HSI 
auch auf 250 µA bei 1 MHz. Schalte ich um auf LSI benötigt er 10 mA bei 
32 kHz. Also das 40 fache bei 1/32 Frequenz. Somit das 1200 fache pro 
Takt. Für mich ist das nicht mehr ganz erklärbar.

von Stefan F. (Gast)


Lesenswert?

Vielleicht gast du irgend etwas zu schnell nacheinander konfiguriert.

von Ersthelfer (Gast)


Lesenswert?

Schrittweise vorgehen.
Alle Peripherie ausschalten.
Am besten selbst die entsprechenden Register setzen.
KEINE HAL, KEINE STDLIB...

Ein STM32L152 erreicht bequem wenige µA mit dem LSI.

von Christin (Gast)


Lesenswert?

Ersthelfer schrieb:
> Alle Peripherie ausschalten.

Wie schalte ich die aus?

Ich habe jetzt ein wirklich minimalistischen Programm geschrieben. LSI 
läuft und HSI ist abgeschaltet. Und dennoch zieht der Controller 9.8 mA 
bei 32 kHz (zum Vergleich: 25µA bei 1 MHz).
1
int main(void)
2
{
3
  /* Enable LSI */
4
  SET_BIT(RCC->CSR, RCC_CSR_LSION);
5
6
  /* Check if LSI is ready */
7
  while (!READ_BIT(RCC->CSR, RCC_CSR_LSIRDY)){
8
    __NOP();
9
  }
10
11
  /* Switch to LSI as SysClock */
12
  SET_BIT(RCC->CFGR, RCC_CFGR_SW_0);
13
  SET_BIT(RCC->CFGR, RCC_CFGR_SW_1);
14
15
  /* Disable HSI */
16
  CLEAR_BIT(RCC->CR, RCC_CR_HSION);
17
18
  /* Check if HSI is off */
19
  while (READ_BIT(RCC->CR, RCC_CR_HSIRDY)){
20
      __NOP();
21
  }
22
23
  /* Startup Delay */
24
  for (uint32_t i = 8000; i != 0; i--){
25
    __NOP();
26
  }
27
28
  while (1)
29
  {
30
  __NOP();
31
  }
32
}

von Bauform B. (bauformb)


Lesenswert?

Christin schrieb:
> /* Switch to LSI as SysClock */
>   SET_BIT(RCC->CFGR, RCC_CFGR_SW_0);
>   SET_BIT(RCC->CFGR, RCC_CFGR_SW_1);

Damit schaltest du vom HSI16 zuerst auf den HSE um und dann erst auf den 
LSI. Da der HSE wohl nicht läuft, wäre der Takt komplett abgeschaltet. 
Normal erlaubt die Hardware solche Zustände nicht, aber was genau 
passiert in diesem speziellen Fall?

von Christin (Gast)


Lesenswert?

Bauform B. schrieb:
> Damit schaltest du vom HSI16 zuerst auf den HSE um und dann erst auf den
> LSI. Da der HSE wohl nicht läuft, wäre der Takt komplett abgeschaltet.
> Normal erlaubt die Hardware solche Zustände nicht, aber was genau
> passiert in diesem speziellen Fall?

Im Statusregister wurde LSI aber als ready angezeigt. Ich hattes es 
zudem auch mit
1
WRITE_REG(RCC->CFGR, (READ_REG(RCC->CFGR) & ~(RCC_CFGR_SW_2)) | 
2
RCC_CFGR_SW_1 | RCC_CFGR_SW_0);
probiert - identisches Ergebnis. Und wie gesagt, der Takt funktioniert, 
es geht mir um die Stromaufnahme.

Einen interessanten Aspekt konnte ich jedoch herausfinden: Ich habe ein 
offizielles STM-Beispiel zur Benutzung des LSI-Quarzes ohne Änderung auf 
den MCU geladen und... Stromaufnahme IM LSI-Modus: 15 mA. Ich frage 
mich, wie das sein kann und gehe momentan von einem Hardware-Problem 
aus.

von Bauform B. (bauformb)


Lesenswert?

Könntest du evt. ein Schaltbild und die beiden ELF-Dateien (also dein 
Minimalprogramm und das von STM) hier veröffentlichen? Vielleicht sieht 
jemand den "Kurzschluss".

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


Lesenswert?

Floatende Pins sind gerne eine Quelle für hohen Ruhestromverbrauch. Alle 
unbenutzten Pins auf "analog" setzen hilft dagegen.

von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

Hast du schon mal versucht den Chip zu tauschen?

Ich hatte mit den low-power Varianten schonmal ESD Probleme beim 
"schnell mal einlöten"... einmal falsch "erwischt" und die Dinger ziehen 
massig Strom.

Das kannte ich bis dort hin von den STM32F Typen nicht.

73

von Christin (Gast)


Lesenswert?

Ok, also mein Betreuer hat jetzt nochmal wirklich ein Mini-Programm 
geschrieben und damit läuft der Controller jetzt mit 100µA. Das ist aber 
eig auch noch zu viel, weil laut Dokumentation es irgendwo bei 16 µA 
liegen sollte.

Es scheint so, als ob durch irgend eine Library noch irgendetwas 
eingeschaltet war, das für den massigen Strombedarf sorgte.
1
#include <stm32g031xx.h>
2
 
3
void main(void){
4
  /* Enable LSI */
5
  RCC->CSR |= RCC_CSR_LSION;
6
  /* Check if LSI is ready */
7
  while (!(RCC->CSR & RCC_CSR_LSIRDY)){
8
  }
9
  /* Switch to LSI as SysClock */
10
  RCC->CFGR = (RCC->CFGR & ~(RCC_CFGR_SW_2)) | RCC_CFGR_SW_1 | RCC_CFGR_SW_0;
11
  /* Disable HSI */
12
  RCC->CR &= ~(RCC_CR_HSION);
13
  /* Check if HSI is off */
14
  while (RCC->CR & RCC_CR_HSIRDY){
15
  }
16
  /* Loop forever */
17
  while (1){
18
  }
19
}

Ich hatte auch mehrere Controller schon verwendet und probiert. Die 
Stromaufnahme war überall sehr ähnlich.

von Stefan F. (Gast)


Lesenswert?

Ich sehe da keinen Code, der alle unbenutzten I/O Pins auf einen 
definierten Logikpegel setzt. 100µA sind schnell erreicht, wenn da ein 
paar Pins herum flattern. Das gilt auch für beiden Pins vom HSI (PF0 und 
PF1).

von Ersthelfer (Gast)


Lesenswert?

> als ob durch irgend eine Library noch irgendetwas
> eingeschaltet war

Nun ja, was schrub ich:
> Am besten selbst die entsprechenden Register setzen.
> KEINE HAL, KEINE STDLIB...
Das Headerfile ist natuerlich O.K.

Manche Runtime dreht vor der main.c bereits am Takt.
Am besten mal mit dem Debugger begucken.

Ansonsten kann man auch mit dem Debugger die Register setzen...

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.