Преглед изворни кода

[bsp] fixed uart overrun bugs

tanek liang пре 7 година
родитељ
комит
75ecc46739
1 измењених фајлова са 16 додато и 2 уклоњено
  1. 16 2
      bsp/imxrt1052-evk/drivers/usart.c

+ 16 - 2
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)
 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);
     RT_ASSERT(uart != RT_NULL);
+    
+    base = uart->uart_base;
+    RT_ASSERT(base != RT_NULL);
 
 
     /* enter interrupt */
     /* enter interrupt */
     rt_interrupt_enter();
     rt_interrupt_enter();
 
 
     /* UART in mode Receiver -------------------------------------------------*/
     /* 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);
         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 */
     /* leave interrupt */
     rt_interrupt_leave();
     rt_interrupt_leave();