CMSIS Driver v1.10 UART_STM32F4xx.c BUFFER OVERRUN issue

CMSIS Driver UART Revision: V1.02

file C:\Keil\ARM\Pack\Keil\STM32F4xx_DFP\1.0.8\RTE_Driver\UART_STM32F4xx

function UART_IRQHandler (UART_RESOURCES *ptr_uart)

static void UART_IRQHandler (UART_RESOURCES *ptr_uart) {
           uint32_t sr;
  volatile uint32_t val;

  sr = ptr_uart->uart->SR;

  ...


  // Overrun error

  if (sr & USART_SR_ORE) {
    if (ptr_uart->info->event_mask & (1 << ARM_UART_EVENT_RX_OVERRUN))
      ptr_uart->info->cb_event(ARM_UART_EVENT_RX_OVERRUN);

  }


...

  // Read data register not empty
 if (sr & USART_SR_RXNE) {
    if (ptr_uart->uart->CR1 & USART_CR1_RXNEIE) {
      if ((ptr_uart->info->rx.idx_in != ptr_uart->info->rx.idx_out) ||
          ((ptr_uart->info->rx.idx_in == ptr_uart->info->rx.idx_out) && (ptr_uart->info->rx.empty == true))) {
        ptr_uart->rx_buffer[ptr_uart->info->rx.idx_in] = ptr_uart->uart->DR;
        ptr_uart->info->rx.empty = false;
        ptr_uart->info->rx.idx_in = (ptr_uart->info->rx.idx_in + 1) & (ptr_uart->rx_buffer_size - 1);

        val = (ptr_uart->info->rx.idx_in - ptr_uart->info->rx.idx_out) & (ptr_uart->rx_buffer_size - 1);
        val = (ptr_uart->rx_buffer_size - 1) - val;

        if ((ptr_uart->hw_flow == true) && (ptr_uart->manual_rts_cts == false)) {
          if (ptr_uart->flow_ctrl_threshold == val)
            GPIO_PinWrite(ptr_uart->pin_rts.port, ptr_uart->pin_rts.num, 1);
        }

        if (val == ptr_uart->info->rx.threshold) {
          if (ptr_uart->info->event_mask & (1 << ARM_UART_EVENT_RX_THRESHOLD))
            ptr_uart->info->cb_event(ARM_UART_EVENT_RX_THRESHOLD);
        }
      } else {
        ptr_uart->uart->CR1 &= ~USART_CR1_RXNEIE;
      }
    }
  }
 ...

      }
    }
  }

Sometimes there's a situation when ORE flag is set, but RXNE is cleared. In that case the program is stucked in this UART_IRQ_Handler. If you want to see this situation in the debugger, you should close USART Registers Debug window, otherwise the debugger will read DR register and thus ORE flag will be cleared.

More questions in this forum