diff options
| author | tanek liang <[email protected]> | 2017-12-09 11:12:46 +0800 |
|---|---|---|
| committer | tanek liang <[email protected]> | 2017-12-09 11:12:46 +0800 |
| commit | 75ecc46739787ba20355f44123868e829c02b779 (patch) | |
| tree | 11b0189370ef864330733c22209d0b02a993f56e | |
| parent | 514b39bb5b58d6961b660eb6d83ab5a332084a02 (diff) | |
[bsp] fixed uart overrun bugs
| -rw-r--r-- | bsp/imxrt1052-evk/drivers/usart.c | 18 |
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(); |
