STM32 Low Power: LSI? Strombedarf?

Gast #7125566
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
Gast #7125629
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.
Gast #7125952
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
}
#7126281
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?
Gast #7126341
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.
(Firma: Wilhelm.Consulting) #7126710
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
Gast #7126988
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.
Gast #7126997
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).
Gast #7127146
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...

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