Skip to main content
TSosi.1
Associate III
May 7, 2025
Solved

UART DMA error - What is the proper way to restart the DMA?

  • May 7, 2025
  • 2 replies
  • 728 views

Hi,

I am injecting a UART DMA error by using DTCM memory and DMA2. For example:

// Induce a DMA error by using DTCM RAM for DMA2 which is inaccessible
if ( HAL_UART_Transmit_DMA( huart, transmit_buffer_dtcm_memory, num_bytes_to_transmit ) != HAL_OK )

{

// Log error

}

What happens is the frame error, parity error, and noise error interrupts are disabled after the DMA error on transmit. This I can see by the EIE bit in CR3.  HAL function UART_EndRxTransfer is called and clears EIE.

I have a streams connected to the TX and RX lines:

TX is connected to DMA2 Stream 5 - High priorty

RX is connected to DMA2 Stream 4 - High priority

 

When I try to restart the UART receiving:

if ( HAL_UART_Receive_DMA( uart_handle, receive_buffer, RX_BUF_SIZE ) != HAL_OK )
{
// Log error
}

There is a check in sub function HAL_DMA_Start_IT that returns an error because the DMA stream is busy.

 

So what is the correct way to recover/restart after a DMA and set the interrupt flags for frame, noise, and parity?\

Thanks!

 

 

 

Best answer by TDK

Did you call HAL_UART_Abort? That should set the state machine ready again.

2 replies

TDK
TDKAnswer
Super User
May 7, 2025

Did you call HAL_UART_Abort? That should set the state machine ready again.

"If you feel a post has answered your question, please click ""Accept as Solution""."
TSosi.1
TSosi.1Author
Associate III
May 8, 2025

No, but I was looking at that function. It was a long day debugging the issue and was frustrated.  I'll try it.

Karl Yamashita
Principal
May 7, 2025

If HAL status returns HAL_BUSY, then you wait a little bit and try again.

Other functions to call for status or errors, HAL_UART_GetState, HAL_UART_GetError, 

If a reply has proven helpful, click on Accept as Solution so that it'll show at top of the post.CAN Jammer an open source CAN bus hacking toolCANableV3 Open Source
TSosi.1
TSosi.1Author
Associate III
May 8, 2025

I tried.  The DMA stays busy. 

HAL_UART_GetError doesn't seem to return DMA error in all cases.  I noticed with a different UART that when the DMA error occurred, transfer complete was called and ErrorCode member of the UART handle was zero.