Forum: Mikrocontroller und Digitale Elektronik STM32: DMA mit 8 MHz Chiptakt?!


von Chris (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin gerade auf ein kurioses Problem mit meinem STM32L151 gestoßen.

Ich habe einen ADC von welchem ich 2 Kanäle mittels DMA auslesen und in 
ein Array schreiben lasse. Das ganze ist timergesteuert und wird alle 
80µs ausgeführt. Zur Takterzeugung ist ein externer 8 MHz Quarz 
verbunden. Nach der ADC Wandlung (für Fall 1) bzw. dem DMA 
Schreibvorgang (Fall 2) wird ein Interrupt ausgelöst, in welchem aber 
nur die neuen ADC Werte in eine andere Variable aufaddiert wird. Soweit 
sogut, alles funktioniert einwandfrei wenn

1) kein DMA und nur ein ADC Kanal verwendet wird, so gut wie alle Takte 
(AHB, APB, SYSCLK etc) laufen mit 8 MHz
2) DMA zum auslesen beider ADC Kanäle verwendet wird, SYSCLK muss 
allerdings mindestens 12 MHz betragen.

Ich hätte nun aber gerne 2. allerdings nur mit 8 MHz um den 
Stromverbrauch zu drücken. Stell ich das aber (mittels der Excel Tabelle 
von ST) um, wird der DMA Interrupt einfach nicht mehr ausgeführt!

Ich frage mich nur, warum das so ist? Im RM konnte ich nichts dazu 
finden und auch so ist es mir etwas unerklärlich...

Im Angang ein Minimalbeispiel das ich zum testen verwende. Wenn 
gewünscht kann ich die system_stm32l1xx.c, in welcher die Taktraten 
eingestellt werden, auch nachreichen

von Frank B. (f-baer)


Lesenswert?

Chris schrieb:
> Ich hätte nun aber gerne 2. allerdings nur mit 8 MHz um den
> Stromverbrauch zu drücken. Stell ich das aber (mittels der Excel Tabelle
> von ST) um, wird der DMA Interrupt einfach nicht mehr ausgeführt!

Schon wieder so ein Unfug.
Schick den Controller in den Sleep-Modus, wenn du ihn nicht brauchst und 
lass ihn vom DMA-Interrupt aufwecken. Wenn der durch ist, geht es wieder 
in den Sleep. Dann kannst du ihn auch mit 72MHz betreiben und 
verbrauchst immernoch weniger Strom.

Niedrig takten spart keinen Strom. Intelligentes Programmdesign spart 
Strom!

von Jonas Biensack (Gast)


Lesenswert?

>Niedrig takten spart keinen Strom.

Oh doch. Siehe Intel, Amd, Nvidia, Arm etc. die es alle so machen.

Gruß Jonas

von (prx) A. K. (prx)


Lesenswert?

Jonas Biensack schrieb:
>>Niedrig takten spart keinen Strom.
>
> Oh doch. Siehe Intel, Amd, Nvidia, Arm etc. die es alle so machen.

Schon mal einen µC gesehen, der bei niedrigem Takt seine 
Versorgungsspannung reduziert?

von Frank B. (f-baer)


Lesenswert?

Jonas Biensack schrieb:
>>Niedrig takten spart keinen Strom.
>
> Oh doch. Siehe Intel, Amd, Nvidia, Arm etc. die es alle so machen.
>
> Gruß Jonas

Äpfel... Birnen... Und der Preis für den dümmsten Vergleich geht an...

von Jonas Biensack (Gast)


Lesenswert?

>Schon mal einen µC gesehen, der bei niedrigem Takt seine
>Versorgungsspannung reduziert?

:)

Ich dachte die Umschaltverluste reduzieren sich bei niedrigerem Takt und 
damit wird weniger Strom verbraucht? Lieg ich falsch?

Gruß Jonas

von Chris (Gast)


Lesenswert?

Frank Bär schrieb:
> Schick den Controller in den Sleep-Modus, wenn du ihn nicht brauchst und
> lass ihn vom DMA-Interrupt aufwecken.

Mal unabhängig davon dass es mir bei der Fragestellung leider nicht 
weiterhilft: Das ist für später geplant, aber da werde ich erst mal 
prüfen müssen ob es geht bzw wie aufwändig es ist. Nebenbei läuft 
nämlich noch ein DAC-Output (neue Ausgabe alle 40 µs), USART und diverse 
Berechnungen in der Main.

Das der Stromverbrauch (auch wenn er nicht verbraucht wird ;-P ) runter 
geht konnte ich übrigens schon nachmessen, damit ist das Thema vom Tisch

von Frank B. (f-baer)


Lesenswert?

Im Übrigen: Richtig sparsam würde es hier, wenn ein externer Timer die 
80µs-Intervalle erzeugen würde. Dann könnte man nämlich den Stop-Mode 
des Controllers nutzen.
Meiner Erfahrung nach ist Runtertakten nur dann überhaupt eine Option, 
wenn man sich durch schlechtes Design von vornherein die wirklich 
effektiven Stromsparoptionen verbaut hat.

von Davis (Gast)


Lesenswert?

@ Frank Bär

> Meiner Erfahrung nach ....

Hier sind Fakten gefragt, nicht Erfahrungen und Meinungen.

Also: vorrechnen & belegen.

von Frank B. (f-baer)


Lesenswert?

Chris schrieb:
> Das der Stromverbrauch (auch wenn er nicht verbraucht wird ;-P ) runter
> geht konnte ich übrigens schon nachmessen, damit ist das Thema vom Tisch

Das hat auch niemand bezweifelt. Aber wenn du dir die Tabellen im 
Datenblatt ansiehst, dann stellst du fest, dass Stromverbrauch und 
Taktfrequenz nicht linear zueinander sind. Eine Absenkung des Taktes von 
16MHz auf 8MHz reduziert den Verbrauch um 40%, erhöht aber die benötigte 
Rechenzeit um 50%.

Effektiv erhöht sich also der mittlere Stromverbrauch um ca. 20%, wenn 
du runtertaktest, weil du weniger Zeit im Sleep-Modus verbringst.
Und noch dazu: Wenn du mit 40µs Zykluszeit arbeiten willst, hast du bei 
8MHz 32 Takte zur Ausgabe auf dem DAC. Da bleibt kaum Rechenzeit für 
UART und Berechnungen über.

@Jonas du solltest mal nachlesen, was ein Mikrocontroller ist. Mit solch 
akademischen Diskussionen spart man keinen Strom sondern verschwendet in 
dem Fall nur Zeit. Schau dir die Datenblätter der ICs an und hör auf, so 
einen Unsinn zu verbreiten.

von Klaus W. (mfgkw)


Lesenswert?

Jonas Biensack schrieb:
> Ich dachte die Umschaltverluste reduzieren sich bei niedrigerem Takt und
> damit wird weniger Strom verbraucht? Lieg ich falsch?

Der Strom (auf die Zeit bezogen) reduziert sich natürlich bei 
niedrigerem Takt, aber linear zur Taktrate natürlich auch die 
verrichtete Rechenarbeit.

Wenn du jetzt niedriger taktest, brauchst du länger bis du mit irgendwas 
fertig bist und hast mit (niedrigerer Strom)*(längere Zeit) genauso viel 
Energie verbraucht. (*) bzw. sogar mehr, weil I nicht lienar sinkt - wie 
Frank oben sagte.

Mit niedrigerem Takt kannst du sparen, wenn du im Leerlauf sinnlose 
Endlosschleifen drehst.

von Chris (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Der Strom (auf die Zeit bezogen) reduziert sich natürlich bei
> niedrigerem Takt, aber linear zur Taktrate natürlich auch die
> verrichtete Rechenarbeit.

Auch wahr, das hatte ich nicht bedacht. Nun gut, dann lass ich den µC 
erst mal auf 12 oder 16 MHz laufen und werde den Sleepmode früher in 
Angriff nehmen als geplant ;)

Trotzdem würde mich interessieren warum der DMA bei 8 MHz nicht mehr 
mitspielt...

von Frank B. (f-baer)


Lesenswert?

Davis schrieb:
> @ Frank Bär
>
>> Meiner Erfahrung nach ....
>
> Hier sind Fakten gefragt, nicht Erfahrungen und Meinungen.
>
> Also: vorrechnen & belegen.

100 beispielhafte Befehle brauchen 200 beispielhafte Takte. bei 8MHz 
dauert das 25µs. lt. Datenblatt: 25µs*12.5mA = 312.5nAs
bei 72MHz dauert das ganze dann 2.8µs, macht 189nAs. Dazu kann ich noch 
22,2µs in Stop-Modus verbringen. Im WorstCase (TA = 105°C) nochmal 
37,3nAs. Macht in Summe unter 230nAs für die selbe Berechnung. Das ist 
nicht 100% exakt, aber als Abschätzung erst einmal genug.

von (prx) A. K. (prx)


Lesenswert?

Jonas Biensack schrieb:
> Ich dachte die Umschaltverluste reduzieren sich bei niedrigerem Takt und
> damit wird weniger Strom verbraucht? Lieg ich falsch?

Beim gleichen Prozessor und gleicher Versorgung ist der Energieverbrauch 
pro Arbeitsschritt des Mikrocontrollers in grober Näherung konstant, 
weil sich an der Anzahl Schaltvorgänge nichts ändert. Wenn die Anzahl 
Arbeitsschritte für eine gegebene Aufgabe feststeht - also keine 
zeitgebundenen Warteschleifen dabei sind - dann ist also der 
Energieverbrauch der Aufgabe näherungsweise konstant (Energie = Leistung 
x Zeit).

Diese Rechnung gilt allerdings nicht für verschiedene Prozessoren, bei 
verschiedenen design rules in der Herstellung, bei taktabhängiger 
Energieversorgung, oder wenn die Leckströme einen erheblichen Anteil am 
Stromverbrauch haben. Analoge Komponenten wie ADCs oder evtl. auch 
bestimmte Arten der Taktversorgung spielen ebenfalls eine gesonderte 
Rolle.

Wenn man die Versorgungsspannung reduziert, dann reduziert sich der 
Energieverbrauch pro Arbeitsschritt (ebenso der Leckstrom), aber auch 
die maximal erreichbare Schrittfrequenz. Die Aufgabe benötigt dann 
länger, aber der Gesamtenergieverbrauch sinkt.

Komplizierter wird es bei komplexen Prozessoren mit selektiver 
Totalabschaltung diverser Komponenten, da dadurch zwar der Leckstrom 
ausgeschaltet wird, aber dafür die Anlaufzeit frisch eingeschalteter 
Komponenten neu ins Spiel kommt.

von Chris (Gast)


Lesenswert?

Danke für die guten Beiträge, das ist auf jeden Fall noch ein Bereich 
den ich angehen muss.

Zur eigentlichem DMA Frage hat wirklich keiner eine Idee?

von Frank B. (f-baer)


Lesenswert?

Zumindest auf die Schnelle habe ich im Datenblatt nichts dazu gefunden. 
Ich meine aber, dass der ADC beim STM32 nur in einem bestimmten 
Frequenzfenster funktioniert. Kann es sein, dass dein AHB-Prescaler zu 
groß ist?

von Chris (Gast)


Lesenswert?

Frank Bär schrieb:
> Ich meine aber, dass der ADC beim STM32 nur in einem bestimmten
> Frequenzfenster funktioniert. Kann es sein, dass dein AHB-Prescaler zu
> groß ist?

ADC, DMA oder beides in Kombination? ADC einzeln funktioniert ohne 
Probleme mit nur 8 MHz. Der AHB Prescaller steht eh nur auf 1, egal ob 
in der jetzigen Konfiguration mit 12 MHz SYSCLK oder zuvor mit 8 MHz

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
Noch kein Account? Hier anmelden.