Forum: Mikrocontroller und Digitale Elektronik DMA Configuration Code example


von Richard W. (richard00)


Lesenswert?

Guten Abend,

ich hab mal eine Frage zu einem Code aus dem Datenblatt. Ich möchte 
meine ADC-Werte per DMA erhalten. Die ADC-Werte sollen in das DMA 
kopiert werden.

Was bedeutet dieser Befehl hier:

DMA1_Channel1->CPAR = (uint32_t) (&(ADC1->DR)); // Configure the 
peripheral data register address

Was genau passiert hier? Werden hier aus meinem ADC->DR Register die 
Werte in das CPAR kopiert? Und was genau macht dieser Befehl hier 
"(uint32_t) (&(ADC1->DR))"? Mich verwirrt der & Operator?

LG
Richard

von Hain Blöd (Gast)


Lesenswert?

Richard W. schrieb:
> Was genau passiert hier? Werden hier aus meinem ADC->DR Register die
> Werte in das CPAR kopiert? Und was genau macht dieser Befehl hier
> "(uint32_t) (&(ADC1->DR))"? Mich verwirrt der & Operator?

Dir fehlen elementare Grundlagen der C-Programmierung und der 
Programmierung im Allgemeinen. Erst dann solltest du dich hieran setzen.

von Richard W. (richard00)


Lesenswert?

Deswegen mach ich das ja, weil ich es lernen möchte. Man wächst mit 
seinen Aufgaben.

von Johannes S. (Gast)


Lesenswert?

& ist zu lesen wie ‚Adresse von‘. Dem DMA Controller muss ja mitgeteilt 
werden von wo und nach wohin geschaufelt werden soll.
Und dann wird noch ein type cast gemacht weil die Adresse in ein 32 Bit 
Register geschrieben wird das als uint32 deklariert wurde.

von Hein Blöd (Gast)


Lesenswert?

Richard W. schrieb:
> DMA1_Channel1->CPAR = (uint32_t) (&(ADC1->DR));

Nun denn:
ADC1->DR = Das (vermutlich) 32 bit große Register, an dem das Ergebnis 
von deinem ADC1 liegt.
&ADC1->DR = Nehme die Adresse dieses Registers. Auf einem STM32 ist 
diese Adresse 32bit lang.
(uint32_t) (&(ADC1->DR)) = Wandel diese Adresse in eine Variable/Zahl 
des Datentyps uint32_t um.

Aber lies erstmal ein C-Buch genau durch.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Richard W. schrieb:
> Die ADC-Werte sollen in das DMA
> kopiert werden.

Schreib lieber 'sollen per DMA an eine oder mehrere Speicherstellen 
kopiert werden'. Der DMA ist hier nur ein Kopierer, der die Daten aus 
dem Ergebnisregister des ADC an eine oder mehrere Speicherstellen 
kopiert, meist voll automatisch und im Hintergrund.

DMA ist beim STM32 immer dann sinnvoll, wenn man mehrere ADC Kanäle 
benutzt. Braucht man nur einen Kanal, kann man sich den Aufwand meist 
sparen und direkt das DR Register lesen.

: Bearbeitet durch User
von Programmierer (Gast)


Lesenswert?

Matthias S. schrieb:
> DMA ist beim STM32 immer dann sinnvoll, wenn man mehrere ADC Kanäle
> benutzt. Braucht man nur einen Kanal, kann man sich den Aufwand meist
> sparen und direkt das DR Register lesen.

Das ist Quatsch. Auch mehrere Kanäle gehen ohne DMA. Aber egal ob man 
einen oder mehrere Kanäle nutzt, ist DMA sinnvoll, wenn man viele 
Samples schnell aufzeichnen möchte ohne ständig die CPU damit zu 
belästigen. Bei hohen Sampleraten geht es auch kaum anders. Ob man mit 
einem ADC immer wieder den selben oder mehrere Kanäle abwechselnd 
abtastet ist unerheblich, weil die Datenraten in beiden Fällen hoch sein 
kann. Bei einem einzelnen Kanal kann sie sogar etwas höher sein, weil 
die Umschaltzeit entfällt.

von Richard W. (richard00)


Lesenswert?

Herzlichen Dank für eure Antworten. Soweit habe ich das verstanden.
Aber eine Frage hätte ich noch. Ich will es deswegen wissen, weil ich 
mein Projekt ohne die HAL-Library programmiere. Ich manipuliere die 
Bit`s.

Deswegen, will ich verstehen was da passiert. Ich hab nun aus einem Buch 
gelesen und folgendes erfahren was mein Problem wieder spiegelt.
Beispiel:

 b = & a bedeutet, dass b die Adresse von a bekommt. Das ist genau das 
Problem was ich oben beschrieben habe mit dem & Operator. Wenn ich die 
Register manipuliere dann mach ich das mit den entsprechenden 
Operatoren.
Der UND-Operator gibt überall eine 0 aus bei 1 1 = 1. Wie kann ich das 
ihr an diesem Beispiel verstehen? Hätte man das auch nicht so ausdrücken 
können b = a?

von Rainer B. (katastrophenheinz)


Lesenswert?

Unärer &-Operator (bedeutet "adresse von") ist ein anderer als binärer 
&-Operator (bedeutet "bitweises und")

von Richard W. (richard00)


Lesenswert?

Danke.

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.