STM32F103 Energiesparmodus (Stopp)

Ich habe ein Projekt, bei dem ich versuche, den Stromverbrauch so niedrig wie möglich zu halten (auf einem STM32F103RCT6).

Ich habe mir das Dokument von ST angesehen, um den Stromverbrauch des STM32F2 so gering wie möglich zu halten, und versucht, seinen Empfehlungen zu folgen:

  • Setzen aller unbenutzten Pins auf AIN
  • Schalten Sie die ADCs aus
  • USB ausschalten
  • Verwenden von PWR_EnterSTOPMode (PWR_Regulator_LowPower, PWR_STOPEntry_WFE); um in den STOP-Modus zu gehen, während Sie mit EXTI aufwachen können

Die Stromaufnahme beträgt immer noch 4,6 mA (gegenüber 15 im Standard-WFI-Schlaf und etwa 30, wenn Sie tatsächlich etwas tun). Die Datenblätter scheinen darauf hinzudeuten, dass der Stromverbrauch im STOP-Modus unter 0,5 mA liegen sollte.

Ich habe ein Oszilloskop auf den externen Oszillator gelegt und das hört tatsächlich auf.

Gibt es irgendetwas offensichtliches, das ich vermisse? Gibt es eine Möglichkeit für mich zu überprüfen, was die zusätzliche Stromaufnahme verursachen könnte?

UPDATE : Ich habe ein sehr einfaches Testprogramm entwickelt, das aus dem Beispielcode von ST abgeleitet wurde:

#include "stm32f10x.h"

GPIO_InitTypeDef GPIO_InitStructure;


int main(void)
{
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
                         RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
                         RCC_APB2Periph_GPIOE, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  GPIO_Init(GPIOE, &GPIO_InitStructure);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
                         RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
                         RCC_APB2Periph_GPIOE, DISABLE);  

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  while (1) PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
}

Die Stromaufnahme beträgt damit immer noch 4,3 mA. Ich habe auch die Schaltung überprüft - sie ist WIRKLICH einfach und ich habe die Spannung an jedem Widerstand gemessen (und sie ist Null).

Irgendwelche Ideen? Ich denke derzeit, dass es tatsächlich der Spannungsregler LD1117 ist, der schuld ist!

Sind die internen Oszillatoren aktiv? Haben Sie Pullup-/Pulldown-Widerstände auf der Platine, an denen in diesem Modus eine Spannung anliegt? Haben Sie externe Schnittstellen (SWD-Debugger, seriell, USB usw.) angeschlossen, die Strom über die Signalleitungen ziehen (oder abgeben!) können ? Und es lohnt sich immer, die Dokumentation noch einmal durchzulesen, um etwas zu finden, das Sie hätten übersehen können.
Schon mal in die Firmwarebibliothek geschaut? Es gibt normalerweise ein Beispiel für Low-Power-Modi im IIRC. Versuchen Sie auch den Standby-Modus, da es so aussieht, als ob dies der Modus mit dem niedrigsten Verbrauch gemäß dem Referenzhandbuch ist (obwohl Sie im Stoppmodus immer noch <1 mA sehen sollten).
Ich würde vermuten, dass dies ein Hardwareproblem von Ihrer Schaltung um den Controller und nicht vom Controller selbst sein könnte. Ich dachte dasselbe wie @ChrisStratton über Pullups/downs. Und wo und wie wird gemessen? Was ist außer den unbenutzten Pins mit AIN verbunden?
Hallo. Vielen Dank für die Hilfe – und entschuldigen Sie die Verspätung, mit der ich mich bei Ihnen melde – ich war etwas beschäftigt. Ich werde versuchen, das genau zu untersuchen. Ich bin mir bei den internen Oszillatoren nicht sicher - wie würde ich das überprüfen? Es gibt einige Klimmzüge/Pulldowns – ich dachte, ich hätte diese überprüft, aber ich werde methodischer vorgehen. Ich war dem Low-Power-Beispiel gefolgt, aber die Software auf dem Gerät ist viel komplexer als das. Ich werde es vielleicht nur mit dem Beispielcode versuchen und sehen, ob das den Stromverbrauch senkt.
Ich habe gerade meinen Beitrag mit den bisherigen Erkenntnissen aktualisiert. Ich werde das vReg in Kürze auslöten und ohne es versuchen.
Falls jemand das Dokument über den Stromverbrauch des STM32F2 finden möchte, es heißt AN3430.

Antworten (1)

Wilhelmsen und Chris hatten recht – es war die Rennstrecke.

Es waren jedoch keine Widerstände, externe E / A usw. Es war der Spannungsregler LD1117, den ich vorher nicht wirklich in Betracht gezogen hatte.

Es stellt sich heraus, dass so ziemlich alle 1 A, 3,3 V LDO-Spannungsregler, die ich finden kann, einen Ruhestrom von 5 mA haben. Ich habe gerade einen MIC5205 (der für 150 mA ausgelegt ist) eingelötet und zieht jetzt 0,12 mA! \Ö/