Skip to main content
Associate
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?

 

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

TDK
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

"If you feel a post has answered your question, please click ""Accept as Solution""."
ThorPSAuthor
Associate
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.

 

TDK
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.

"If you feel a post has answered your question, please click ""Accept as Solution""."