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