Hi Ich möchte mit dem STM32F303 gerne die interne Chiptemperatur und die interne Referenzspannung messen, und die Ergebnisse mittels DMA von ADC nach SRAM schieben. Es werden also zwei Messungen durchgeführt. Ich bin mir bei der Einstellung von PSIZE und MSIZE nicht ganz sicher, ob ich das Ref Manual richtig verstanden habe. Ist das die Datenbreite des Buses, an dem die Peripherie bzw. der Speicher hängt? Bei ADC wäre das AHB3, zu dem ich keine Information finde. Zum Peripheral selbst finde ich folgende Information: ADC (Peripheral): > the result of the converted data is stored into the ADCx_DR data register which is 16 bits wide. SRAM (Memory): > It can be accessed as bytes, halfwords (16 bits) or full words (32 bits) Habe ich den DMA also richtig verstanden, dass ich PSIZE auf 16 bits eintselle und bei MSIZE 8, 16 oder 32 bits einstellen kann? Für mich würde ich der Einfachheit halber MSIZE ebenfalls auf 16 bits einstellen. Oder ist es beim Peripheral nicht die Datenbreite des Datenregisters, sondern die Datenbreite des Buses? Das ist mir irgendwie nicht so ganz klar. Danke.
Da Dein ADC Register 16 Bits breit ist, würde ich einfach beides auf 16 Bits stellen. Sonst bekommt man einen Knoten im Kopf spätestens beim Berechnen der Transfer Länge. Inwieweit der DMA Controller 2 16-Bit Transfers zu einem 32-Bit Wert zusammenfassen kann, müsste man erst im Referenz Handbuch nachlesen. Da muss nicht unbedingt was sinvolles bei raus kommen, Stichwort Endianess zum Bleistift. So ein Feature braucht man eher selten - eigentlich nur wenn der RAM anderweitig so stark benutzt wird das keine Zugriffe mehr "frei" sind.
Alex -. schrieb: > Habe ich den DMA also richtig verstanden, dass ich PSIZE auf 16 bits > eintselle und bei MSIZE 8, 16 oder 32 bits einstellen kann? Für mich > würde ich der Einfachheit halber MSIZE ebenfalls auf 16 bits einstellen. Ich kenne den F303 nicht, habe bisher nur mit F4xx gearbeitet. Aber ich vermute mal, dass ST das Rad nicht komplett neu erfunden hat. Ich habe das Ganze so verstanden: Bei PSIZE gibst du an, wie viel Bit die Peripherie hat. Beim ADC würde 16 genügen, da der ADC nur das untere Halbwort füllt. Bei MSIZE gibst du die Bitbreite deines Speichers an. D.h. wenn du den ADC-Wert in eine (u)int16_t-Variable transferieren möchtest, dann gibst du 16 an. Ist das Ziel eine 32-Bitvariable, dann eben 32. Nach meinem Verständniss kann man problemlos von einer 16-Bit-Quelle in ein 32Bit Ziel kopieren. Diese beiden SIZE-Werte geben im Prinzip nur an, wie viele Bytes transferiert werden und um wie viele Bytes der Zeiger weitergezählt werden muss (z.B. wenn du mit Hilfe des DMA ein Array füllen möchtest). Vermutlich würde der DMA bei PSIZE=32 einfach die führenden Nullen aus dem oberen Halbwort mitkopieren.
:
Bearbeitet durch User
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.