diff --git a/nuttx/arch/arm/src/stm32/stm32_serial.c b/nuttx/arch/arm/src/stm32/stm32_serial.c
index c216a5adfbbd99b1948ed14518aa56e81e28b76b..60ed5892188994f950f871fb0aeab95e375437d1 100644
--- a/nuttx/arch/arm/src/stm32/stm32_serial.c
+++ b/nuttx/arch/arm/src/stm32/stm32_serial.c
@@ -2631,6 +2631,22 @@ static void up_dma_rxcallback(DMA_HANDLE handle, uint8_t status, void *arg)
 
           up_dma_reenable(priv);
         }
+#endif
+    }
+
+  /* Get the masked USART status word to check and clear error flags.
+   * If error flag is not cleared, Rx DMA will be stuck. Clearing errors
+   * will release Rx DMA. */
+
+  priv->sr = up_serialin(priv, STM32_USART_SR_OFFSET);
+
+  if ((priv->sr & (USART_SR_ORE | USART_SR_NE | USART_SR_FE)) != 0)
+    {
+#if defined(CONFIG_STM32_STM32F30XX) || defined(CONFIG_STM32_STM32F37XX)
+      up_serialout(priv, STM32_USART_ICR_OFFSET,
+                  (USART_ICR_NCF | USART_ICR_ORECF | USART_ICR_FECF));
+#else
+      (void)up_serialin(priv, STM32_USART_RDR_OFFSET);
 #endif
     }
 }