DMA Configuration Code example

OP #6387862
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
Gast
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.
Gast
& 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.
Gast
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.
(Firma: matzetronics)
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.
Gast
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.
OP
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?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.