summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortanek liang <[email protected]>2017-12-09 11:12:46 +0800
committertanek liang <[email protected]>2017-12-09 11:12:46 +0800
commit75ecc46739787ba20355f44123868e829c02b779 (patch)
tree11b0189370ef864330733c22209d0b02a993f56e
parent514b39bb5b58d6961b660eb6d83ab5a332084a02 (diff)
[bsp] fixed uart overrun bugs
-rw-r--r--bsp/imxrt1052-evk/drivers/usart.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/bsp/imxrt1052-evk/drivers/usart.c b/bsp/imxrt1052-evk/drivers/usart.c
index 0635eaee5c..934a1ee8c7 100644
--- a/bsp/imxrt1052-evk/drivers/usart.c
+++ b/bsp/imxrt1052-evk/drivers/usart.c
@@ -320,18 +320,32 @@ static int imxrt_getc(struct rt_serial_device *serial)
*/
static void uart_isr(struct rt_serial_device *serial)
{
- struct imxrt_uart *uart = (struct imxrt_uart *) serial->parent.user_data;
+ struct imxrt_uart *uart;
+ LPUART_Type *base;
+ RT_ASSERT(serial != RT_NULL);
+
+ uart = (struct imxrt_uart *) serial->parent.user_data;
RT_ASSERT(uart != RT_NULL);
+
+ base = uart->uart_base;
+ RT_ASSERT(base != RT_NULL);
/* enter interrupt */
rt_interrupt_enter();
/* UART in mode Receiver -------------------------------------------------*/
- if (LPUART_GetStatusFlags(uart->uart_base) & kLPUART_RxDataRegFullFlag)
+ if (LPUART_GetStatusFlags(base) & kLPUART_RxDataRegFullFlag)
{
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
}
+
+ /* If RX overrun. */
+ if (LPUART_STAT_OR_MASK & base->STAT)
+ {
+ /* Clear overrun flag, otherwise the RX does not work. */
+ base->STAT = ((base->STAT & 0x3FE00000U) | LPUART_STAT_OR_MASK);
+ }
/* leave interrupt */
rt_interrupt_leave();