Forum: Mikrocontroller und Digitale Elektronik STM32 DMA decrement statt increment


von Holger K. (holgerkraehe)


Lesenswert?

Hallo zusammen

Folgendes Problem:

Ich bekomme per SPI Daten in folgendem Format:

uint32 [Byte3][Byte2][Byte1][Byte0]

Byte3 stellt das höchstwertige Byte des uint32 dar.
Die Bitreihenfolge ist korrekt. Wobei das MSB das linke Bit ist.

Nun habe ich aber folgendes Problem.
Der DMA holt sich die Bytes und speichert diese in einem Array ab:

...
IDX 3: [Byte0]
IDX 2: [Byte1]
IDX 1: [Byte2]
IDX 0: [Byte3]

Nun habe ich das Problem, dass die Bytes verkehrt herum liegen.

Wenn ich das Array wie folgt Caste:
1
a = *(uint32_t*) &Array[0]

Dann bekomme ich einen HexWert für A von: Byte0,1,2,3 also genau 
verkehrt herum.

Am besten wäre es, wenn ich dem DMA mitteilen könnte, dass er vo oben 
herab die Bytes einfüllen würde. Kann man dies beim STM32F3/4?

Der Chip, welcher die Daten liefert, kann man nicht umkonfigurieren.

Ansonsten, was wäre die schnellste methode, die obigen Daten in einen 
uint32_t zu wandeln?

Danke!

von A. B. (Gast)


Lesenswert?

Ein Dekrementieren ist nicht vorgesehen, weder beim F4 noch beim 
neuesten F743 ... Steht übrigens klar im RM drin:
DMA stream x configuration register (DMA_SxCR) (x = 0..7), MINC- und 
PINC-Bits

Inline-Assembler, 'REV' dreht die Byte-Reihenfolge in einem Register 
herum, macht also z. B. BE aus LE oder umgekehrt.

von Holger K. (holgerkraehe)


Lesenswert?

A. B. schrieb:
> Inline-Assembler, 'REV' dreht die Byte-Reihenfolge in einem Register
> herum, macht also z. B. BE aus LE oder umgekehrt.

Interessant

Damit habe ich leider noch kaum Erfahrung.
Wie kriege ich meinen uint32_t in ein Register?

Wäre froh um ein Beispiel...

Danke

von Jim M. (turboj)


Lesenswert?

Mal Google oder grep benutzt? Das gibts fertich in CMSIS:
1
uint32_t littleEndian = __REV(bigEndian);

von A. B. (Gast)


Lesenswert?

Tja, da muss man wohl oder übel Handbücher (Papier oder auch papierlos) 
wälzen, sprich die Doku zur verwendeten Toochain bzw. Compiler.

U. u. kennt der Compiler die 'Intrinsics' wie 'unsigned int 
__rev(unsigned int val)', oder auch __builtin_bswap32.

Und wenn nein, bleibt nur, in der Compiler-Doku nachzusehen, wie man 
Inline-Assembler vernünftig (Registernutzung zur Parameterübergabe!) 
einbindet.

Oder (weniger ratsam, da nur auf Little-Endian zielführend) htonl bzw. 
ntohl.

Letzter Rettungsanker wäre, da in C nachzubauen ...

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.