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!
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,