Stromverbrauch des ARM Cortex M – Schlafen mit höheren Taktraten im Vergleich zu niedrigeren Taktraten

Ich fange mit Cortex M-Prozessoren an, habe aber viel Erfahrung mit 8-Bit-MCUs.

Angenommen, ich habe einen Puffer, der alle 5 ms aktualisiert werden muss. Es gibt einen Interrupt, der alle 5 ms geht, und der Puffer wird aktualisiert und die erforderlichen Berechnungen werden ausgeführt. Die MCU geht wieder schlafen, bis der nächste Interrupt auftritt.

Bei 500 KHz auf meiner 8051 MCU dauert diese Aufgabe 3 ms. Bei 32 MHz auf meiner 8051 MCU dauert diese Aufgabe (erfundene Zahl) 0,2 ms.

Beim 8051 stellte ich fest, dass es weniger Strom benötigte, um die MCU tatsächlich mit 500 kHz zu betreiben und zwischen dem 5-ms-Interrupt kürzer zu schlafen, als sie mit der höchsten Geschwindigkeit (32 MHz) zu betreiben und länger zu schlafen.

Auf einem PIC waren es die umgekehrten Ergebnisse. Es war besser, die MCU schnell laufen zu lassen und schnell in den Ruhezustand zu versetzen. (PIC hat eine großartige AppNote zum Energiesparen, und sie nennen beide Ansätze.)

Ist es für die Cortex M-Prozessoren energieeffizienter, das System schnell zu betreiben und schnell in den Ruhezustand zu versetzen? Oder sollten Sie die langsamste Taktrate anstreben?

Ich verstehe, dass diese Berechnung aufgabenabhängig ist. Wenn Sie einen 48-MHz-Interrupt benötigen (oder was auch immer die maximale Taktgeschwindigkeit der MCU ist), ist dies offensichtlich ein strittiger Punkt.

Aber im Allgemeinen, was haben Sie beim Power-Profiling Ihrer Systeme gesehen?

Ich bin mir sicher, dass der Cortex M weniger Energie pro MHz-Steigerung gemäß dem Datenblatt verbraucht, aber ich bin verdammt, wenn mein 8051 dasselbe sagt, aber in Wirklichkeit überhaupt nicht so funktioniert, als ich anfing, in den Energiesparmodi zu mischen .

Wenn ich sehe, dass der in den Nordic BLE-Chips verwendete Cortex M4F mit 64 MHz läuft und im Durchschnitt sehr wenig Strom verbraucht, denke ich, dass schnelle Bursts und langes Schlafen effizienter sind. In meinen Projekten ist der Controller die ganze Zeit aktiv, daher habe ich keine Messungen dazu. Ein Kollege sagte, dass die Weckzeit der Uhr der entscheidende Unterschied zwischen zwei Controllern (beide Cortex M0) sei, daher bin ich mir nicht sicher, ob es dafür eine allgemeine Antwort gibt.

Antworten (1)

Dies hängt sehr von Ihrer genauen Anwendung, der genauen MCU und der genauen Schaltung ab. Es gibt keine definitive Wahl zwischen „viel schlafen, schnell laufen“ oder „immer langsam laufen“, da es viele Möglichkeiten gibt, zu „schlafen“ und „zu laufen“.

Die meisten MCUs haben unterschiedliche "Tiefen" von Schlafmodi. Sie können mit dem internen 32-kHz-Oszillator schlafen, aufwachen und dann von einem schnelleren internen Oszillator laufen oder eine interne PLL starten und den Oszillator multiplizieren, um eine höhere Geschwindigkeit zu erreichen (aber die PLL braucht Zeit = Strom zum Starten). externen Kristall (es braucht auch Zeit und Kraft, um sich zu stabilisieren).

Einige MCUs verfügen über Peripheriegeräte, die viel leisten können, ohne die MCU überhaupt zu verwenden (z. B. das PRS in EFM32). Wenn Sie sagen, dass Sie einen periodischen Interrupt benötigen, um etwas zu berechnen, müssen Sie wahrscheinlich auch die Daten abrufen (es sei denn, es kommt nur auf den internen Zustand an). Einige MCUs können Timer und DMA verwenden, um den ADC auszulösen, Daten zu übertragen und die CPU nur aufzuwecken, wenn z. 1000 Muster sind fertig, sodass Sie viel länger schlafen können, wenn Sie nur die Anforderungen Ihrer Anwendung ändern.

Bei einem Projekt, an dem ich gearbeitet habe, hatte ein STM32L011 die beste Energieeffizienz, wenn er mit einem internen 32-kHz-Oszillator schläft und mit einem internen 2,1-MHz-Oszillator läuft. Verallgemeinern Sie nicht. Wenn meine Berechnungen anspruchsvoller wären, könnte eine Erhöhung der Taktgeschwindigkeit zur Reduzierung der Verarbeitungszeit möglicherweise zu einer besseren Energieeffizienz führen (selbst auf Kosten des Wartens auf die Neukonfiguration und Stabilisierung des Taktsystems).

Ist 2,1 MHz die maximale Geschwindigkeit, mit der der Oszillator auf der L-Serie laufen kann? (Ich bin hauptsächlich ein 8-Bit-Typ, ich kenne den Bereich von ARM Cortex M nicht - ich vermute nicht). Haben Sie versucht, die Uhr zu erhöhen, um den internen Oszillator zu beschleunigen und Ihre aktuelle Geschwindigkeit zu messen? Die Frage bezieht sich nicht wirklich auf die Schlafmodi. Halten Sie einfach den gewünschten Schlafmodus konstant. Haben Sie bei der Messung einen Vorteil in der Burst-Verarbeitung gesehen?
Ich denke, es ist der Standard-HSI-Oszillator (interner Hochgeschwindigkeitsoszillator) bei STM32s, aber ich habe nur den STM32L011 verwendet. Behandeln Sie Cortex-M nicht als etwas Einheitliches – ein STM32L011 unterscheidet sich stark von einem MKE06Z128 (beide M0+) und noch mehr von einem NXP K64. Das Uhrensystem ist zwischen den Herstellern (und Familien) völlig unterschiedlich. Die "einzige" Gemeinsamkeit sind Befehlssatz, Systick und Debug-Register.