OpenCores
URL https://opencores.org/ocsvn/neorv32/neorv32/trunk

Subversion Repositories neorv32

[/] [neorv32/] [trunk/] [sw/] [lib/] [source/] [neorv32_uart.c] - Diff between revs 35 and 36

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 35 Rev 36
Line 69... Line 69...
 
 
 
 
/**********************************************************************//**
/**********************************************************************//**
 * Enable and configure UART.
 * Enable and configure UART.
 *
 *
 * @warning The 'UART_SIM_MODE' compiler flag will redirect all UART TX data to the simulation output. Use this for simulations only!
 * @warning The 'UART_SIM_MODE' compiler flag will configure UART for simulation mode: all UART TX data will be redirected to simulation output. Use this for simulations only!
 * @warning To enable simulation mode add <USER_FLAGS+=-DUART_SIM_MODE> when compiling.
 * @warning To enable simulation mode add <USER_FLAGS+=-DUART_SIM_MODE> when compiling.
 *
 *
 * @param[in] baudrate Targeted BAUD rate (e.g. 9600).
 * @param[in] baudrate Targeted BAUD rate (e.g. 9600).
 * @param[in] rx_irq Enable RX interrupt (data received) when 1.
 * @param[in] rx_irq Enable RX interrupt (data received) when 1.
 * @param[in] tx_irq Enable TX interrupt (transmission done) when 1.
 * @param[in] tx_irq Enable TX interrupt (transmission done) when 1.
 **************************************************************************/
 **************************************************************************/
void neorv32_uart_setup(uint32_t baudrate, uint8_t rx_irq, uint8_t tx_irq) {
void neorv32_uart_setup(uint32_t baudrate, uint8_t rx_irq, uint8_t tx_irq) {
 
 
  UART_CT = 0; // reset
  UART_CT = 0; // reset
 
 
  // raw baud rate prescaler
 
  uint32_t clock = SYSINFO_CLK;
  uint32_t clock = SYSINFO_CLK;
  uint16_t i = 0; // BAUD rate divisor
  uint16_t i = 0; // BAUD rate divisor
  uint8_t p = 0; // prsc = CLK/2
  uint8_t p = 0; // initial prsc = CLK/2
 
 
 
  // raw clock prescaler
 
#ifdef __riscv_div
 
  // use div instructions
 
  i = (uint16_t)(clock / (2*baudrate));
 
#else
 
  // division via repeated subtraction
  while (clock >= 2*baudrate) {
  while (clock >= 2*baudrate) {
    clock -= 2*baudrate;
    clock -= 2*baudrate;
    i++;
    i++;
  }
  }
 
#endif
 
 
  // find clock prsc
  // find clock prsc
  while (i >= 0x0fff) {
  while (i >= 0x0fff) {
    if ((p == 2) || (p == 4))
    if ((p == 2) || (p == 4))
      i >>= 3;
      i >>= 3;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.