From b65cfa8ec466d498e24959b90568b076c942aa6d Mon Sep 17 00:00:00 2001
From: Jussi Kivilinna <jussi.kivilinna@haltian.com>
Date: Fri, 6 Nov 2015 14:45:10 +0200
Subject: [PATCH] stm32_serial: fix Rx DMA mode to handle and recover from
 USART errors

If USART peripheral detect error, Rx DMA stops operating until errors are cleared.

Signed-off-by: Jussi Kivilinna <jussi.kivilinna@haltian.com>
---
 nuttx/arch/arm/src/stm32/stm32_serial.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/nuttx/arch/arm/src/stm32/stm32_serial.c b/nuttx/arch/arm/src/stm32/stm32_serial.c
index c216a5ad..60ed5892 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
     }
 }
-- 
GitLab