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
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.
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.
Vielleicht gast du irgend etwas zu schnell nacheinander konfiguriert.
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.
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 | } |
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?
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.
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".
Floatende Pins sind gerne eine Quelle für hohen Ruhestromverbrauch. Alle unbenutzten Pins auf "analog" setzen hilft dagegen.
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
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.
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).
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.