/***************************************************************************//** * @brief * Reset USART/UART to same state as after a HW reset. * * @param[in] usart * Pointer to USART/UART peripheral register block. ******************************************************************************/ void USART_Reset(USART_TypeDef *usart) { /* Make sure the module exists on the selected chip */ EFM_ASSERT(USART_REF_VALID(usart) || UART_REF_VALID(usart)); /* Make sure disabled first, before resetting other registers */ usart->CMD = USART_CMD_RXDIS | USART_CMD_TXDIS | USART_CMD_MASTERDIS | USART_CMD_RXBLOCKDIS | USART_CMD_TXTRIDIS | USART_CMD_CLEARTX | USART_CMD_CLEARRX; usart->CTRL = _USART_CTRL_RESETVALUE; usart->FRAME = _USART_FRAME_RESETVALUE; usart->TRIGCTRL = _USART_TRIGCTRL_RESETVALUE; usart->CLKDIV = _USART_CLKDIV_RESETVALUE; usart->IEN = _USART_IEN_RESETVALUE; usart->IFC = _USART_IFC_MASK; usart->ROUTE = _USART_ROUTE_RESETVALUE; if (USART_IRDA_VALID(usart)) { usart->IRCTRL = _USART_IRCTRL_RESETVALUE; } #if defined(_USART_INPUT_RESETVALUE) usart->INPUT = _USART_INPUT_RESETVALUE; #endif #if defined(_USART_I2SCTRL_RESETVALUE) if (USART_I2S_VALID(usart)) { usart->I2SCTRL = _USART_I2SCTRL_RESETVALUE; } #endif }
/***************************************************************************//** * @brief * Init USART/UART for normal asynchronous mode. * * @details * This function will configure basic settings in order to operate in normal * asynchronous mode. * * Special control setup not covered by this function must be done after * using this function by direct modification of the CTRL register. * * Notice that pins used by the USART/UART module must be properly configured * by the user explicitly, in order for the USART/UART to work as intended. * (When configuring pins, one should remember to consider the sequence of * configuration, in order to avoid unintended pulses/glitches on output * pins.) * * @param[in] usart * Pointer to USART/UART peripheral register block. * * @param[in] init * Pointer to initialization structure used to configure basic async setup. ******************************************************************************/ void USART_InitAsync(USART_TypeDef *usart, const USART_InitAsync_TypeDef *init) { /* Make sure the module exists on the selected chip */ EFM_ASSERT(USART_REF_VALID(usart) || UART_REF_VALID(usart)); /* Init USART registers to HW reset state. */ USART_Reset(usart); #if defined(USART_INPUT_RXPRS) && defined(USART_CTRL_MVDIS) /* Disable majority vote if specified. */ if (init->mvdis) { usart->CTRL |= USART_CTRL_MVDIS; } /* Configure PRS input mode. */ if (init->prsRxEnable) { usart->INPUT = (uint32_t) init->prsRxCh | USART_INPUT_RXPRS; } #endif /* Configure databits, stopbits and parity */ usart->FRAME = (uint32_t) (init->databits) | (uint32_t) (init->stopbits) | (uint32_t) (init->parity); /* Configure baudrate */ USART_BaudrateAsyncSet(usart, init->refFreq, init->baudrate, init->oversampling); /* Finally enable (as specified) */ usart->CMD = (uint32_t) (init->enable); }
/***************************************************************************//** * @brief * Init USART for synchronous mode. * * @details * This function will configure basic settings in order to operate in * synchronous mode. * * Special control setup not covered by this function must be done after * using this function by direct modification of the CTRL register. * * Notice that pins used by the USART module must be properly configured * by the user explicitly, in order for the USART to work as intended. * (When configuring pins, one should remember to consider the sequence of * configuration, in order to avoid unintended pulses/glitches on output * pins.) * * @param[in] usart * Pointer to USART peripheral register block. (UART does not support this * mode.) * * @param[in] init * Pointer to initialization structure used to configure basic async setup. ******************************************************************************/ void USART_InitSync(USART_TypeDef *usart, const USART_InitSync_TypeDef *init) { /* Make sure the module exists on the selected chip */ EFM_ASSERT(USART_REF_VALID(usart)); /* Init USART registers to HW reset state. */ USART_Reset(usart); /* Set bits for synchronous mode */ usart->CTRL |= (USART_CTRL_SYNC) | ((uint32_t) init->clockMode) | (init->msbf ? USART_CTRL_MSBF : 0); #if defined(USART_INPUT_RXPRS) && defined(USART_TRIGCTRL_AUTOTXTEN) usart->CTRL |= (init->prsRxEnable ? USART_INPUT_RXPRS : 0) | (init->autoTx ? USART_CTRL_AUTOTX : 0); #endif /* Configure databits, leave stopbits and parity at reset default (not used) */ usart->FRAME = ((uint32_t) (init->databits)) | (USART_FRAME_STOPBITS_DEFAULT) | (USART_FRAME_PARITY_DEFAULT); /* Configure baudrate */ USART_BaudrateSyncSet(usart, init->refFreq, init->baudrate); /* Finally enable (as specified) */ if (init->master) { usart->CMD = USART_CMD_MASTEREN; } usart->CMD = (uint32_t) (init->enable); }
/***************************************************************************//** * @brief * Init USART/UART for normal asynchronous mode. * * @details * This function will configure basic settings in order to operate in normal * asynchronous mode. Consider using USART_Reset() prior to this function if * state of configuration is not known, since only configuration settings * specified by @p init are set. * * Special control setup not covered by this function may be done either * before or after using this function (but normally before enabling) * by direct modification of the CTRL register. * * Notice that pins used by the USART/UART module must be properly configured * by the user explicitly, in order for the USART/UART to work as intended. * (When configuring pins, one should remember to consider the sequence of * configuration, in order to avoid unintended pulses/glitches on output * pins.) * * @param[in] usart * Pointer to USART/UART peripheral register block. * * @param[in] init * Pointer to initialization structure used to configure basic async setup. ******************************************************************************/ void USART_InitAsync(USART_TypeDef *usart, USART_InitAsync_TypeDef *init) { /* Make sure the module exists on the selected chip */ EFM_ASSERT(USART_REF_VALID(usart)); /* Ensure disabled while doing config */ /* (Mastermode disabled just in case, master mode not used for async op.) */ usart->CMD = USART_CMD_RXDIS | USART_CMD_TXDIS | USART_CMD_MASTERDIS; /* Make sure IrDA is disabled */ usart->IRCTRL &= ~USART_IRCTRL_IREN; /* Reset bits that should be reset for normal UART mode or reconfigured */ usart->CTRL &= ~(_USART_CTRL_SYNC_MASK | _USART_CTRL_CLKPOL_MASK | _USART_CTRL_CLKPHA_MASK | _USART_CTRL_CSMA_MASK | _USART_CTRL_SCMODE_MASK | _USART_CTRL_SCRETRANS_MASK); /* Configure databits, stopbits and parity */ usart->FRAME = (uint32_t)(init->databits) | (uint32_t)(init->stopbits) | (uint32_t)(init->parity); /* Configure baudrate */ USART_BaudrateAsyncSet(usart, init->refFreq, init->baudrate, init->oversampling); /* Finally enable (as specified) */ usart->CMD = (uint32_t)(init->enable); }
/***************************************************************************//** * @brief * Init USART for synchronous mode. * * @details * This function will configure basic settings in order to operate in * synchronous mode. * * Special control setup not covered by this function must be done after * using this function by direct modification of the CTRL register. * * Notice that pins used by the USART module must be properly configured * by the user explicitly, in order for the USART to work as intended. * (When configuring pins, one should remember to consider the sequence of * configuration, in order to avoid unintended pulses/glitches on output * pins.) * * @param[in] usart * Pointer to USART peripheral register block. (UART does not support this * mode.) * * @param[in] init * Pointer to initialization structure used to configure basic async setup. ******************************************************************************/ void USART_InitSync(USART_TypeDef *usart, const USART_InitSync_TypeDef *init) { /* Make sure the module exists on the selected chip */ EFM_ASSERT( USART_REF_VALID(usart) || USARTRF_REF_VALID(usart) ); /* Init USART registers to HW reset state. */ USART_Reset(usart); /* Set bits for synchronous mode */ usart->CTRL |= (USART_CTRL_SYNC) | (uint32_t)init->clockMode | (init->msbf ? USART_CTRL_MSBF : 0); #if defined(_USART_CTRL_AUTOTX_MASK) usart->CTRL |= init->autoTx ? USART_CTRL_AUTOTX : 0; #endif #if defined(_USART_INPUT_RXPRS_MASK) /* Configure PRS input mode. */ if (init->prsRxEnable) { usart->INPUT = (uint32_t)init->prsRxCh | USART_INPUT_RXPRS; } #endif /* Configure databits, leave stopbits and parity at reset default (not used) */ usart->FRAME = (uint32_t)init->databits | USART_FRAME_STOPBITS_DEFAULT | USART_FRAME_PARITY_DEFAULT; /* Configure baudrate */ USART_BaudrateSyncSet(usart, init->refFreq, init->baudrate); /* Finally enable (as specified) */ if (init->master) { usart->CMD = USART_CMD_MASTEREN; } #if defined(_USART_TIMING_CSHOLD_MASK) usart->TIMING = ((init->autoCsHold << _USART_TIMING_CSHOLD_SHIFT) & _USART_TIMING_CSHOLD_MASK) | ((init->autoCsSetup << _USART_TIMING_CSSETUP_SHIFT) & _USART_TIMING_CSSETUP_MASK); if (init->autoCsEnable) { usart->CTRL |= USART_CTRL_AUTOCS; } #endif usart->CMD = (uint32_t)init->enable; }
/***************************************************************************//** * @brief * Enable/disable USART/UART receiver and/or transmitter. * * @details * Notice that this function does not do any configuration. Enabling should * normally be done after initialization is done (if not enabled as part * of init). * * @param[in] usart * Pointer to USART/UART peripheral register block. * * @param[in] enable * Select status for receiver/transmitter. ******************************************************************************/ void USART_Enable(USART_TypeDef *usart, USART_Enable_TypeDef enable) { uint32_t tmp; /* Make sure the module exists on the selected chip */ EFM_ASSERT(USART_REF_VALID(usart) || (UART_REF_VALID(usart))); /* Disable as specified */ tmp = ~((uint32_t) (enable)); tmp &= _USART_CMD_RXEN_MASK | _USART_CMD_TXEN_MASK; usart->CMD = tmp << 1; /* Enable as specified */ usart->CMD = (uint32_t) (enable); }
/***************************************************************************//** * @brief * Reset USART/UART to same state as after a HW reset. * * @note * The ROUTE register is NOT reset by this function, in order to allow for * centralized setup of this feature. * * @param[in] usart * Pointer to USART/UART peripheral register block. ******************************************************************************/ void USART_Reset(USART_TypeDef *usart) { /* Make sure the module exists on the selected chip */ EFM_ASSERT(USART_REF_VALID(usart)); /* Make sure disabled first, before resetting other registers */ usart->CMD = USART_CMD_RXDIS | USART_CMD_TXDIS | USART_CMD_MASTERDIS | USART_CMD_RXBLOCKDIS | USART_CMD_TXTRIDIS | USART_CMD_CLEARTX | USART_CMD_CLEARRX; usart->CTRL = _USART_CTRL_RESETVALUE; usart->FRAME = _USART_FRAME_RESETVALUE; usart->TRIGCTRL = _USART_TRIGCTRL_RESETVALUE; usart->CLKDIV = _USART_CLKDIV_RESETVALUE; usart->IEN = _USART_IEN_RESETVALUE; usart->IFC = _USART_IFC_MASK; usart->IRCTRL = _USART_IRCTRL_RESETVALUE; /* Do not reset route register, setting should be done independently */ }
/***************************************************************************//** * @brief * Init USART for synchronous mode. * * @details * This function will configure basic settings in order to operate in * synchronous mode. Consider using USART_Reset() prior to this function if * state of configuration is not known, since only configuration settings * specified by @p init are set. * * Special control setup not covered by this function may be done either * before or after using this function (but normally before enabling) * by direct modification of the CTRL register. * * Notice that pins used by the USART module must be properly configured * by the user explicitly, in order for the USART to work as intended. * (When configuring pins, one should remember to consider the sequence of * configuration, in order to avoid unintended pulses/glitches on output * pins.) * * @param[in] usart * Pointer to USART peripheral register block. (UART does not support this * mode.) * * @param[in] init * Pointer to initialization structure used to configure basic async setup. ******************************************************************************/ void USART_InitSync(USART_TypeDef *usart, USART_InitSync_TypeDef *init) { /* Make sure the module exists on the selected chip */ EFM_ASSERT(USART_REF_VALID(usart)); /* Ensure disabled while doing config */ usart->CMD = USART_CMD_RXDIS | USART_CMD_TXDIS | USART_CMD_MASTERDIS; /* Reset bits that should be reset for synchronous mode or needs reconfig */ usart->CTRL &= ~(_USART_CTRL_CLKPOL_MASK | _USART_CTRL_CLKPHA_MASK | _USART_CTRL_MSBF_MASK | _USART_CTRL_SCMODE_MASK | _USART_CTRL_SCRETRANS_MASK); /* Set bits for synchronous mode */ usart->CTRL |= USART_CTRL_SYNC | (uint32_t)(init->clockMode); if (init->msbf) { usart->CTRL |= USART_CTRL_MSBF; } /* Make sure IrDA is disabled */ usart->IRCTRL &= ~USART_IRCTRL_IREN; /* Configure databits, leave stopbits and parity at reset default (not used) */ usart->FRAME = (uint32_t)(init->databits) | USART_FRAME_STOPBITS_DEFAULT | USART_FRAME_PARITY_DEFAULT; /* Configure baudrate */ USART_BaudrateSyncSet(usart, init->refFreq, init->baudrate); /* Finally enable (as specified) */ if (init->master) { usart->CMD = USART_CMD_MASTEREN; } usart->CMD = (uint32_t)(init->enable); }