SmartConnector: Low Power Anbindung im IoT Umfeld (VLLS3 Restore auf einem ARM Cortex KW40Z)
Für ein Projekt im Maschinenumfeld sollen mehrere IoT-Devices mit Bluetooth Anbindung eingesetzt werden. Als Anforderung steht ein Strombedarf von einigen uA. Der verwendete Mikrocontroller MKW40Z (mit Bluetooth) bietet hierfür den speziellen Betriebsmode VLLS3 (Very Low Leakage Stop Mode) an. Dieser Mode schaltet dabei alle Peripherie Module und auch den Core aus. Einzig das RAM bleibt erhalten. Nach dem Aufwachen aus dem VLLS3 wird das Programm fortgeführt. Das Aufwachen erfolgt über den RTC. Die Anwendung läuft von einer Primärzelle und soll als weitere Anforderung eine Laufzeit von mehr als einem Jahr erreichen.
Low Power Berechnungen
Die Werte des Datenblattes für den VLLS3 Mode ergeben folgende Werte: (Der MKW40Z wird im DC/DC Buck mode betrieben)
SW
Das Kinetis KSDK_1.3.0 Demoprogramm power_manager_hal_demo von Freescale liefert einen einfachen Einstieg in die VLLS3 Thematik. Das Demoprogramm tritt in den VLLS3 State ein, unglücklicherweise erfolgt jedoch das Aufwachen über die normale Reset Abfolge. Das heisst: Initialisieren von RAM, Stack Pointer SP, Variablen, etc. Dieses Verhalten ist alles andere als gewünscht, da der erhaltene RAM Speicher gar nicht genutzt wird und dadurch Zeit und Energie verloren geht.
Bild 1: Programm flow in power_manager_hal_demo für VLLS3 mit RTC wakeup
Der gewünscht Programmablauf wäre jedoch:
Bild 2: Gewünschter Programm flow mit VLLS3
Aus dem Datenblatt kann entnommen werden, dass beim einem Aufwachen aus dem VLLS3 Mode das Bit RCM_SRS[WAKEUP] gesetzt ist. Mit folgenden Schritten lässt sich das gewünschte Verhalten erreichen:
Vor dem VLLS3 Mode:
- Speichern der CPU Register auf dem Stack
- PC+XX (PC des weiterführenden des Programms) auf dem Stack speichern
- Stack Pointer absolut in RAM speichern
Nach dem Aufwachen:
- Unterscheidung ob POR Reset oder ein Wakeup
- SP aus absoluter RAM Adresse lesen
- PC zurückladen und setzen
- Register zurückladen
- HW neu initialisieren
Konkret sieht der Programmfluss nun so aus:
Bild 3: Konkret Programmfluss mit VLLS3
Strommessung
Um die ca. 2 uA mit +/- 5 % Genauigkeit zu messen, wird auf folgende Schaltung zurückgegriffen:
Bild 4: Messschaltung
Somit entspricht 0.1 V gemesse Spannung einem Strom von 1 uA. Der Messbereich wird von der Diode begrenzt, was bei einer BAV99L maximal 0.4 V sind. Durch die Diode fliesst der Strom nur, wenn der uC im Run Mode läuft.
Messung:
VBattery = 2.5 V
Gemessene Spannung Vpeak: 267mV, Vlow: 138mV ->Vmittel: 202mV -> I = 2 uA, was genau den Erwartungen entspricht.
Bild 4: Strom KO Plot, bei einem VLLS3 Wakeup Intervall von 10 s
Fazit
Der VLLS3 Mode ist für Low Power Designs unverzichtbar. Da der Core abgeschaltet wird, ist das “Restoren” etwas aufwendiger. Es sind einige Zeilen Assembler Anweisungen für die Wiederinitialisierung zu schreiben.
Unglücklicherweise ist nach dem VLLS3 Mode das Debugging nicht immer möglich.
Unter IAR und mit JLink ist es möglich, wenn im unter settings\*.jlink folgenede anweisung hinzugefügt wird:
[CPU]
LowPowerHandlingMode = 1
Bemerkung
Achtung: Über Pullup Widerstände von Vbat(3V) auf Vcc (1.8V) kann ein Strom über die interne Schutzdiode fliessen. Dieser Strom verhindert ein Regeln von Vcc(1.8V) und Vcc(1.4V) und damit ist ein ordnungsgemässes Rückkehren aus dem VLLS3 Mode nicht mehr garantiert.