/** * @brief UART initialization. * @details This function must be invoked with interrupts disabled. * * @param[in] sdp pointer to a @p SerialDriver object * @param[in] config the architecture-dependent serial driver configuration */ static void uart_init(SerialDriver *sdp, const SerialConfig *config) { #if SAMA_SERIAL_USE_UART && SAMA_SERIAL_USE_FLEXCOM if (sdp->uart != NULL) #endif /* SAMA_SERIAL_USE_UART && SAMA_SERIAL_USE_FLEXCOM */ #if SAMA_SERIAL_USE_UART { Uart *u = sdp->uart; /* Disabling write protection */ sdDisableWP(u); /* Baud rate setting.*/ u->UART_BRGR = UART_BRGR_CD(sdp->clock / (16 * config->speed)); u->UART_CR = config->cr; u->UART_MR = config->mr; u->UART_IER = UART_IER_RXRDY; /* Clearing error status bit */ u->UART_CR |= UART_CR_RSTSTA; /* Enabling Tx and Rx */ u->UART_CR |= UART_CR_RXEN | UART_CR_TXEN; /* Enabling write protection */ sdEnableWP(u); } #endif /* SAMA_SERIAL_USE_UART */ #if SAMA_SERIAL_USE_UART && SAMA_SERIAL_USE_FLEXCOM else if (sdp->usart != NULL) #endif /* SAMA_SERIAL_USE_UART && SAMA_SERIAL_USE_FLEXCOM */ #if SAMA_SERIAL_USE_FLEXCOM { Flexcom *fl = sdp->flexcom; Usart *us = sdp->usart; /* Disabling write protection */ sdFlexDisableWP(us) /* Enabling USART on FLEXCOM */ fl->FLEX_MR = FLEX_MR_OPMODE_USART; /* Baud rate setting (OVER = 0 and SYNC = 0)*/ us->US_BRGR = US_BRGR_CD(sdp->clock / (16 * config->speed)); us->US_CR = config->cr; us->US_MR = config->mr; us->US_IER = US_IER_RXRDY; /* Clearing status bit */ us->US_CR |= US_CR_RSTSTA; /* Enabling Tx and Rx */ us->US_CR |= US_CR_RXEN | US_CR_TXEN; /* Enabling write protection */ sdFlexEnableWP(us) }
void uart_init(const uart_settings_t *settings) { /* * reset receiver, transmitter and status bits, * disable receiver and transmitter */ UART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RSTSTA | UART_CR_RXDIS | UART_CR_TXDIS; // configure baud rate UART->UART_BRGR = UART_BRGR_CD(settings->baud_rate); // configure mode UART->UART_MR = UART_MR_CHMODE(settings->ch_mode); // enable receiver and transmitter UART->UART_CR = UART_CR_RXEN | UART_CR_TXEN; }
static int baudrate_set(Uart *const uart, u32_t baudrate, u32_t mck_freq_hz) { u32_t divisor; __ASSERT(baudrate, "baud rate has to be bigger than 0"); __ASSERT(mck_freq_hz/16U >= baudrate, "MCK frequency is too small to set required baud rate"); divisor = mck_freq_hz / 16U / baudrate; if (divisor > 0xFFFF) { return -EINVAL; } uart->UART_BRGR = UART_BRGR_CD(divisor); return 0; }