Ermitteln Sie, welcher momentane Schalter das Aufwachen einer STM32-CPU verursacht hat

Edit : Diese Frage ist falsch. Der stm325105 hat nur einen Wakeup-Pin. Andere ST-Teile haben jedoch mehr als einen Wakeup-Pin, sodass die gegebene Antwort für diese gültig ist.


Ich habe einen stm32f105, der zwei Momenttasten hat, die mit den Weckeingängen verbunden sind. Der Prozessor wird in den STANDBY-MODUS versetzt. Wenn eine der Tasten gedrückt wird oder der RTC-Timer ausgelöst wird, wacht die CPU auf.

Das Problem ist, dass ich möchte, dass die CPU verschiedene Dinge tut, je nachdem, welcher Wakeup-Eingang ausgelöst wurde. Gemäß 5.3.5 aus dem ST stm32f105xx-Referenzhandbuch werden keine Register aufbewahrt, außer einem Statusregister, das angibt, dass wir aufgeweckt wurden (aber nicht von wem) und 42 Sicherungsregister.

Der Standby-Modus ermöglicht den niedrigsten Stromverbrauch. Es basiert auf dem Deepsleep-Modus des Cortex ® -M3, bei dem der Spannungsregler deaktiviert ist. Die 1,8-V-Domäne wird folglich abgeschaltet. Außerdem werden die PLL, der HSI-Oszillator und der HSE-Oszillator abgeschaltet. SRAM- und Registerinhalte gehen verloren, mit Ausnahme von Registern in der Sicherungsdomäne und der Standby-Schaltung.

Nach dem Aufwachen aus dem Standby-Modus wird die Programmausführung auf die gleiche Weise neu gestartet wie nach einem Reset (Boot-Pins-Abtastung, Vektor-Reset wird abgerufen usw.). Das SBF-Statusflag im Leistungssteuerungs-/Statusregister (PWR_CSR) zeigt an, dass sich die MCU im Standby-Modus befand.

Dieser ST-Forenbeitrag, Wie bestimme ich den Ursprung von Wakeup from Standby? , deutet darauf hin, dass ich nicht erkennen kann, welches Wakeup in der Software ausgelöst wurde. Ich habe dort keine weiteren Beiträge gefunden, die mehr Erleuchtung brachten.

Wie kann ich Software oder Hardware verwenden, um nach dem Aufwachen festzustellen, welcher Weckeingang ausgelöst wurde?

Lassen Sie den Knopf eine Kappe aufladen und lesen Sie das
Ich habe ein paar STM32F105-Varianten nachgeschlagen, sie haben nur EINEN Wakeup-Pin. Welches Teil meinst du genau und welche Pins?
@berendi Mein STM32F105 hat, wie du sagst, nur einen Wakeup-Pin. Es ist im STOP-MODUS konfiguriert, nicht im STANDBY-Modus, wie ich in meiner Frage angegeben habe. Es verwendet EXTI-Ereignisse zum Aufwachen. Ich hatte die Bedeutung dieser "EXTI-Ereignisse" mit "Weckstiften" verwechselt. Aber ich denke, die Antwort von Olin ist immer noch nützlich, wenn jemand im STANDBY-MODUS zwischen "voken by RTC" oder "waken by wakeup pin" unterscheiden muss. Hat jemand Vorschläge, wie man diese Frage bearbeiten kann, um sie an Olins Antwort anzupassen? Eine kleine Notiz am Anfang, die beschreibt, was falsch ist? En komplett neu bearbeiten? Oder soll ich einfach die ganze Frage löschen?
Es gibt ST-Controller mit mehr als einem Wakeup-Pin, wie F0, F3, L0 oder L1, bei denen die Quelle nach dem Verlassen des Standby tatsächlich nicht ermittelt werden kann, da sie ein einziges Wakeup-Eingangsflag haben. ST hat dieses Versehen zuerst in den neuesten F7- und L4-Serien korrigiert, die separate Flags für jeden Wakeup-Eingang haben.

Antworten (1)

Ich kenne die Details dieses ST-Teils nicht, daher gehe ich davon aus, dass Ihre Beschreibung korrekt ist.

Der Prozessor sollte sehr bald aufwachen, nachdem eine der Tasten gedrückt wurde. Dies sollte insbesondere gelten, wenn es einen internen RC-Oszillator hat. Selbst wenn Sie irgendwann aus Genauigkeitsgründen von einem Kristall laufen müssen, können Sie das Teil vielleicht von einem internen RC starten lassen und später zum Kristall wechseln. Es gibt Mikros, die so etwas können, obwohl ich nicht weiß, ob Ihres dazu gehört.

In jedem Fall lesen Sie beide Eingänge so schnell wie möglich nach dem Aufwachen. Sofern an diesem ST-Mikro nichts Ungewöhnliches ist, sollte dies zwischen einer ms und einigen 10 ms ab dem Tastendruck liegen.

Um sicherzustellen, dass die Leitung immer noch niedrig ist, verwenden Sie einen Kondensator, um die Leitung für bis zu 100 ms nach dem Loslassen der Taste niedrig zu halten.

Nehmen wir zum Beispiel an, dass der garantierte logisch niedrige Eingangspegel 20 % der Versorgungsspannung beträgt. Die Leitung wird mit einem Widerstand hochgezogen und hat einen Kondensator gegen Masse. Der Taster schließt die Leitung gegen Masse kurz. Die Leitung schwebt daher hoch und wird aktiv auf Masse gezwungen, wenn der Knopf gedrückt wird. Beim Loslassen des Tasters fällt die Spannung exponentiell zur Versorgung hin ab.

Das Abfallen auf 20 % des Endwerts erfolgt in 0,22 Zeitkonstanten. Angenommen, Sie möchten sicherstellen, dass die Leitung nach einem Tastendruck 100 ms lang niedrig aussieht. Das bedeutet, dass die RC-Zeitkonstante 450 ms betragen muss. Bei 100 kΩ Pullup müsste die Kapazität 4,5 µF betragen. Eine 10-V-Kappe mit 4,7 µF würde also gut funktionieren.

Zusammengefasst ist hier die Schaltung:

Sollte umgekehrt sein, wachen STM32s bei steigender Flanke auf. Außerdem starten sie afaik immer mit der internen Uhr, die Umschaltung auf externen Quarz und PLL erfolgt über die Software. Das Problem liegt im Startcode, der vom CubeMX-Tool bereitgestellt oder generiert wird, was es etwas schwierig macht, Benutzercode vor der Einrichtung des Uhrenbaums auszuführen.