diff --git a/cpu/atmega_common/periph/uart.c b/cpu/atmega_common/periph/uart.c index 4449ab2bf6..1f4ebb30be 100644 --- a/cpu/atmega_common/periph/uart.c +++ b/cpu/atmega_common/periph/uart.c @@ -36,19 +36,20 @@ /** - * @brief Maximum percentage error in calculated baud before switching to double speed transmission (U2X) + * @brief Maximum percentage error in calculated baud before switching to + * double speed transmission (U2X) * * Takes whole numbers from 0 to 100, inclusive, with a default of 2. */ #if defined(UART_BAUD_TOL) -// BAUD_TOL is defined here as it is used by the setbaud.h utility +/* BAUD_TOL is defined here as it is used by the setbaud.h utility */ #define BAUD_TOL UART_BAUD_TOL #else #define BAUD_TOL 2 #endif #if defined(UART_STDIO_BAUDRATE) -// BAUD and F_CPU are required by setbaud.h to calculated BRR +/* BAUD and F_CPU are required by setbaud.h to calculated BRR */ #define BAUD UART_STDIO_BAUDRATE #define F_CPU CLOCK_CORECLOCK #include @@ -129,8 +130,15 @@ int uart_init(uart_t uart, uint32_t baudrate, uart_rx_cb_t rx_cb, void *arg) dev[uart]->CSRC = (1 << UCSZ00) | (1 << UCSZ01); /* set clock divider */ _set_brr(uart, baudrate); + /* enable RX and TX and the RX interrupt */ - dev[uart]->CSRB = ((1 << RXCIE0) | (1 << RXEN0) | (1 << TXEN0)); + if (rx_cb) { + dev[uart]->CSRB = ((1 << RXCIE0) | (1 << RXEN0) | (1 << TXEN0)); + } + else { + dev[uart]->CSRB = (1 << TXEN0); + } + return UART_OK; } diff --git a/cpu/ezr32wg/periph/uart.c b/cpu/ezr32wg/periph/uart.c index 75d620070c..37d17d2df7 100644 --- a/cpu/ezr32wg/periph/uart.c +++ b/cpu/ezr32wg/periph/uart.c @@ -65,16 +65,26 @@ int uart_init(uart_t dev, uint32_t baudrate, uart_rx_cb_t rx_cb, void *arg) * the division afterwards... */ uart->CLKDIV = (((CLOCK_HFPERCLK << 5) / (16 * baudrate) - 32) << 3); /* configure the pins */ - gpio_init(uart_config[dev].rx_pin, GPIO_IN); gpio_init(uart_config[dev].tx_pin, GPIO_OUT); - uart->ROUTE = ((uart_config[dev].loc << _USART_ROUTE_LOCATION_SHIFT) | - USART_ROUTE_RXPEN | USART_ROUTE_TXPEN); - /* enable RX interrupt */ - NVIC_EnableIRQ(uart_config[dev].irq); - NVIC_EnableIRQ(uart_config[dev].irq + 1); - uart->IEN |= USART_IEN_RXDATAV; - /* enable receiver and transmitter */ - uart->CMD = USART_CMD_TXEN | USART_CMD_RXEN; + if (rx_cb) { + gpio_init(uart_config[dev].rx_pin, GPIO_IN); + uart->ROUTE = ((uart_config[dev].loc << _USART_ROUTE_LOCATION_SHIFT) | + USART_ROUTE_RXPEN | USART_ROUTE_TXPEN); + } else { + uart->ROUTE = ((uart_config[dev].loc << _USART_ROUTE_LOCATION_SHIFT) | + USART_ROUTE_TXPEN); + } + if (rx_cb) { + /* enable RX interrupt */ + NVIC_EnableIRQ(uart_config[dev].irq); + NVIC_EnableIRQ(uart_config[dev].irq + 1); + uart->IEN |= USART_IEN_RXDATAV; + /* enable receiver and transmitter */ + uart->CMD = USART_CMD_TXEN | USART_CMD_RXEN; + } + else { + uart->CMD = USART_CMD_TXEN; + } return UART_OK; } diff --git a/cpu/nrf5x_common/periph/uart.c b/cpu/nrf5x_common/periph/uart.c index 2544d5c093..2c8a6dd11c 100644 --- a/cpu/nrf5x_common/periph/uart.c +++ b/cpu/nrf5x_common/periph/uart.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014-2016 Freie Universität Berlin + * Copyright (C) 2014-2017 Freie Universität Berlin * 2015 Jan Wagner * * @@ -50,14 +50,20 @@ int uart_init(uart_t uart, uint32_t baudrate, uart_rx_cb_t rx_cb, void *arg) /* power on the UART device */ NRF_UART0->POWER = 1; #endif + /* reset configuration registers */ NRF_UART0->CONFIG = 0; - /* configure RX/TX pin modes */ + + /* configure RX pin */ + if (rx_cb) { + GPIO_BASE->DIRCLR = (1 << UART_PIN_RX); + NRF_UART0->PSELRXD = UART_PIN_RX; + } + + /* configure TX pin */ GPIO_BASE->DIRSET = (1 << UART_PIN_TX); - GPIO_BASE->DIRCLR = (1 << UART_PIN_RX); - /* configure UART pins to use */ NRF_UART0->PSELTXD = UART_PIN_TX; - NRF_UART0->PSELRXD = UART_PIN_RX; + /* enable HW-flow control if defined */ #if UART_HWFLOWCTRL /* set pin mode for RTS and CTS pins */ @@ -127,10 +133,14 @@ int uart_init(uart_t uart, uint32_t baudrate, uart_rx_cb_t rx_cb, void *arg) NRF_UART0->ENABLE = UART_ENABLE_ENABLE_Enabled; /* enable TX and RX */ NRF_UART0->TASKS_STARTTX = 1; - NRF_UART0->TASKS_STARTRX = 1; - /* enable global and receiving interrupt */ - NVIC_EnableIRQ(UART_IRQN); - NRF_UART0->INTENSET = UART_INTENSET_RXDRDY_Msk; + + if (rx_cb) { + NRF_UART0->TASKS_STARTRX = 1; + /* enable global and receiving interrupt */ + NVIC_EnableIRQ(UART_IRQN); + NRF_UART0->INTENSET = UART_INTENSET_RXDRDY_Msk; + } + return UART_OK; } diff --git a/cpu/stm32_common/periph/uart.c b/cpu/stm32_common/periph/uart.c index e94107bf98..5d04bcf827 100644 --- a/cpu/stm32_common/periph/uart.c +++ b/cpu/stm32_common/periph/uart.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014-2016 Freie Universität Berlin + * Copyright (C) 2014-2017 Freie Universität Berlin * Copyright (C) 2016 OTA keys * * This file is subject to the terms and conditions of the GNU Lesser @@ -8,7 +8,7 @@ */ /** - * @ingroup cpu_stm32f2 + * @ingroup cpu_stm32_common * @{ * * @file @@ -56,8 +56,7 @@ int uart_init(uart_t uart, uint32_t baudrate, uart_rx_cb_t rx_cb, void *arg) isr_ctx[uart].rx_cb = rx_cb; isr_ctx[uart].arg = arg; - /* configure RX and TX pin */ - gpio_init(uart_config[uart].rx_pin, GPIO_IN); + /* configure TX pin */ gpio_init(uart_config[uart].tx_pin, GPIO_OUT); /* set TX pin high to avoid garbage during further initialization */ gpio_set(uart_config[uart].tx_pin); @@ -65,8 +64,14 @@ int uart_init(uart_t uart, uint32_t baudrate, uart_rx_cb_t rx_cb, void *arg) gpio_init_af(uart_config[uart].tx_pin, GPIO_AF_OUT_PP); #else gpio_init_af(uart_config[uart].tx_pin, uart_config[uart].tx_af); - gpio_init_af(uart_config[uart].rx_pin, uart_config[uart].rx_af); #endif + /* configure RX pin */ + if (rx_cb) { + gpio_init(uart_config[uart].rx_pin, GPIO_IN); +#ifndef CPU_FAM_STM32F1 + gpio_init_af(uart_config[uart].rx_pin, uart_config[uart].rx_af); +#endif + } /* enable the clock */ periph_clk_en(uart_config[uart].bus, uart_config[uart].rcc_mask); diff --git a/drivers/include/periph/uart.h b/drivers/include/periph/uart.h index 7ef5e0ad4a..17f6649295 100644 --- a/drivers/include/periph/uart.h +++ b/drivers/include/periph/uart.h @@ -124,10 +124,14 @@ enum { * - 1 stop bit * - baudrate as given * + * If no callback parameter is given (rx_cb := NULL), the UART will be + * initialized in TX only mode. + * * @param[in] uart UART device to initialize * @param[in] baudrate desired baudrate in baud/s * @param[in] rx_cb receive callback, executed in interrupt context once - * for every byte that is received (RX buffer filled) + * for every byte that is received (RX buffer filled), + * set to NULL for TX only mode * @param[in] arg optional context passed to the callback functions * * @return UART_OK on success