Forum: Mikrocontroller und Digitale Elektronik Spaß mit STM32F7 + SPI + DMA


von Udo (Gast)



Lesenswert?

Hallo!

Ich habe hier Code von einem STM32F4 zu einem STM32F7 portiert.
Die HAL suggeriert ja, das das problemlos möglich wäre.
Bis zu einem gewissen Grad (z.B. bei GPIO) mag das funktionieren, aber 
die restliche Peripherie hat dann doch den einen oder anderen 
Unterschied :-/

Wo ich einige Stunden mit der Fehlersuche zugebracht habe, war das 
Versenden eines größeren Datenblock über SPI mittels DMA.
Auf dem F4 lief der Code problemlos. Auf dem F7 wurden nur ein paar 
Bytes geschickt und dann blieb die DMA stecken.

So sah die Konfiguration für den DMA aus:
1
        __HAL_RCC_DMA2_CLK_ENABLE();
2
        DMA_SPI_tx_Handle.Instance                      = DMA2_Stream5;
3
        DMA_SPI_tx_Handle.Init.Channel                  = DMA_CHANNEL_3;
4
        DMA_SPI_tx_Handle.Init.Direction                = DMA_MEMORY_TO_PERIPH;
5
        DMA_SPI_tx_Handle.Init.PeriphInc                = DMA_PINC_DISABLE;
6
        DMA_SPI_tx_Handle.Init.MemInc                   = DMA_MINC_ENABLE;
7
        DMA_SPI_tx_Handle.Init.MemDataAlignment         = DMA_MDATAALIGN_HALFWORD;
8
        DMA_SPI_tx_Handle.Init.PeriphDataAlignment      = DMA_PDATAALIGN_HALFWORD;
9
        DMA_SPI_tx_Handle.Init.Mode                     = DMA_NORMAL;
10
        DMA_SPI_tx_Handle.Init.Priority                 = DMA_PRIORITY_LOW;
11
        DMA_SPI_tx_Handle.Init.FIFOMode                 = DMA_FIFOMODE_DISABLE;

Nach vielen verschiedenen Versuchen, kam ich auf die Idee doch mal den 
FIFO im DMA zu aktivieren:
1
        DMA_SPI_tx_Handle.Init.FIFOMode                 = DMA_FIFOMODE_ENABLE;
2
        DMA_SPI_tx_Handle.Init.FIFOThreshold            = DMA_FIFO_THRESHOLD_HALFFULL;
3
        DMA_SPI_tx_Handle.Init.MemBurst                 = DMA_MBURST_SINGLE;
4
        DMA_SPI_tx_Handle.Init.PeriphBurst              = DMA_PBURST_SINGLE;
Auf einmal funktionierte die ganze Chose. Offenbar wird im 
Nicht-DMA-FIFO-Modus der Zustand des SPI-FIFOs nicht richtig 
ausgewertet. Für mich sieht es so aus, als hätte STM da im F7 einen 
kleinen Bug verbaut.
Wie gesagt: Im F4 funktioniert es auch ohne DMA FIFO...

Udo

P.S.: Manchmal wünscht man sich die Dinger wären so übersichtlich wie 
ein ATMega8.

von Pete K. (pete77)


Lesenswert?

Kannst ja mal an ST schreiben, ob das ein Bug oder ein Feature ist.;-)

von Frank (Gast)


Lesenswert?

Nach wieviel Byte denn genau?
Kann es sein dass der DMA Full Interrupt nicht kommt und es deshalb zu 
einem Überlauf kommt?

von STM32 Spezi (Gast)


Lesenswert?

Genau damit habe ich in den letzten Tagen auch gekämpft. Die 
STM32F7-Reihe hat eine geänderte DMA gegenüber den F4. Schau mal nach 
"Peripheral Flow Controller". Wenn die SPI den DMA-Takt vorgeben soll, 
muss das Bit PFCTRL im CR-Register des Streams gesetzt werden.

von 32zuterrtzkutehte (Gast)


Lesenswert?

und wenn caches aktiv sind aufpassen in welchem bereich der 
speicherblock ist

manche SPeicherereiche werden gecached....
damit kommt die DMA nicht klar.

da hilft nur speicher neu ordnen und MPU richtig setzen

von derjaeger (Gast)


Lesenswert?

>Manchmal wünscht man sich die Dinger wären so übersichtlich wie
>ein ATMega8.


Ich habe zuerst mit einem STM32F1 gearbeitet (mehrere Monate 
durchgängig), dann habe ich mich mal an einen ATmega aus Neugier 
probiert. Wie einfach die Dinger doch gestrickt sind :-)

Zwei Bits in insgesamt zwei Register setzen und ein Interrupt ist 
konfiguriert.

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.