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;
|