This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

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.

0