Hallo zusammen
Ich bin ganz neu auf dem Gebiet und habe mich begonnen einzuarbeiten.
Verzeiht mir also bitte "dumme Fragen" :).
Endziel meiner Aufgabe ist es, Sensordaten kontinuierlich mittels STM32F
einzulesen (dabei mittels DMA abspeichern, damit der Cpntroller in den
SLEEP-Modus gehen kann), sobald der Buffer voll ist, soll er kurz
aufwachen um die Daten zu verarbeiten und danach wieder schlafen.
Nun habe ich mittels der HAL "Library" diverse Funktionen gefunden, habe
aber nicht wirklich den Durchblick... Kann mir evtl jemand grob
erklären, wie ich Daten (zum starten müssen das noch nicht wechselnde
Sensorwerte sein) mittels DMA schreiben, danach schlafen und bei DMA
Interrupt wieder aufwachen kann um das ganze zu wiederholen?
Vielen Dank!
DMA habe ich bisher nur in Zusammenhang mit PC Soundkarten programmiert,
deswegen kann ich Dir da nicht helfen.
Ich denke, dass du dich mit dem Referenzhandbuch deines Mikrocontrollers
auseinander setzen musst. Dort sind alle Funktionen auf Register-Ebene
erklärt. Danach kannst du die Register benutzen, oder die Doku zur HAL
lesen, um herauszufinden, wie du die Register indirekt durch die HAL
korrekt ansprichst. Mein Eindruck zur HAL Doku ist: Zu knapp, man muss
den Quelltext lesen. Der ist übrigens umfangreich kommentiert.
Für weitere Details solltest du den Mikrocontroller benennen. STM32F ist
ein sehr weites Feld von hunderten Modellen die mit unterschiedlichen
DMA Controllern bestückt sind.
Dein Wunsch, den Controller möglichst lange Schlafen zu lassen, lässt
mich vermuten, dass du Strom sparen willst oder musst. Falls dem so ist,
würde ich Dir empfehlen, einen Blick auf die STM32L0 Serie zu werfen,
denn die sind dafür optimiert.
Mir fehlen da einige Infos. Vermutlich geht es um das Stromsparen beim
Batteriebetrieb. Mit DMA kann der Controller (CPU) zwar lange schlafen,
aber nicht sehr tief. Wäre es nicht sinnvoller den Controller sehr tief
(alle Takte ausgeschaltet) schlafen zu lassen und ihn zur Messung über
die interne RTC wecken zu lassen?
Es handelt sich im Moment um das Nucleo-Board F446RE, später dann
STM32F746ZG (vorgegeben). Der Controller wird die meiste Zeit tief
schlafen (auch keine Sensordaten) auslesen. Da sehr stark Batterie
geschont werden muss, sollte er im Betrieb allerdings die CPU nur
anwerfen um die Daten, welche mittels DMA eingelesen wurden, rasch
auszuwerten.
Sefi schrieb:> STM32F746ZG (vorgegeben)> sehr stark Batterie geschont werden muss
Sorry, aber da hat man Dir eine Kombination vorgegeben, die schon zum
Scheitern verurteilt ist. Dieser Mikrocontroller nimmt im Sleep schon
mehr Strom auf, als einige kleinere im laufenden Betrieb!
Sefi schrieb:> Der Controller wird die meiste Zeit tief> schlafen (auch keine Sensordaten) auslesen
Das war nicht gefordert, siehe:
> Der Controller wird die meiste Zeit tief> schlafen (auch keine Sensordaten) auslesen
Wenn ich an einem Projekt mit widersrpüchlichen Anforderungen arbeiten
muss, achte ich darauf, wenigstens meinen Tisch rein zu halten.
Du solltest mit dem Auftraggeber klären, welche Stromaufnahme erwartet
wird und welche lieferbar sein wird.
Manchmal ist es besser, einen kleinen Mikrocontroller als Master mit
einem großen als Arbeitspferd zu kombinieren, wobei der große dann in
den Pausen komplett Stromlos geschaltet wird.
Rolltür schrieb:> Der DMA braucht doch einen Takt!? Dann kann der Schlaf also nicht tief> ein. Mein Gefühl sagt, DMA bringt da nichts.
Das war nicht gefordert, siehe:
> Der Controller wird die meiste Zeit tief> schlafen (auch keine Sensordaten) auslesen
Da fehlen Infos.
Wenn der Controller beispielsweise nur 100 Mal pro Sekunde Sensordaten
lesen soll, dann ist der zusätzliche Strom für 500 statt 50 Takten
unwesentlich. Nochmals: Mein Gefühl sagt, DMA bringt da nichts.
Ich werde jetzt mein selbstgebautes Fernthermometer das mir
alle 3 Minuten die Temperatur schickt auch auf DMA umstellen
damit ich meine Temperatur noch schneller ablesen kann (sind
ja immerhin etwa 10 Bytes die da immer verschickt werden).
Dann bin ich - weil ich DMA mache - auch auf der Höhe der Zeit.
Ich glaube auch, der TO hat ein falsches Verständnis von DMA.
Frage: Wohin sollen die Daten eigentlich gespeichert werden? Weil... DMA
speichert keine Daten, so wie es sich er TO vorstellt. DMA ist eine
Transportschicht von Speicherpunkt A zu Speicherpunkt B.