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.