2025-05-07 3:47 PM
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!
Solved! Go to Solution.
2025-05-07 3:51 PM
Did you call HAL_UART_Abort? That should set the state machine ready again.
2025-05-07 3:51 PM
Did you call HAL_UART_Abort? That should set the state machine ready again.
2025-05-07 4:07 PM
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,
2025-05-08 7:55 AM
No, but I was looking at that function. It was a long day debugging the issue and was frustrated. I'll try it.
2025-05-08 8:00 AM
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.
2025-05-08 2:49 PM
Calling HAL_UART_Abort enables the frame, parity and noise error interrupts. Thank you!