Skip to main content
Visitor II
May 1, 2025
Solved

STM32H7S Uart TX using GPDMA only transmits 0x00 if DCache is enabled

  • May 1, 2025
  • 1 reply
  • 535 views

Hi,

I have a well functioning application transmitting on uart4 using GPDMA1 CH1.

If I turn on DCache, then it does transmit the correct length, only all characters are 0x00 (no problem in turning ICache on).

In HAL_UART_Transmit_DMA(huart, (const uint8_t*)pTx, len), if I make this substitution: HAL_UART_Transmit_DMA(huart, (const uint8_t*)"Hi "/*pTx*/, 3/*len*/), then it works.

I have tried allocating the variable pointed to by pTx to just about any available memory area / type without success.

Any suggestions?

 

    This topic has been closed for replies.
    Best answer by TDK

    After writing the values to memory, but before sending them with DMA, clean the cache with SCB_CleanDCache_by_Addr.  You'll need to ensure the buffer is aligned to a cache page.

     

    Managing Cache Coherency on Cortex-M7 Based MCUs

    1 reply

    TDKAnswer
    Super User
    May 1, 2025

    After writing the values to memory, but before sending them with DMA, clean the cache with SCB_CleanDCache_by_Addr.  You'll need to ensure the buffer is aligned to a cache page.

     

    Managing Cache Coherency on Cortex-M7 Based MCUs

    ThorPSAuthor
    Visitor II
    May 7, 2025

    Thanks, it solved the problem about transmission.

    It seems there is a similar issue with reception, but now I know what to do I guess.

     

    Super User
    May 7, 2025

    > It seems there is a similar issue with reception

    As the app note says, after receiving data with DMA, but before reading it with the CPU, invalidate that region with SCB_InvalidateDCache_by_Addr.