From cf8235cedeb1fa82e594daa67211d55a51c67b11 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 4 Jun 2021 12:58:30 +0200 Subject: [PATCH] solves issue with DMA --- stm32h7/devicetest/GyroL3GD20H.cpp | 16 ++++++++++++++-- stm32h7/devicetest/GyroL3GD20H.h | 4 +++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/stm32h7/devicetest/GyroL3GD20H.cpp b/stm32h7/devicetest/GyroL3GD20H.cpp index 7c02e22..bf11081 100644 --- a/stm32h7/devicetest/GyroL3GD20H.cpp +++ b/stm32h7/devicetest/GyroL3GD20H.cpp @@ -11,7 +11,10 @@ #include "stm32h7xx_hal_spi.h" #include "stm32h7xx_hal_rcc.h" -std::array GyroL3GD20H::rxBuffer; +alignas(32) std::array GyroL3GD20H::rxBuffer; +alignas(32) std::array + GyroL3GD20H::txBuffer __attribute__((section(".dma_buffer"))); + TransferStates transferState = TransferStates::IDLE; DMA_HandleTypeDef txDmaHandle; DMA_HandleTypeDef rxDmaHandle; @@ -83,6 +86,15 @@ ReturnValue_t GyroL3GD20H::performOperation() { } ReturnValue_t GyroL3GD20H::handleDmaTransfer() { + /* Clean D-cache */ + /* Make sure the address is 32-byte aligned and add 32-bytes to length, + in case it overlaps cacheline */ + // See https://community.st.com/s/article/FAQ-DMA-is-not-working-on-STM32H7-devices +#if STM_USE_PERIPHERAL_TX_BUFFER_MPU_PROTECTION == 0 + SCB_CleanDCache_by_Addr((uint32_t*)(((uint32_t)txBuffer.data()) & ~(uint32_t)0x1F), + txBuffer.size()+32); +#endif + if(HAL_SPI_TransmitReceive_DMA(spiHandle, txBuffer.data(), rxBuffer.data(), 2) != HAL_OK) { // Transfer error in transmission process sif::printWarning("Error transmitting SPI with DMA\n"); @@ -90,7 +102,7 @@ ReturnValue_t GyroL3GD20H::handleDmaTransfer() { // Wait for the transfer to complete while (transferState == TransferStates::WAIT) { - //TaskFactory::delayTask(1); + TaskFactory::delayTask(1); } // Invalidate cache prior to access by CPU diff --git a/stm32h7/devicetest/GyroL3GD20H.h b/stm32h7/devicetest/GyroL3GD20H.h index ed2d9a2..59c39b9 100644 --- a/stm32h7/devicetest/GyroL3GD20H.h +++ b/stm32h7/devicetest/GyroL3GD20H.h @@ -33,8 +33,10 @@ private: SPI_HandleTypeDef* spiHandle; spi::TransferModes transferMode; static constexpr size_t recvBufferSize = 32 * 10; + static std::array rxBuffer; - std::array txBuffer; + static constexpr size_t txBufferSize = 32; + static std::array txBuffer; ReturnValue_t handleDmaTransfer(); ReturnValue_t handlePollingTransfer();