Forum: Mikrocontroller und Digitale Elektronik STM32F303 DMA ADC <-> SRAM DSIZE und PSIZE?


von Alex -. (alex796)


Lesenswert?

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.

von Jim M. (turboj)


Lesenswert?

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.

von Paul S. (mrpaul)


Lesenswert?

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
Noch kein Account? Hier anmelden.