API Reference
The NEORV32 RISC-V Processor
Loading...
Searching...
No Matches
neorv32_uart.h File Reference

Universal asynchronous receiver/transmitter (UART0/UART1) HW driver header file. More...

#include <neorv32.h>
#include <stdint.h>
#include <stdarg.h>

Go to the source code of this file.

Data Structures

struct  neorv32_uart_t

Macros

UART helpers for common functions
#define neorv32_uart0_available()
#define neorv32_uart0_setup(baud, rx_irq, tx_irq)
#define neorv32_uart0_putc(c)
#define neorv32_uart0_getc()
#define neorv32_uart0_puts(s)
#define neorv32_uart0_printf(...)
#define neorv32_uart0_scan(buffer, max_size, echo)
#define neorv32_uart1_available()
#define neorv32_uart1_setup(baud, rx_irq, tx_irq)
#define neorv32_uart1_putc(c)
#define neorv32_uart1_getc()
#define neorv32_uart1_puts(s)
#define neorv32_uart1_printf(...)
#define neorv32_uart1_scan(buffer, max_size, echo)

Functions

static int neorv32_uart_rx_fifo_depth (neorv32_uart_t *uartx)
static int neorv32_uart_tx_fifo_depth (neorv32_uart_t *uartx)
static int neorv32_uart_rx_irq (neorv32_uart_t *uartx)
static int neorv32_uart_tx_irq (neorv32_uart_t *uartx)
static int neorv32_uart_rx_avail (neorv32_uart_t *uartx)
static int neorv32_uart_tx_full (neorv32_uart_t *uartx)
static int neorv32_uart_tx_busy (neorv32_uart_t *uartx)
static void neorv32_uart_tx_put (neorv32_uart_t *uartx, char data)
static char neorv32_uart_rx_get (neorv32_uart_t *uartx)
static int neorv32_uart_rx_overflow (neorv32_uart_t *uartx)
Prototypes
int neorv32_uart_available (neorv32_uart_t *uartx)
void neorv32_uart_setup (neorv32_uart_t *uartx, uint32_t baud, int rx_irq, int tx_irq)
void neorv32_uart_putc (neorv32_uart_t *uartx, char c)
char neorv32_uart_getc (neorv32_uart_t *uartx)
void neorv32_uart_puts (neorv32_uart_t *uartx, const char *s)
void neorv32_uart_vprintf (neorv32_uart_t *uartx, const char *format, va_list args)
void neorv32_uart_printf (neorv32_uart_t *uartx, const char *format,...)
int neorv32_uart_scan (neorv32_uart_t *uartx, char *buffer, int max_size, int echo)

IO Device: Primary/Secondary Universal Asynchronous Receiver and Transmitter (UART0 / UART1)

#define NEORV32_UART0   ((neorv32_uart_t*) (NEORV32_UART0_BASE))
#define NEORV32_UART1   ((neorv32_uart_t*) (NEORV32_UART1_BASE))
enum  NEORV32_UART_CTRL_enum {
  UART_CTRL_RX_EN = 0 , UART_CTRL_TX_EN = 1 , UART_CTRL_TX_SIM_EN = 2 , UART_CTRL_RTS_EN = 3 ,
  UART_CTRL_CTS_EN = 4 , UART_CTRL_RX_EMPTY = 8 , UART_CTRL_RX_HALF = 9 , UART_CTRL_RX_FULL = 10 ,
  UART_CTRL_RX_OVER = 11 , UART_CTRL_TX_EMPTY = 12 , UART_CTRL_TX_HALF = 13 , UART_CTRL_TX_FULL = 14 ,
  UART_CTRL_TX_BUSY = 15 , UART_CTRL_RX_IRQ_SEL0 = 16 , UART_CTRL_RX_IRQ_SEL1 = 17 , UART_CTRL_TX_IRQ_SEL0 = 18 ,
  UART_CTRL_TX_IRQ_SEL1 = 19 , UART_CTRL_RX_IRQ_PEND = 20 , UART_CTRL_TX_IRQ_PEND = 21 , UART_CTRL_RX_FIFO_LSB = 24 ,
  UART_CTRL_RX_FIFO_MSB = 27 , UART_CTRL_TX_FIFO_LSB = 28 , UART_CTRL_TX_FIFO_MSB = 31
}
enum  NEORV32_UART_RX_IRQ_SEL_enum { UART_RX_IRQ_NONE = 0 , UART_RX_IRQ_AVAIL = 1 , UART_RX_IRQ_HALF = 2 , UART_RX_IRQ_FULL = 3 }
enum  NEORV32_UART_TX_IRQ_SEL_enum { UART_TX_IRQ_NONE = 0 , UART_TX_IRQ_IDLE = 1 , UART_TX_IRQ_NHALF = 2 , UART_TX_IRQ_NFULL = 3 }

Detailed Description

Universal asynchronous receiver/transmitter (UART0/UART1) HW driver header file.

Macro Definition Documentation

◆ NEORV32_UART0

#define NEORV32_UART0   ((neorv32_uart_t*) (NEORV32_UART0_BASE))

UART0 module hardware handle (neorv32_uart_t)

◆ neorv32_uart0_available

#define neorv32_uart0_available ( )
Value:
int neorv32_uart_available(neorv32_uart_t *uartx)
Definition neorv32_uart.c:24
#define NEORV32_UART0
Definition neorv32_uart.h:34

◆ neorv32_uart0_getc

#define neorv32_uart0_getc ( )
Value:
char neorv32_uart_getc(neorv32_uart_t *uartx)
Definition neorv32_uart.c:116

◆ neorv32_uart0_printf

#define neorv32_uart0_printf ( ...)
Value:
void neorv32_uart_printf(neorv32_uart_t *uartx, const char *format,...)
Definition neorv32_uart.c:243

◆ neorv32_uart0_putc

#define neorv32_uart0_putc ( c)
Value:
void neorv32_uart_putc(neorv32_uart_t *uartx, char c)
Definition neorv32_uart.c:104

◆ neorv32_uart0_puts

#define neorv32_uart0_puts ( s)
Value:
void neorv32_uart_puts(neorv32_uart_t *uartx, const char *s)
Definition neorv32_uart.c:129

◆ neorv32_uart0_scan

#define neorv32_uart0_scan ( buffer,
max_size,
echo )
Value:
neorv32_uart_scan(NEORV32_UART0, buffer, max_size, echo)
int neorv32_uart_scan(neorv32_uart_t *uartx, char *buffer, int max_size, int echo)
Definition neorv32_uart.c:260

◆ neorv32_uart0_setup

#define neorv32_uart0_setup ( baud,
rx_irq,
tx_irq )
Value:
neorv32_uart_setup(NEORV32_UART0, baud, rx_irq, tx_irq)
void neorv32_uart_setup(neorv32_uart_t *uartx, uint32_t baud, int rx_irq, int tx_irq)
Definition neorv32_uart.c:44

◆ NEORV32_UART1

#define NEORV32_UART1   ((neorv32_uart_t*) (NEORV32_UART1_BASE))

UART1 module hardware handle (neorv32_uart_t)

◆ neorv32_uart1_available

#define neorv32_uart1_available ( )
Value:
#define NEORV32_UART1
Definition neorv32_uart.h:37

◆ neorv32_uart1_getc

#define neorv32_uart1_getc ( )

◆ neorv32_uart1_printf

#define neorv32_uart1_printf ( ...)
Value:

◆ neorv32_uart1_putc

#define neorv32_uart1_putc ( c)

◆ neorv32_uart1_puts

#define neorv32_uart1_puts ( s)

◆ neorv32_uart1_scan

#define neorv32_uart1_scan ( buffer,
max_size,
echo )
Value:
neorv32_uart_scan(NEORV32_UART1, buffer, max_size, echo)

◆ neorv32_uart1_setup

#define neorv32_uart1_setup ( baud,
rx_irq,
tx_irq )
Value:
neorv32_uart_setup(NEORV32_UART1, baud, rx_irq, tx_irq)

Enumeration Type Documentation

◆ NEORV32_UART_CTRL_enum

UART control register bits

Enumerator
UART_CTRL_RX_EN 

UART control register(0) (r/w): Enable receiver (RX)

UART_CTRL_TX_EN 

UART control register(1) (r/w): Enable transceiver (TX)

UART_CTRL_TX_SIM_EN 

UART control register(2) (r/w): Enable TX output to simulator

UART_CTRL_RTS_EN 

UART control register(3) (r/w): Enable RX hardware flow-control (RTS)

UART_CTRL_CTS_EN 

UART control register(4) (r/w): Enable TX hardware flow-control (CTS)

UART_CTRL_RX_EMPTY 

UART control register(8) (r/-): RX FIFO is empty

UART_CTRL_RX_HALF 

UART control register(9) (r/-): RX FIFO is at least half full

UART_CTRL_RX_FULL 

UART control register(10) (r/-): RX FIFO is full

UART_CTRL_RX_OVER 

UART control register(11) (r/-): RX FIFO overflow

UART_CTRL_TX_EMPTY 

UART control register(12) (r/-): TX FIFO is empty

UART_CTRL_TX_HALF 

UART control register(13) (r/-): TX FIFO is is at least half full

UART_CTRL_TX_FULL 

UART control register(14) (r/-): TX FIFO is full

UART_CTRL_TX_BUSY 

UART control register(15) (r/-): Transmitter busy or TX FIFO not empty

UART_CTRL_RX_IRQ_SEL0 

UART control register(16) (r/w): RX interrupt select, LSB

UART_CTRL_RX_IRQ_SEL1 

UART control register(17) (r/w): RX interrupt select, MSB

UART_CTRL_TX_IRQ_SEL0 

UART control register(18) (r/w): TX interrupt select, LSB

UART_CTRL_TX_IRQ_SEL1 

UART control register(19) (r/w): TX interrupt select, MSB

UART_CTRL_RX_IRQ_PEND 

UART control register(20) (r/-): RX interrupt pending

UART_CTRL_TX_IRQ_PEND 

UART control register(21) (r/-): TX interrupt pending

UART_CTRL_RX_FIFO_LSB 

UART control register(24) (r/-): log2(RX FIFO depth), LSB

UART_CTRL_RX_FIFO_MSB 

UART control register(27) (r/-): log2(RX FIFO depth), MSB

UART_CTRL_TX_FIFO_LSB 

UART control register(28) (r/-): log2(TX FIFO depth), LSB

UART_CTRL_TX_FIFO_MSB 

UART control register(31) (r/-): log2(TX FIFO depth), MSB

◆ NEORV32_UART_RX_IRQ_SEL_enum

RX interrupt select

Enumerator
UART_RX_IRQ_NONE 

0: interrupt disabled

UART_RX_IRQ_AVAIL 

1: interrupt if FIFO is not empty (data available)

UART_RX_IRQ_HALF 

2: interrupt if FIFO is at least half full

UART_RX_IRQ_FULL 

3: interrupt if FIFO is full

◆ NEORV32_UART_TX_IRQ_SEL_enum

TX interrupt select

Enumerator
UART_TX_IRQ_NONE 

0: interrupt disabled

UART_TX_IRQ_IDLE 

1: interrupt if FIFO is empty and transmitter is idle

UART_TX_IRQ_NHALF 

2: interrupt if FIFO is less than half full

UART_TX_IRQ_NFULL 

3: interrupt if FIFO is not full

Function Documentation

◆ neorv32_uart_available()

int neorv32_uart_available ( neorv32_uart_t * uartx)

Check if UART module was synthesized.

Parameters
[in,out]uartxUART hardware struct.
Returns
0 if UART0/1 was not synthesized, non-zero if UART0/1 is available.

◆ neorv32_uart_getc()

char neorv32_uart_getc ( neorv32_uart_t * uartx)

Get received char.

Note
Blocking function (block until RX data available).
Parameters
[in,out]uartxUART hardware struct.
Returns
Received char.

◆ neorv32_uart_printf()

void neorv32_uart_printf ( neorv32_uart_t * uartx,
const char * format,
... )

Custom version of 'printf'. This functions only provides a minimal subset of the 'printf' formatting features.

Note
Blocking function.
Parameters
[in,out]uartxUART hardware struct.
[in]formatPointer to format string. See neorv32_uart_vprintf.

◆ neorv32_uart_putc()

void neorv32_uart_putc ( neorv32_uart_t * uartx,
char c )

Transmit char.

Note
Blocking function (block until transmission can be issued).
Parameters
[in,out]uartxUART hardware struct.
[in]cChar to be send.

◆ neorv32_uart_puts()

void neorv32_uart_puts ( neorv32_uart_t * uartx,
const char * s )

Print zero-terminated string. No trailing line break is added. Newline (LF) line breaks are automatically converted to CR-LF.

Note
Blocking function.
Parameters
[in,out]uartxUART hardware struct.
[in]sPointer to string.

◆ neorv32_uart_rx_avail()

int neorv32_uart_rx_avail ( neorv32_uart_t * uartx)
inlinestatic

Check if RX data is available.

Parameters
[in,out]uartxUART hardware struct.
Returns
Non-zero if data available, zero if no data available.

◆ neorv32_uart_rx_fifo_depth()

int neorv32_uart_rx_fifo_depth ( neorv32_uart_t * uartx)
inlinestatic

Get UART RX FIFO depth.

Parameters
[in,out]uartxUART hardware struct.
Returns
Number of FIFO entries.

◆ neorv32_uart_rx_get()

char neorv32_uart_rx_get ( neorv32_uart_t * uartx)
inlinestatic

Get char from RX FIFO (and discard error bits).

Note
Non-blocking function.
Parameters
[in,out]uartxUART hardware struct.
Returns
Received char.

◆ neorv32_uart_rx_irq()

int neorv32_uart_rx_irq ( neorv32_uart_t * uartx)
inlinestatic

Check if RX interrupt is pending.

Parameters
[in,out]uartxUART hardware struct.
Returns
Non-zero if interrupt is pending, zero if not pending.

◆ neorv32_uart_rx_overflow()

int neorv32_uart_rx_overflow ( neorv32_uart_t * uartx)
inlinestatic

Check for RX overflow. Must be executed before reading from RX FIFO.

Parameters
[in,out]uartxUART hardware struct..
Returns
Error bits: Non-zero if RX overflow, zero if no RX overflow.

◆ neorv32_uart_scan()

int neorv32_uart_scan ( neorv32_uart_t * uartx,
char * buffer,
int max_size,
int echo )

Custom version of 'scanf'.

Note
Blocking function.
Parameters
[in,out]uartxUART hardware struct.
[in,out]bufferPointer to array of chars to store string.
[in]max_sizeMaximum number of chars to sample (including zero-termination).
[in]echoEcho UART input when 1.
Returns
Number of chars read.

◆ neorv32_uart_setup()

void neorv32_uart_setup ( neorv32_uart_t * uartx,
uint32_t baud,
int rx_irq,
int tx_irq )

Reset, configure and enable UART.

Parameters
[in,out]uartxUART hardware struct.
[in]baudTargeted BAUD rate (e.g. 19200, must be greater than zero).
[in]rx_irqRX interrupt condition (NEORV32_UART_RX_IRQ_SEL_enum).
[in]tx_irqTX interrupt condition (NEORV32_UART_TX_IRQ_SEL_enum).

◆ neorv32_uart_tx_busy()

int neorv32_uart_tx_busy ( neorv32_uart_t * uartx)
inlinestatic

Check if TX is busy (transmitter busy or TX FIFO not empty).

Parameters
[in,out]uartxUART hardware struct.
Returns
Non-zero if busy, zero if idle.

◆ neorv32_uart_tx_fifo_depth()

int neorv32_uart_tx_fifo_depth ( neorv32_uart_t * uartx)
inlinestatic

Get UART TX FIFO depth.

Parameters
[in,out]uartxUART hardware struct.
Returns
Number of FIFO entries.

◆ neorv32_uart_tx_full()

int neorv32_uart_tx_full ( neorv32_uart_t * uartx)
inlinestatic

Check if free space left in TX FIFO.

Parameters
[in,out]uartxUART hardware struct.
Returns
Non-zero if TX FIFO is full, zero if free space left.

◆ neorv32_uart_tx_irq()

int neorv32_uart_tx_irq ( neorv32_uart_t * uartx)
inlinestatic

Check if TX interrupt is pending.

Parameters
[in,out]uartxUART hardware handle.
Returns
Non-zero if interrupt is pending, zero if not pending.

◆ neorv32_uart_tx_put()

void neorv32_uart_tx_put ( neorv32_uart_t * uartx,
char data )
inlinestatic

Put char to TX FIFO.

Note
Non-blocking function.
Parameters
[in,out]uartxUART hardware struct.

◆ neorv32_uart_vprintf()

void neorv32_uart_vprintf ( neorv32_uart_t * uartx,
const char * format,
va_list args )

Custom version of 'vprintf'. This functions only provides a minimal subset of the original formatting features. Newline (LF) line breaks are automatically converted to CR-LF.

Note
Blocking function.
Parameters
[in,out]uartxUART hardware struct.
[in]formatPointer to format string.
[in]argsA value identifying a variable arguments list.