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
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.
Deswegen mach ich das ja, weil ich es lernen möchte. Man wächst mit seinen Aufgaben.
& 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.
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.
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
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.
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?
Unärer &-Operator (bedeutet "adresse von") ist ein anderer als binärer &-Operator (bedeutet "bitweises und")
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.