/* * Copyright (c) 2020, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /*!**************************************************************************** * @file dl_uart.h * @brief UART Driver Library * @defgroup UART Universal Asynchronous Receiver-Transmitter (UART) * * @anchor ti_dl_dl_uart_Overview * # Overview * * The Universal Asynchronous Receiver-Transmitter Driver Library allows * full configuration of the MSPM0 UART module. * This module provides common functionality for UART-Main and UART-Extend, but * developers should use the corresponding dl_uart_extend or dl_uart_main APIs * directly. * *
****************************************************************************** */ /** @addtogroup UART * @{ */ #ifndef ti_dl_dl_uart__include #define ti_dl_dl_uart__include #if defined(ti_dl_dl_uart_main__include) || \ defined(ti_dl_dl_uart_extend__include) || defined(DOXYGEN__INCLUDE) #include #include #include #include #if defined(__MSPM0_HAS_UART_MAIN__) || defined(__MSPM0_HAS_UART_EXTD__) #ifdef __cplusplus extern "C" { #endif /* clang-format off */ /** @addtogroup DL_UART_INTERRUPT * @{ */ /*! * @brief DMA done on transmit interrupt */ #define DL_UART_INTERRUPT_DMA_DONE_TX (UART_CPU_INT_IMASK_DMA_DONE_TX_SET) /*! * @brief DMA done on receive interrupt */ #define DL_UART_INTERRUPT_DMA_DONE_RX (UART_CPU_INT_IMASK_DMA_DONE_RX_SET) /*! * @brief Clear to send interrupt */ #define DL_UART_INTERRUPT_CTS_DONE (UART_CPU_INT_IMASK_CTS_SET) /*! * @brief 9-bit mode address match interrupt */ #define DL_UART_INTERRUPT_ADDRESS_MATCH (UART_CPU_INT_IMASK_ADDR_MATCH_SET) /*! * @brief LINC0 match interrupt */ #define DL_UART_INTERRUPT_LINC0_MATCH (UART_CPU_INT_IMASK_LINC0_SET) /*! * @brief End of transmission interrupt */ #define DL_UART_INTERRUPT_EOT_DONE (UART_CPU_INT_IMASK_EOT_SET) /*! * @brief UART transmit interrupt */ #define DL_UART_INTERRUPT_TX (UART_CPU_INT_IMASK_TXINT_SET) /*! * @brief UART receive interrupt */ #define DL_UART_INTERRUPT_RX (UART_CPU_INT_IMASK_RXINT_SET) /*! * @brief LIN hardware counter overflow interrupt */ #define DL_UART_INTERRUPT_LIN_COUNTER_OVERFLOW \ (UART_CPU_INT_IMASK_LINOVF_SET) /*! * @brief LIN rising edge LINC1 interrupt */ #define DL_UART_INTERRUPT_LIN_RISING_EDGE \ (UART_CPU_INT_IMASK_LINC1_SET) /*! * @brief LIN falling edge LINC0 interrupt */ #define DL_UART_INTERRUPT_LIN_FALLING_EDGE \ (UART_CPU_INT_IMASK_LINC0_SET) /*! * @brief Positive Edge on UARTxRXD interrupt */ #define DL_UART_INTERRUPT_RXD_POS_EDGE (UART_CPU_INT_IMASK_RXPE_SET) /*! * @brief Negative Edge on UARTxRXD interrupt */ #define DL_UART_INTERRUPT_RXD_NEG_EDGE (UART_CPU_INT_IMASK_RXNE_SET) /*! * @brief Overrun error interrupt */ #define DL_UART_INTERRUPT_OVERRUN_ERROR (UART_CPU_INT_IMASK_OVRERR_SET) /*! * @brief Break error interrupt */ #define DL_UART_INTERRUPT_BREAK_ERROR (UART_CPU_INT_IMASK_BRKERR_SET) /*! * @brief Parity error interrupt */ #define DL_UART_INTERRUPT_PARITY_ERROR (UART_CPU_INT_IMASK_PARERR_SET) /*! * @brief Framing error interrupt */ #define DL_UART_INTERRUPT_FRAMING_ERROR (UART_CPU_INT_IMASK_FRMERR_SET) /*! * @brief Receive timeout interrupt */ #define DL_UART_INTERRUPT_RX_TIMEOUT_ERROR (UART_CPU_INT_IMASK_RTOUT_SET) /*! * @brief Noise error interrupt */ #define DL_UART_INTERRUPT_NOISE_ERROR (UART_CPU_INT_IMASK_NERR_SET) /** @}*/ /*! @enum DL_UART_IIDX */ typedef enum { /*! UART interrupt index for DMA done on transmit */ DL_UART_IIDX_DMA_DONE_TX = UART_CPU_INT_IIDX_STAT_DMA_DONE_TX, /*! UART interrupt index for DMA done on receive */ DL_UART_IIDX_DMA_DONE_RX = UART_CPU_INT_IIDX_STAT_DMA_DONE_RX, /*! UART interrupt index for clear to send */ DL_UART_IIDX_CTS_DONE = UART_CPU_INT_IIDX_STAT_CTS, /*! UART interrupt index for 9-bit mode address match */ DL_UART_IIDX_ADDRESS_MATCH = UART_CPU_INT_IIDX_STAT_MODE_9B, /*! UART interrupt index for end of transmission */ DL_UART_IIDX_EOT_DONE = UART_CPU_INT_IIDX_STAT_EOT, /*! UART interrupt index for UART transmit */ DL_UART_IIDX_TX = UART_CPU_INT_IIDX_STAT_TXIFG, /*! UART interrupt index for UART receive */ DL_UART_IIDX_RX = UART_CPU_INT_IIDX_STAT_RXIFG, /*! UART interrupt index for LIN hardware counter overflow */ DL_UART_IIDX_LIN_COUNTER_OVERFLOW = UART_CPU_INT_IIDX_STAT_LINOVF, /*! UART interrupt index for LIN rising edge LINC1 */ DL_UART_IIDX_LIN_RISING_EDGE = UART_CPU_INT_IIDX_STAT_LINC1, /*! UART interrupt index for LIN falling edge LINC0 */ DL_UART_IIDX_LIN_FALLING_EDGE = UART_CPU_INT_IIDX_STAT_LINC0, /*! UART interrupt index for positive edge on UARTxRXD */ DL_UART_IIDX_RXD_POS_EDGE = UART_CPU_INT_IIDX_STAT_RXPE, /*! UART interrupt index for negative edge on UARTxRXD */ DL_UART_IIDX_RXD_NEG_EDGE = UART_CPU_INT_IIDX_STAT_RXNE, /*! UART interrupt index for overrun error */ DL_UART_IIDX_OVERRUN_ERROR = UART_CPU_INT_IIDX_STAT_OEFG, /*! UART interrupt index for break error */ DL_UART_IIDX_BREAK_ERROR = UART_CPU_INT_IIDX_STAT_BEFG, /*! UART interrupt index for parity error */ DL_UART_IIDX_PARITY_ERROR = UART_CPU_INT_IIDX_STAT_PEFG, /*! UART interrupt index for framing error */ DL_UART_IIDX_FRAMING_ERROR = UART_CPU_INT_IIDX_STAT_FEFG, /*! UART interrupt index for receive timeout */ DL_UART_IIDX_RX_TIMEOUT_ERROR = UART_CPU_INT_IIDX_STAT_RTFG, /*! UART interrupt index for noise error */ DL_UART_IIDX_NOISE_ERROR = UART_CPU_INT_IIDX_STAT_NERR_EVT, /*! UART interrupt index for no interrupt */ DL_UART_IIDX_NO_INTERRUPT = UART_CPU_INT_IIDX_STAT_NO_INTR } DL_UART_IIDX; /*! @enum DL_UART_DMA_IIDX_RX */ typedef enum { /*! UART interrupt index for enabling UART receive as DMA trigger */ DL_UART_DMA_IIDX_RX_TRIGGER = UART_DMA_TRIG_RX_IIDX_STAT_RXIFG, /*! UART interrupt index for enabling UART receive timeout as DMA trigger */ DL_UART_DMA_IIDX_RX_TIMEOUT_TRIGGER = UART_DMA_TRIG_RX_IIDX_STAT_RTFG } DL_UART_DMA_IIDX_RX; /*! @enum DL_UART_DMA_IIDX_TX */ typedef enum { /*! UART interrupt index for enabling UART transmit as DMA trigger */ DL_UART_DMA_IIDX_TX_TRIGGER = UART_DMA_TRIG_TX_IIDX_STAT_TXIFG } DL_UART_DMA_IIDX_TX; /** @addtogroup DL_UART_DMA_INTERRUPT_RX * @{ */ /*! * @brief UART interrupt for enabling UART receive as DMA trigger */ #define DL_UART_DMA_INTERRUPT_RX (UART_DMA_TRIG_RX_IMASK_RXINT_SET) /*! * @brief UART interrupt indicating DMA is done with the RX */ #define DL_UART_DMA_DONE_INTERRUPT_RX (UART_CPU_INT_IMASK_DMA_DONE_RX_SET) /*! * @brief UART interrupt for enabling UART receive timeout as DMA trigger */ #define DL_UART_DMA_INTERRUPT_RX_TIMEOUT (UART_DMA_TRIG_RX_IMASK_RTOUT_SET) /** @}*/ /*! * @brief UART interrupt for enabling UART transmit as DMA trigger */ #define DL_UART_DMA_INTERRUPT_TX (UART_DMA_TRIG_TX_IMASK_TXINT_SET) /*! * @brief UART interrupt indicating DMA is done with the TX */ #define DL_UART_DMA_DONE_INTERRUPT_TX (UART_CPU_INT_IMASK_DMA_DONE_TX_SET) /** @addtogroup DL_UART_ERROR * @{ */ /*! * @brief Overrun error ocurred */ #define DL_UART_ERROR_OVERRUN (UART_RXDATA_OVRERR_SET) /*! * @brief Break error ocurred */ #define DL_UART_ERROR_BREAK (UART_RXDATA_BRKERR_SET) /*! * @brief Parity error ocurred */ #define DL_UART_ERROR_PARITY (UART_RXDATA_PARERR_SET) /*! * @brief Framing error ocurred */ #define DL_UART_ERROR_FRAMING (UART_RXDATA_FRMERR_SET) /** @}*/ /*! @enum DL_UART_PULSE_WIDTH */ typedef enum { /*! Pulses shorter then 5ns length are filtered */ DL_UART_PULSE_WIDTH_5_NS = UART_GFCTL_AGFSEL_AGLIT_5, /*! Pulses shorter then 10ns length are filtered */ DL_UART_PULSE_WIDTH_10_NS = UART_GFCTL_AGFSEL_AGLIT_10, /*! Pulses shorter then 25ns length are filtered */ DL_UART_PULSE_WIDTH_25_NS = UART_GFCTL_AGFSEL_AGLIT_25, /*! Pulses shorter then 50ns length are filtered */ DL_UART_PULSE_WIDTH_50_NS = UART_GFCTL_AGFSEL_AGLIT_50 } DL_UART_PULSE_WIDTH; /*! @enum DL_UART_OVERSAMPLING_RATE */ typedef enum { /*! Set oversampling rate to 16x */ DL_UART_OVERSAMPLING_RATE_16X = UART_CTL0_HSE_OVS16, /*! Set oversampling rate to 8x */ DL_UART_OVERSAMPLING_RATE_8X = UART_CTL0_HSE_OVS8, /*! Set oversampling rate to 3x. * IrDA, Manchester and DALI are not supported when 3x oversampling is * enabled. */ DL_UART_OVERSAMPLING_RATE_3X = UART_CTL0_HSE_OVS3 } DL_UART_OVERSAMPLING_RATE; /*! @enum DL_UART_PARITY */ typedef enum { /*! Enable even parity generation, checks for an even number of 1s */ DL_UART_PARITY_EVEN = (UART_LCRH_PEN_ENABLE | UART_LCRH_EPS_EVEN), /*! Enable odd parity generation, checks for an odd number of 1s */ DL_UART_PARITY_ODD = (UART_LCRH_PEN_ENABLE | UART_LCRH_EPS_ODD), /*! Enable stick parity with a parity bit of '1' * When enabled, a permanent '1' is set as parity when transmitting and * checked as '1' when receiving data. */ DL_UART_PARITY_STICK_ONE = (UART_LCRH_PEN_ENABLE | UART_LCRH_SPS_ENABLE | UART_LCRH_EPS_ODD), /*! Enable stick parity with a parity bit of '0' * When enabled, a permanent '0' is set as parity when transmitting and * checked as '0' when receiving data. */ DL_UART_PARITY_STICK_ZERO = (UART_LCRH_PEN_ENABLE | UART_LCRH_SPS_ENABLE | UART_LCRH_EPS_EVEN), /*! Disable parity checking and generation */ DL_UART_PARITY_NONE = UART_LCRH_PEN_DISABLE } DL_UART_PARITY; /*! @enum DL_UART_WORD_LENGTH */ typedef enum { /*! Word length is 5 bits */ DL_UART_WORD_LENGTH_5_BITS = UART_LCRH_WLEN_DATABIT5, /*! Word length is 6 bits */ DL_UART_WORD_LENGTH_6_BITS = UART_LCRH_WLEN_DATABIT6, /*! Word length is 7 bits */ DL_UART_WORD_LENGTH_7_BITS = UART_LCRH_WLEN_DATABIT7, /*! Word length is 8 bits */ DL_UART_WORD_LENGTH_8_BITS = UART_LCRH_WLEN_DATABIT8 } DL_UART_WORD_LENGTH; /*! @enum DL_UART_MODE */ typedef enum { /*! Normal operation */ DL_UART_MODE_NORMAL = UART_CTL0_MODE_UART, /*! Operate in RS485 mode */ DL_UART_MODE_RS485 = UART_CTL0_MODE_RS485, /*! Operate in Idle Line mode */ DL_UART_MODE_IDLE_LINE = UART_CTL0_MODE_IDLELINE, /*! Operate in 9 Bit Address mode */ DL_UART_MODE_ADDR_9_BIT = UART_CTL0_MODE_ADDR9BIT, /*! Operate in ISO7816 Smart Card Support mode */ DL_UART_MODE_SMART_CARD = UART_CTL0_MODE_SMART, /*! Operate in DALI mode */ DL_UART_MODE_DALI = UART_CTL0_MODE_DALI } DL_UART_MODE; /*! @enum DL_UART_DIRECTION */ typedef enum { /*! Enable UART transmitter */ DL_UART_DIRECTION_TX = UART_CTL0_TXE_ENABLE, /*! Enable UART receiver */ DL_UART_DIRECTION_RX = UART_CTL0_RXE_ENABLE, /*! Enable UART transmitter and receiver */ DL_UART_DIRECTION_TX_RX = (UART_CTL0_RXE_ENABLE | UART_CTL0_TXE_ENABLE), /*! Disable UART transmitter and receiver */ DL_UART_DIRECTION_NONE = (UART_CTL0_RXE_DISABLE | UART_CTL0_TXE_DISABLE) } DL_UART_DIRECTION; /*! @enum DL_UART_CLOCK */ typedef enum { /*! Selects BUSCLK as the clock source */ DL_UART_CLOCK_BUSCLK = UART_CLKSEL_BUSCLK_SEL_ENABLE, /*! Selects MFCLK as the clock source */ DL_UART_CLOCK_MFCLK = UART_CLKSEL_MFCLK_SEL_ENABLE, /*! Selects LFCLK as the clock source */ DL_UART_CLOCK_LFCLK = UART_CLKSEL_LFCLK_SEL_ENABLE } DL_UART_CLOCK; /*! @enum DL_UART_FLOW_CONTROL */ typedef enum { /*! Enable request to send */ DL_UART_FLOW_CONTROL_RTS = UART_CTL0_RTSEN_ENABLE, /*! Enable clear to send */ DL_UART_FLOW_CONTROL_CTS = UART_CTL0_CTSEN_ENABLE, /*! Enable request to send and clear to send */ DL_UART_FLOW_CONTROL_RTS_CTS = (UART_CTL0_RTSEN_ENABLE | UART_CTL0_CTSEN_ENABLE), /*! Disable flow control */ DL_UART_FLOW_CONTROL_NONE = (UART_CTL0_CTSEN_DISABLE | UART_CTL0_RTSEN_DISABLE) } DL_UART_FLOW_CONTROL; /*! @enum DL_UART_RTS */ typedef enum { /*! RTS is asserted indicating data in RX FIFO is below threshold */ DL_UART_RTS_ASSERT = UART_CTL0_RTS_SET, /*! RTS is deasserted indicating data in RX FIFO is at or above threshold */ DL_UART_RTS_DEASSERT = UART_CTL0_RTS_CLR } DL_UART_RTS; /*! @enum DL_UART_STOP_BITS */ typedef enum { /*! One stop bit is transmitted at the end of the frame */ DL_UART_STOP_BITS_ONE = UART_LCRH_STP2_DISABLE, /*! Two stop bits are transmitted at the end of the frame */ DL_UART_STOP_BITS_TWO = UART_LCRH_STP2_ENABLE } DL_UART_STOP_BITS; /*! @enum DL_UART_TXD_OUT */ typedef enum { /*! TXD pin is low */ DL_UART_TXD_OUT_LOW = UART_CTL0_TXD_OUT_LOW, /*! TXD pin is high */ DL_UART_TXD_OUT_HIGH = UART_CTL0_TXD_OUT_HIGH } DL_UART_TXD_OUT; /*! @enum DL_UART_TX_FIFO_LEVEL */ typedef enum { /*! Interrupt triggers when FIFO <= 3/4 empty */ DL_UART_TX_FIFO_LEVEL_3_4_EMPTY = UART_IFLS_TXIFLSEL_LVL_3_4, /*! Interrupt triggers when FIFO <= 1/2 empty */ DL_UART_TX_FIFO_LEVEL_1_2_EMPTY = UART_IFLS_TXIFLSEL_LVL_1_2, /*! Interrupt triggers when FIFO <= 1/4 empty */ DL_UART_TX_FIFO_LEVEL_1_4_EMPTY = UART_IFLS_TXIFLSEL_LVL_1_4, /*! Interrupt triggers when FIFO is empty */ DL_UART_TX_FIFO_LEVEL_EMPTY = UART_IFLS_TXIFLSEL_LVL_EMPTY, /*! Interrupt triggers when FIFO >= 1 entry */ DL_UART_TX_FIFO_LEVEL_ONE_ENTRY = UART_IFLS_TXIFLSEL_LVL_1 } DL_UART_TX_FIFO_LEVEL; /*! @enum DL_UART_RX_FIFO_LEVEL */ typedef enum { /*! Interrupt triggers when FIFO >= 1 entry available. Required for *! DMA trigger */ DL_UART_RX_FIFO_LEVEL_ONE_ENTRY = UART_IFLS_RXIFLSEL_LVL_1, /*! Interrupt triggers when FIFO is full */ DL_UART_RX_FIFO_LEVEL_FULL = UART_IFLS_RXIFLSEL_LVL_FULL, /*! Interrupt triggers when FIFO >= 3/4 full */ DL_UART_RX_FIFO_LEVEL_3_4_FULL = UART_IFLS_RXIFLSEL_LVL_3_4, /*! Interrupt triggers when FIFO >= 1/2 full */ DL_UART_RX_FIFO_LEVEL_1_2_FULL = UART_IFLS_RXIFLSEL_LVL_1_2, /*! Interrupt triggers when FIFO >= 1/4 full */ DL_UART_RX_FIFO_LEVEL_1_4_FULL = UART_IFLS_RXIFLSEL_LVL_1_4, } DL_UART_RX_FIFO_LEVEL; /*! @enum DL_UART_IRDA_CLOCK */ typedef enum { /*! IrDA encode data is based on the Baud Rate clock */ DL_UART_IRDA_CLOCK_BAUD_RATE = UART_IRCTL_IRTXCLK_BRCLK, /*! IrDA encode data is based on the Functional clock */ DL_UART_IRDA_CLOCK_FUNCTIONAL = UART_IRCTL_IRTXCLK_BITCLK } DL_UART_IRDA_CLOCK; /*! @enum DL_UART_IRDA_POLARITY */ typedef enum { /*! IrDA transceiver delivers a low pulse when a light pulse is seen */ DL_UART_IRDA_POLARITY_LOW = UART_IRCTL_IRRXPL_LOW, /*! IrDA transceiver delivers a high pulse when a light pulse is seen */ DL_UART_IRDA_POLARITY_HIGH = UART_IRCTL_IRRXPL_HIGH } DL_UART_IRDA_POLARITY; /*! * @brief Sets the IrDA pulse width to 3/16 bit period when using the BITCLK16 */ #define DL_UART_PULSE_WIDTH_3_16_BIT_PERIOD ((uint32_t) 0x00000000U) /*! @enum DL_UART_CLOCK_DIVIDE_RATIO */ typedef enum { /*! UART source clock divide ratio set to 1 */ DL_UART_CLOCK_DIVIDE_RATIO_1 = UART_CLKDIV_RATIO_DIV_BY_1, /*! UART source clock divide ratio set to 2 */ DL_UART_CLOCK_DIVIDE_RATIO_2 = UART_CLKDIV_RATIO_DIV_BY_2, /*! UART source clock divide ratio set to 3 */ DL_UART_CLOCK_DIVIDE_RATIO_3 = UART_CLKDIV_RATIO_DIV_BY_3, /*! UART source clock divide ratio set to 4 */ DL_UART_CLOCK_DIVIDE_RATIO_4 = UART_CLKDIV_RATIO_DIV_BY_4, /*! UART source clock divide ratio set to 5 */ DL_UART_CLOCK_DIVIDE_RATIO_5 = UART_CLKDIV_RATIO_DIV_BY_5, /*! UART source clock divide ratio set to 6 */ DL_UART_CLOCK_DIVIDE_RATIO_6 = UART_CLKDIV_RATIO_DIV_BY_6, /*! UART source clock divide ratio set to 7 */ DL_UART_CLOCK_DIVIDE_RATIO_7 = UART_CLKDIV_RATIO_DIV_BY_7, /*! UART source clock divide ratio set to 8 */ DL_UART_CLOCK_DIVIDE_RATIO_8 = UART_CLKDIV_RATIO_DIV_BY_8 } DL_UART_CLOCK_DIVIDE_RATIO; /*! @enum DL_UART_CLOCK_DIVIDE2_RATIO */ typedef enum { /*! UART source clock divide 2 ratio set to 1 */ DL_UART_CLOCK_DIVIDE2_RATIO_1 = UART_CLKDIV2_RATIO_DIV_BY_1, /*! UART source clock divide 2 ratio set to 2 */ DL_UART_CLOCK_DIVIDE2_RATIO_2 = UART_CLKDIV2_RATIO_DIV_BY_2, /*! UART source clock divide 2 ratio set to 3 */ DL_UART_CLOCK_DIVIDE2_RATIO_3 = UART_CLKDIV2_RATIO_DIV_BY_3, /*! UART source clock divide 2 ratio set to 4 */ DL_UART_CLOCK_DIVIDE2_RATIO_4 = UART_CLKDIV2_RATIO_DIV_BY_4, /*! UART source clock divide 2 ratio set to 5 */ DL_UART_CLOCK_DIVIDE2_RATIO_5 = UART_CLKDIV2_RATIO_DIV_BY_5, /*! UART source clock divide 2 ratio set to 6 */ DL_UART_CLOCK_DIVIDE2_RATIO_6 = UART_CLKDIV2_RATIO_DIV_BY_6, /*! UART source clock divide 2 ratio set to 7 */ DL_UART_CLOCK_DIVIDE2_RATIO_7 = UART_CLKDIV2_RATIO_DIV_BY_7, /*! UART source clock divide 2 ratio set to 8 */ DL_UART_CLOCK_DIVIDE2_RATIO_8 = UART_CLKDIV2_RATIO_DIV_BY_8 } DL_UART_CLOCK_DIVIDE2_RATIO; /* clang-format on */ /*! * @brief Configuration struct for @ref DL_UART_init */ typedef struct { /*! The communication mode and protocol used. One of @ref DL_UART_MODE */ DL_UART_MODE mode; /*! The communication direction. One of @ref DL_UART_DIRECTION. */ DL_UART_DIRECTION direction; /*! The flow control configuration. One of @ref DL_UART_FLOW_CONTROL */ DL_UART_FLOW_CONTROL flowControl; /*! The parity configuration. One of @ref DL_UART_PARITY */ DL_UART_PARITY parity; /*! The size of the data transfer. One of @ref DL_UART_WORD_LENGTH */ DL_UART_WORD_LENGTH wordLength; /*! One of @ref DL_UART_STOP_BITS */ DL_UART_STOP_BITS stopBits; } DL_UART_Config; /*! * @brief Configuration struct for @ref DL_UART_setClockConfig. */ typedef struct { /*! Selects uart module clock source @ref DL_UART_CLOCK */ DL_UART_CLOCK clockSel; /*! Selects the divide ratio. One of @ref DL_UART_CLOCK_DIVIDE_RATIO */ DL_UART_CLOCK_DIVIDE_RATIO divideRatio; } DL_UART_ClockConfig; #ifdef __MSPM0_HAS_UART_MAIN__ /** * @brief Configuration structure to backup UART Main peripheral state before * going to STOP/STANDBY mode. Used by * @ref DL_UART_Main_saveConfiguration and * @ref DL_UART_Main_restoreConfiguration */ typedef struct { /*! Combination of basic UART control configurations that are * compressed to a single word as they are stored in the UART * registers. See @ref DL_UART_init for how the peripheral control word * is created. */ uint32_t controlWord; /*! UART module clock source. One of @ref DL_UART_CLOCK */ uint32_t clockSel; /*! UART clock divider. One of @ref DL_UART_CLOCK_DIVIDE_RATIO */ uint32_t divideRatio; /*! Combination of UART interrupt FIFO level select configurations that are * compressed to a single word as they are stored in the UART * registers. */ uint32_t interruptFifoLevelSelectWord; /*! UART integer baud rate divisor. Value between 0 - 65535. */ uint32_t ibrd; /*! UART fractional baud rate divisor. Value between 0 - 63. */ uint32_t fbrd; /*! Combination of UART Line Control Register configurations that are * compressed to a single word as they are stored in the UART * registers. See @ref DL_UART_init for how the peripheral control word * is created. */ uint32_t lineControlRegisterWord; /*! Combination of UART glitch filter configurations that are * compressed to a single word as they are stored in the UART * registers. */ uint32_t glitchFilterControlWord; /*! UART interrupt mask for EVENT0. * Bitwise OR of @ref DL_UART_INTERRUPT */ uint32_t interruptMask0; /*! UART interrupt mask for EVENT1. * Bitwise OR of @ref DL_UART_DMA_INTERRUPT_RX */ uint32_t interruptMask1; /*! UART interrupt mask for EVENT2. * Bitwise OR of @ref DL_UART_DMA_INTERRUPT_TX */ uint32_t interruptMask2; /*! Boolean flag indicating whether or not a valid configuration structure * exists. Should not be modified by the user. */ bool backupRdy; } DL_UART_Main_backupConfig; #endif /* __MSPM0_HAS_UART_MAIN__ */ #ifdef __MSPM0_HAS_UART_EXTD__ /** * @brief Configuration structure to backup UART Extend peripheral state before * going to STOP/STANDBY mode. Used by * @ref DL_UART_Extend_saveConfiguration and * @ref DL_UART_Extend_restoreConfiguration */ typedef struct { /*! Combination of basic UART control configurations that are * compressed to a single word as they are stored in the UART * registers. See @ref DL_UART_init for how the peripheral control word * is created. */ uint32_t controlWord; /*! UART module clock source. One of @ref DL_UART_CLOCK */ uint32_t clockSel; /*! UART clock divider. One of @ref DL_UART_CLOCK_DIVIDE_RATIO */ uint32_t divideRatio; /*! Combination of UART Line Control Register configurations that are * compressed to a single word as they are stored in the UART * registers. See @ref DL_UART_init for how the peripheral control word * is created. */ uint32_t lineControlRegisterWord; /*! Combination of UART interrupt FIFO level select configurations that are * compressed to a single word as they are stored in the UART * registers. */ uint32_t interruptFifoLevelSelectWord; /*! UART integer baud rate divisor. Value between 0 - 65535. */ uint32_t ibrd; /*! UART fractional baud rate divisor. Value between 0 - 63. */ uint32_t fbrd; /*! Combination of UART glitch filter configurations that are * compressed to a single word as they are stored in the UART * registers. */ uint32_t glitchFilterControlWord; /*! Combination of UART LIN basic configurations that are * compressed to a single word as they are stored in the UART * registers. */ uint32_t linControlWord; /*! Combination of UART IrDA basic configurations that are * compressed to a single word as they are stored in the UART * registers. */ uint32_t irdaControlWord; /*! UART address mask for 9-bit or Idle mode. */ uint32_t addressMask; /*! UART address that should be matched for 9-bit or Idle mode. */ uint32_t address; /*! UART interrupt status for EVENT0. * Bitwise OR of @ref DL_UART_INTERRUPT */ uint32_t interruptMask0; /*! UART interrupt status for EVENT1. * Bitwise OR of @ref DL_UART_DMA_INTERRUPT_RX */ uint32_t interruptMask1; /*! UART interrupt status for EVENT2. * Bitwise OR of @ref DL_UART_DMA_INTERRUPT_TX */ uint32_t interruptMask2; /*! Boolean flag indicating whether or not a valid configuration structure * exists. Should not be modified by the user. */ bool backupRdy; } DL_UART_Extend_backupConfig; #endif /* __MSPM0_HAS_UART_EXTD__ */ /** * @brief Initialize the UART peripheral * * Initializes all the common configurable options for the UART peripheral. Any * other custom configuration can be done after calling this API. The UART is * not enabled in this API. * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] config Configuration for UART peripheral */ void DL_UART_init(UART_Regs *uart, const DL_UART_Config *config); /** * @brief Enables the Peripheral Write Enable (PWREN) register for the UART * * Before any peripheral registers can be configured by software, the * peripheral itself must be enabled by writing the ENABLE bit together with * the appropriate KEY value to the peripheral's PWREN register. * * @note For power savings, please refer to @ref DL_UART_enable * * @param uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_enablePower(UART_Regs *uart) { uart->GPRCM.PWREN = (UART_PWREN_KEY_UNLOCK_W | UART_PWREN_ENABLE_ENABLE); } /** * @brief Disables the Peripheral Write Enable (PWREN) register for the UART * * When the PWREN.ENABLE bit is cleared, the peripheral's registers are not * accessible for read/write operations. * * @note This API does not provide large power savings. For power savings, * please refer to @ref DL_UART_enable * * @param uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_disablePower(UART_Regs *uart) { uart->GPRCM.PWREN = (UART_PWREN_KEY_UNLOCK_W | UART_PWREN_ENABLE_DISABLE); } /** * @brief Returns if the Peripheral Write Enable (PWREN) register for the UART * is enabled * * Before any peripheral registers can be configured by software, the * peripheral itself must be enabled by writing the ENABLE bit together with * the appropriate KEY value to the peripheral's PWREN register. * * When the PWREN.ENABLE bit is cleared, the peripheral's registers are not * accessible for read/write operations. * * @param uart Pointer to the register overlay for the peripheral * * @return true if peripheral register access is enabled * @return false if peripheral register access is disabled */ __STATIC_INLINE bool DL_UART_isPowerEnabled(const UART_Regs *uart) { return ((uart->GPRCM.PWREN & UART_PWREN_ENABLE_MASK) == UART_PWREN_ENABLE_ENABLE); } /** * @brief Resets uart peripheral * * @param uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_reset(UART_Regs *uart) { uart->GPRCM.RSTCTL = (UART_RSTCTL_KEY_UNLOCK_W | UART_RSTCTL_RESETSTKYCLR_CLR | UART_RSTCTL_RESETASSERT_ASSERT); } /** * @brief Returns if uart peripheral was reset * * @param uart Pointer to the register overlay for the peripheral * * @return true if peripheral was reset * @return false if peripheral wasn't reset * */ __STATIC_INLINE bool DL_UART_isReset(const UART_Regs *uart) { return ((uart->GPRCM.STAT & UART_GPRCM_STAT_RESETSTKY_MASK) == UART_GPRCM_STAT_RESETSTKY_RESET); } /** * @brief Enable the UART peripheral * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_enable(UART_Regs *uart) { uart->CTL0 |= UART_CTL0_ENABLE_ENABLE; } /** * @brief Checks if the UART peripheral is enabled * * @param[in] uart Pointer to the register overlay for the peripheral * * @return Returns the enabled status of the UART * * @retval true The UART peripheral is enabled * @retval false The UART peripheral is disabled */ __STATIC_INLINE bool DL_UART_isEnabled(const UART_Regs *uart) { return ((uart->CTL0 & UART_CTL0_ENABLE_MASK) == UART_CTL0_ENABLE_ENABLE); } /** * @brief Disable the UART peripheral * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_disable(UART_Regs *uart) { uart->CTL0 &= ~(UART_CTL0_ENABLE_MASK); } /** * @brief Configure UART source clock * * @param[in] uart Pointer to the register overlay for the * peripheral * @param[in] config Pointer to the clock configuration struct * @ref DL_UART_ClockConfig. */ void DL_UART_setClockConfig( UART_Regs *uart, const DL_UART_ClockConfig *config); /** * @brief Get UART source clock configuration * * @param[in] uart Pointer to the register overlay for the * peripheral * @param[in] config Pointer to the clock configuration struct * @ref DL_UART_ClockConfig. */ void DL_UART_getClockConfig( const UART_Regs *uart, DL_UART_ClockConfig *config); /** * @brief Configure the baud rate * * Given the target baud rate and the frequency of the UART clock source, this * API determines and sets the recommended oversampling setting, and then * calculates and sets the required baud rate divisors. * * The oversampling rate that will be set is the highest possible oversampling * rate given the target baud rate and UART clock frequency. * * If the user wishes to avoid having the CPU calculate the baud rate divisors * or not use the recommended calculated values, the user can call * @ref DL_UART_setOversampling and @ref DL_UART_setBaudRateDivisor directly. * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] clockFreq The clock frequency in Hz of the UART clock source * @param[in] baudRate The target baud rate * * @sa DL_UART_setOversampling * @sa DL_UART_setBaudRateDivisor */ void DL_UART_configBaudRate( UART_Regs *uart, uint32_t clockFreq, uint32_t baudRate); /** * @brief Set the oversampling rate * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] rate The oversampling rate to use. * One of @ref DL_UART_OVERSAMPLING_RATE * * @pre If the UART has already been enabled, then it must be made ready for * configuration by first calling @ref DL_UART_changeConfig * @post If @ref DL_UART_changeConfig was called, then the UART must be * re-enabled by calling @ref DL_UART_enable */ __STATIC_INLINE void DL_UART_setOversampling( UART_Regs *uart, DL_UART_OVERSAMPLING_RATE rate) { DL_Common_updateReg(&uart->CTL0, (uint32_t) rate, UART_CTL0_HSE_MASK); } /** * @brief Get the oversampling rate * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The current oversampling rate * * @retval One of @ref DL_UART_OVERSAMPLING_RATE * */ __STATIC_INLINE DL_UART_OVERSAMPLING_RATE DL_UART_getOversampling( const UART_Regs *uart) { uint32_t rate = uart->CTL0 & UART_CTL0_HSE_MASK; return (DL_UART_OVERSAMPLING_RATE)(rate); } /** * @brief Enable loopback mode * * Enables the loopback mode. When enabled, the UARTxTXD path is fed through * the UARTxRXD path. * * @param[in] uart Pointer to the register overlay for the peripheral * * @pre If the UART has already been enabled, then it must be made ready for * configuration by first calling @ref DL_UART_changeConfig * @post If @ref DL_UART_changeConfig was called, then the UART must be * re-enabled by calling @ref DL_UART_enable */ __STATIC_INLINE void DL_UART_enableLoopbackMode(UART_Regs *uart) { uart->CTL0 |= UART_CTL0_LBE_ENABLE; } /** * @brief Check if loopback mode is enabled * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The status of loopback mode * * @retval true Loopback mode is enabled * @retval false Loopback mode is disabled */ __STATIC_INLINE bool DL_UART_isLoopbackModeEnabled(const UART_Regs *uart) { return ((uart->CTL0 & UART_CTL0_LBE_MASK) == UART_CTL0_LBE_ENABLE); } /** * @brief Disable loopback mode * * Disables the loopback mode. When disabled, the UARTxTXD path is not fed through * the UARTxRXD path. * * @param[in] uart Pointer to the register overlay for the peripheral * * @pre If the UART has already been enabled, then it must be made ready for * configuration by first calling @ref DL_UART_changeConfig * @post If @ref DL_UART_changeConfig was called, then the UART must be * re-enabled by calling @ref DL_UART_enable */ __STATIC_INLINE void DL_UART_disableLoopbackMode(UART_Regs *uart) { uart->CTL0 &= ~(UART_CTL0_LBE_MASK); } /** * @brief Set the direction of the UART communication * * If the UART is disabled in the middle of a transmit or receive, it * completes the current character before stopping. * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] direction Direction to set UART communication to. * One of @ref DL_UART_DIRECTION. * * @pre If the UART has already been enabled, then it must be made ready for * configuration by first calling @ref DL_UART_changeConfig * @post If @ref DL_UART_changeConfig was called, then the UART must be * re-enabled by calling @ref DL_UART_enable * */ __STATIC_INLINE void DL_UART_setDirection( UART_Regs *uart, DL_UART_DIRECTION direction) { DL_Common_updateReg(&uart->CTL0, (uint32_t) direction, UART_CTL0_TXE_MASK | UART_CTL0_RXE_MASK); } /** * @brief Get the direction of the UART communication * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The direction of UART communication. * * @retval One of @ref DL_UART_DIRECTION */ __STATIC_INLINE DL_UART_DIRECTION DL_UART_getDirection(const UART_Regs *uart) { uint32_t direction = uart->CTL0 & (UART_CTL0_TXE_MASK | UART_CTL0_RXE_MASK); return (DL_UART_DIRECTION)(direction); } /** * @brief Enable majority voting control * * When enabled, the three center bits are used to determine received sample * value. The value corresponding to at least two of the three samples is * considered to be the received value.In case of error (i.e. all 3 bits are * not the same), noise error is detected and bits RIS.NERR and register * RXDATA.NERR are set. * * When enabled with oversampling of 16, samples 7, 8, and 9 are * majority voted to decide the sampled bit value. * * When enabled with oversampling of 8, samples 3, 4, and 5 are majority * voted to decide the sampled bit value. The value corresponding to at least 2 * of the 3 samples is considered to be the received value. * * @param[in] uart Pointer to the register overlay for the peripheral * * @pre If the UART has already been enabled, then it must be made ready for * configuration by first calling @ref DL_UART_changeConfig * @post If @ref DL_UART_changeConfig was called, then the UART must be * re-enabled by calling @ref DL_UART_enable * * @sa DL_UART_setOversampling */ __STATIC_INLINE void DL_UART_enableMajorityVoting(UART_Regs *uart) { uart->CTL0 |= UART_CTL0_MAJVOTE_ENABLE; } /** * @brief Check if majority voting is enabled * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The status of majority control feature * * @retval true Majority voting is enabled * @retval false Majority voting is disabled */ __STATIC_INLINE bool DL_UART_isMajorityVotingEnabled(const UART_Regs *uart) { return ((uart->CTL0 & UART_CTL0_MAJVOTE_MASK) == UART_CTL0_MAJVOTE_ENABLE); } /** * @brief Disable majority voting control * * When disabled, only a single sample of the received bit of is taken. * * @param[in] uart Pointer to the register overlay for the peripheral * * @pre If the UART has already been enabled, then it must be made ready for * configuration by first calling @ref DL_UART_changeConfig * @post If @ref DL_UART_changeConfig was called, then the UART must be * re-enabled by calling @ref DL_UART_enable */ __STATIC_INLINE void DL_UART_disableMajorityVoting(UART_Regs *uart) { uart->CTL0 &= ~(UART_CTL0_MAJVOTE_MASK); } /** * @brief Enable most significant bit (MSB) first * * When enabled, the most significant bit (MSB) is sent first in the protocol * packet. This bit has effect on both the way the protocol byte is * transmitted and received. * * @param[in] uart Pointer to the register overlay for the peripheral * * @pre If the UART has already been enabled, then it must be made ready for * configuration by first calling @ref DL_UART_changeConfig * @post If @ref DL_UART_changeConfig was called, then the UART must be * re-enabled by calling @ref DL_UART_enable */ __STATIC_INLINE void DL_UART_enableMSBFirst(UART_Regs *uart) { uart->CTL0 |= UART_CTL0_MSBFIRST_ENABLE; } /** * @brief Check if most significant bit (MSB) first is enabled * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The status of majority control feature * * @retval true MSB first is enabled * @retval false MSB first is disabled */ __STATIC_INLINE bool DL_UART_isMSBFirstEnabled(const UART_Regs *uart) { return ( (uart->CTL0 & UART_CTL0_MSBFIRST_MASK) == UART_CTL0_MSBFIRST_ENABLE); } /** * @brief Disable most significant bit (MSB) first * * When disabled, the least significant bit (LSB) is sent first in the protocol * packet. This bit has effect on both the way the protocol byte is * transmitted and received. * * @param[in] uart Pointer to the register overlay for the peripheral * * @pre If the UART has already been enabled, then it must be made ready for * configuration by first calling @ref DL_UART_changeConfig * @post If @ref DL_UART_changeConfig was called, then the UART must be * re-enabled by calling @ref DL_UART_enable */ __STATIC_INLINE void DL_UART_disableMSBFirst(UART_Regs *uart) { uart->CTL0 &= ~(UART_CTL0_MSBFIRST_MASK); } /** * @brief Enable control of the TXD pin * * When enabled, the TXD pin can be controlled by the TXD_OUT bit. The UART * transmit section must first be disabled. * * @param[in] uart Pointer to the register overlay for the peripheral * * @pre If the UART has already been enabled, then it must be made ready for * configuration by first calling @ref DL_UART_changeConfig * @post If @ref DL_UART_changeConfig was called, then the UART must be * re-enabled by calling @ref DL_UART_enable * * @sa DL_UART_setDirection * @sa DL_UART_setTXDPin */ __STATIC_INLINE void DL_UART_enableTransmitPinManualControl(UART_Regs *uart) { uart->CTL0 |= UART_CTL0_TXD_OUT_EN_ENABLE; } /** * @brief Check if control of the TXD pin is enabled * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The status of control of the TXD pin * * @retval true Control of the TXD pin is enabled * @retval false Control of the TXD pin is disabled */ __STATIC_INLINE bool DL_UART_isTransmitPinManualControlEnabled( const UART_Regs *uart) { return ((uart->CTL0 & UART_CTL0_TXD_OUT_EN_MASK) == UART_CTL0_TXD_OUT_EN_ENABLE); } /** * @brief Disable control of the TXD pin * * When disabled, the TXD pin can not be controlled by the TXD_OUT bit * * @param[in] uart Pointer to the register overlay for the peripheral * * @pre If the UART has already been enabled, then it must be made ready for * configuration by first calling @ref DL_UART_changeConfig * @post If @ref DL_UART_changeConfig was called, then the UART must be * re-enabled by calling @ref DL_UART_enable */ __STATIC_INLINE void DL_UART_disableTransmitPinManualControl(UART_Regs *uart) { uart->CTL0 &= ~(UART_CTL0_TXD_OUT_EN_MASK); } /** * @brief Set the output of the TXD pin * * Control the output transmit data pin only when TXD_OUT_EN is enabled and * TXE is disabled. * * The TXD pin is set to manual control if it hadn't been * previously set. * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] txdOutVal Value to set the TXD pin output to. * One of @ref DL_UART_TXD_OUT * * @pre If the UART has already been enabled, then it must be made ready for * configuration by first calling @ref DL_UART_changeConfig * @post If @ref DL_UART_changeConfig was called, then the UART must be * re-enabled by calling @ref DL_UART_enable * * @sa DL_UART_disableTransmitPinManualControl * @sa DL_UART_enableTransmitPinManualControl */ __STATIC_INLINE void DL_UART_setTransmitPinManualOutput( UART_Regs *uart, DL_UART_TXD_OUT txdOutVal) { DL_Common_updateReg(&uart->CTL0, UART_CTL0_TXD_OUT_EN_ENABLE | (uint32_t) txdOutVal, UART_CTL0_TXD_OUT_EN_MASK | UART_CTL0_TXD_OUT_MASK); } /** * @brief Get the output value of the TXD pin * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The value of the TXD pin * * @retval One of @ref DL_UART_TXD_OUT */ __STATIC_INLINE DL_UART_TXD_OUT DL_UART_getTransmitPinManualOutput( const UART_Regs *uart) { uint32_t txdOutVal = uart->CTL0 & UART_CTL0_TXD_OUT_MASK; return (DL_UART_TXD_OUT)(txdOutVal); } /** * @brief Enable Manchester encoding * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_enableManchesterEncoding(UART_Regs *uart) { uart->CTL0 |= UART_CTL0_MENC_ENABLE; } /** * @brief Disable Manchester encoding * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_disableManchesterEncoding(UART_Regs *uart) { uart->CTL0 &= ~(UART_CTL0_MENC_MASK); } /** * @brief Check if Manchester encoding is enabled * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The status of Manchester encode * * @retval true Manchester encoding is enabled * @retval false Manchester encoding is disabled */ __STATIC_INLINE bool DL_UART_isManchesterEncodingEnabled(const UART_Regs *uart) { return ((uart->CTL0 & UART_CTL0_MENC_MASK) == UART_CTL0_MENC_ENABLE); } /** * @brief Set the communication mode/protocol to use * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] mode Value to set the UART communication protocol to. * One of @ref DL_UART_MODE * * @pre If the UART has already been enabled, then it must be made ready for * configuration by first calling @ref DL_UART_changeConfig * @post If @ref DL_UART_changeConfig was called, then the UART must be * re-enabled by calling @ref DL_UART_enable */ __STATIC_INLINE void DL_UART_setCommunicationMode( UART_Regs *uart, DL_UART_MODE mode) { DL_Common_updateReg(&uart->CTL0, (uint32_t) mode, UART_CTL0_MODE_MASK); } /** * @brief Get the communication mode/protocol being used * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The communication mode/protocol being used by the UART * * @retval One of @ref DL_UART_MODE */ __STATIC_INLINE DL_UART_MODE DL_UART_getCommunicationMode( const UART_Regs *uart) { uint32_t mode = uart->CTL0 & UART_CTL0_MODE_MASK; return (DL_UART_MODE)(mode); } /** * @brief Set the flow control configuration * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] config The flow control configuration to use. * One of @ref DL_UART_FLOW_CONTROL. * * @pre If the UART has already been enabled, then it must be made ready for * configuration by first calling @ref DL_UART_changeConfig * @post If @ref DL_UART_changeConfig was called, then the UART must be * re-enabled by calling @ref DL_UART_enable */ __STATIC_INLINE void DL_UART_setFlowControl( UART_Regs *uart, DL_UART_FLOW_CONTROL config) { DL_Common_updateReg(&uart->CTL0, (uint32_t) config, UART_CTL0_RTSEN_MASK | UART_CTL0_CTSEN_MASK); } /** * @brief Check the flow control configuration * * @param[in] uart Pointer to the register overlay for the * peripheral * * @return The flow control configuration * * @retval One of @ref DL_UART_FLOW_CONTROL values */ __STATIC_INLINE DL_UART_FLOW_CONTROL DL_UART_getFlowControl( const UART_Regs *uart) { uint32_t config = uart->CTL0 & (UART_CTL0_RTSEN_MASK | UART_CTL0_CTSEN_MASK); return (DL_UART_FLOW_CONTROL)(config); } /** * @brief Set the request to send output signal * * The RTS output signal indicates the state of the RX FIFO, and is * linked to the programmable receive FIFO threshold levels. When RTS flow * control is enabled, the RTS signal is asserted (low) when the data in the * RX FIFO is less than the threshold level. When the RX FIFO threshold level * is reached, the RTS signal is deasserted (high). The RTS signal is * reasserted (low) when data has been read out of the RX FIFO so it is less * than the threshold. * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] val The RTS output signal. One of @ref DL_UART_RTS * * @pre If the UART has already been enabled, then it must be made ready for * configuration by first calling @ref DL_UART_changeConfig * @post If @ref DL_UART_changeConfig was called, then the UART must be * re-enabled by calling @ref DL_UART_enable * * @sa DL_UART_setTXFIFOThreshold */ __STATIC_INLINE void DL_UART_setRTSOutput(UART_Regs *uart, DL_UART_RTS val) { DL_Common_updateReg(&uart->CTL0, (uint32_t) val, UART_CTL0_RTS_MASK); } /** * @brief Get the request to send output signal * * The RTS output signal indicates the state of the RX FIFO, and is * linked to the programmable receive FIFO threshold levels. When RTS flow * control is enabled, the RTS signal is asserted (low) when the data in the * RX FIFO is less than the threshold level. When the RX FIFO threshold level * is reached, the RTS signal is deasserted (high). The RTS signal is * reasserted (low) when data has been read out of the RX FIFO so it is less * than the threshold. * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The RTS signal status * * @retval One of @ref DL_UART_RTS * * @sa DL_UART_setTXFIFOThreshold */ __STATIC_INLINE DL_UART_RTS DL_UART_getRTSOutput(const UART_Regs *uart) { uint32_t val = uart->CTL0 & UART_CTL0_RTS_MASK; return (DL_UART_RTS)(val); } /** * @brief Enable FIFOs * * Enables the transmit and receive FIFO buffers. * * @param[in] uart Pointer to the register overlay for the peripheral * * @sa DL_UART_init * * @pre If the UART has already been enabled, then it must be made ready for * configuration by first calling @ref DL_UART_changeConfig * @post If @ref DL_UART_changeConfig was called, then the UART must be * re-enabled by calling @ref DL_UART_enable */ __STATIC_INLINE void DL_UART_enableFIFOs(UART_Regs *uart) { uart->CTL0 |= UART_CTL0_FEN_ENABLE; } /** * @brief Disable FIFOs * * Disables the transmit and receive FIFO buffers. The receiver will now * only hold 1-byte of data. * * @param[in] uart Pointer to the register overlay for the peripheral * * @pre If the UART has already been enabled, then it must be made ready for * configuration by first calling @ref DL_UART_changeConfig * @post If @ref DL_UART_changeConfig was called, then the UART must be * re-enabled by calling @ref DL_UART_enable */ __STATIC_INLINE void DL_UART_disableFIFOs(UART_Regs *uart) { uart->CTL0 &= ~(UART_CTL0_FEN_MASK); } /** * @brief Check if FIFOs are enabled * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The status of the FIFOs * * @retval true FIFOs are enabled * @retval false FIFOs are disabled */ __STATIC_INLINE bool DL_UART_isFIFOsEnabled(const UART_Regs *uart) { return ((uart->CTL0 & UART_CTL0_FEN_MASK) == UART_CTL0_FEN_ENABLE); } /** * @brief Enable send break (for LIN protocol) * * When enabled, a low level is continually output on the TXD signal after completing * transmission of the current character. For the proper execution of the * break command, software must set this bit for at least two frames (character periods). * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_enableLINSendBreak(UART_Regs *uart) { uart->LCRH |= UART_LCRH_BRK_ENABLE; } /** * @brief Disable send break * * When disabled, a low level is not continually output on the TXD signal * after completing transmission of the current character. * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_disableLINSendBreak(UART_Regs *uart) { uart->LCRH &= ~(UART_LCRH_BRK_MASK); } /** * @brief Check if send break is enabled * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The status of send break * * @retval true Send break is enabled * @retval false Send break is disabled */ __STATIC_INLINE bool DL_UART_isLINSendBreakEnabled(const UART_Regs *uart) { return ((uart->LCRH & UART_LCRH_BRK_MASK) == UART_LCRH_BRK_ENABLE); } /** * @brief Check if parity is enabled * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The status of parity * * @retval true Parity is enabled * @retval false Parity is disabled */ __STATIC_INLINE bool DL_UART_isParityEnabled(const UART_Regs *uart) { return ((uart->LCRH & UART_LCRH_PEN_MASK) == UART_LCRH_PEN_ENABLE); } /** * @brief Set the parity mode * * For 9-bit UART mode transmissions, the parity mode affects the address * byte and data byte indication (9th bit). If DL_UART_PARITY_EVEN or * DL_UART_PARITY_STICK_ZERO is enabled, then the transferred byte is an * address byte with Parity bit '1'. If DL_UART_PARITY_EVEN or * DL_UART_PARITY_STICK_ZERO is not enabled, then the transferred byte is an * address byte with Parity bit '0'. * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] parity Parity mode to set UART to. * One of @ref DL_UART_PARITY */ __STATIC_INLINE void DL_UART_setParityMode( UART_Regs *uart, DL_UART_PARITY parity) { DL_Common_updateReg(&uart->LCRH, (uint32_t) parity, (UART_LCRH_PEN_MASK | UART_LCRH_EPS_MASK | UART_LCRH_SPS_MASK)); } /** * @brief Get parity mode * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The current parity mode being used * * @retval One of @ref DL_UART_PARITY * */ __STATIC_INLINE DL_UART_PARITY DL_UART_getParityMode(const UART_Regs *uart) { uint32_t parity = uart->LCRH & (UART_LCRH_PEN_MASK | UART_LCRH_EPS_MASK | UART_LCRH_SPS_MASK); return (DL_UART_PARITY)(parity); } /** * @brief Set the number of stop bits * * When in 7816 smart code mode (DL_UART_MODE_SMART_CARD mode), the number of * stop bits is forced to 2 * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] numStopBits The number of stop bits transmitted. * One of @ref DL_UART_STOP_BITS */ __STATIC_INLINE void DL_UART_setStopBits( UART_Regs *uart, DL_UART_STOP_BITS numStopBits) { DL_Common_updateReg( &uart->LCRH, (uint32_t) numStopBits, UART_LCRH_STP2_MASK); } /** * @brief Get the number of stop bits * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The number of stop bits transmitted. * * @retval One of @ref DL_UART_STOP_BITS */ __STATIC_INLINE DL_UART_STOP_BITS DL_UART_getStopBits(const UART_Regs *uart) { uint32_t numStopBits = uart->LCRH & UART_LCRH_STP2_MASK; return (DL_UART_STOP_BITS)(numStopBits); } /** * @brief Set the word length * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] wordLength The number of data bits transmitted or received in * a frame. One of @ref DL_UART_WORD_LENGTH */ __STATIC_INLINE void DL_UART_setWordLength( UART_Regs *uart, DL_UART_WORD_LENGTH wordLength) { DL_Common_updateReg( &uart->LCRH, (uint32_t) wordLength, UART_LCRH_WLEN_MASK); } /** * @brief Get the word length * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The length of the data bits transmitted or received in a frame * * @retval One of @ref DL_UART_WORD_LENGTH */ __STATIC_INLINE DL_UART_WORD_LENGTH DL_UART_getWordLength( const UART_Regs *uart) { uint32_t wordLength = uart->LCRH & UART_LCRH_WLEN_MASK; return (DL_UART_WORD_LENGTH)(wordLength); } /** * @brief Send idle pattern * * When enabled, a SENDIDLE period of 11 bit times will be sent on the TX * line. The bit is cleared by hardware afterwards. * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_enableSendIdlePattern(UART_Regs *uart) { uart->LCRH |= UART_LCRH_SENDIDLE_ENABLE; } /** * @brief Disable send idle pattern * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_disableSendIdlePattern(UART_Regs *uart) { uart->LCRH &= ~(UART_LCRH_SENDIDLE_MASK); } /** * @brief Check if send idle pattern is enabled * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The status of the send idle pattern * * @retval true Send idle pattern is enabled * @retval false Send idle pattern is disabled */ __STATIC_INLINE bool DL_UART_isSendIdlePatternEnabled(const UART_Regs *uart) { return ( (uart->LCRH & UART_LCRH_SENDIDLE_MASK) == UART_LCRH_SENDIDLE_ENABLE); } /** * @brief Set external driver setup value * * Defines the number of UARTclk ticks the signal to control the external * driver for the RS485 will be set before the START bit is sent * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] val The number of UARTclk ticks the signal before the RS485 * is setup. Value between 0 - 31. */ __STATIC_INLINE void DL_UART_setExternalDriverSetup( UART_Regs *uart, uint32_t val) { DL_Common_updateReg(&uart->LCRH, val << UART_LCRH_EXTDIR_SETUP_OFS, UART_LCRH_EXTDIR_SETUP_MASK); } /** * @brief Get the external driver setup value * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The number of UARTclk ticks the signal to control the * external driver * * @retval 0 - 31 The number of UARTclk ticks */ __STATIC_INLINE uint32_t DL_UART_getExternalDriverSetup(const UART_Regs *uart) { return ((uart->LCRH & UART_LCRH_EXTDIR_SETUP_MASK >> UART_LCRH_EXTDIR_SETUP_OFS)); } /** * @brief Set external driver setup hold * * Defines the number of UARTclk ticks the signal to control the external * driver for the RS485 will be reset after the beginning of the stop bit. * If 2 STOP bits are enabled, the RS485 will be reset at the beginning of * the 2nd STOP bit. * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] val The number of UARTclk ticks the signal to hold the * external driver before the RS485 will be reset. * Value between 0 - 31. */ __STATIC_INLINE void DL_UART_setExternalDriverHold( UART_Regs *uart, uint32_t val) { DL_Common_updateReg(&uart->LCRH, val << UART_LCRH_EXTDIR_HOLD_OFS, UART_LCRH_EXTDIR_HOLD_MASK); } /** * @brief Get the external driver setup hold * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The number of UARTclk ticks the signal to hold the * external driver before the RS485 will be reset * * @retval 0 - 31 The number of UARTclk ticks */ __STATIC_INLINE uint32_t DL_UART_getExternalDriverHold(const UART_Regs *uart) { return (( uart->LCRH & UART_LCRH_EXTDIR_HOLD_MASK >> UART_LCRH_EXTDIR_HOLD_OFS)); } /** * @brief Checks if the UART is busy * * This bit is set as soon as the transmit FIFO or TXDATA register becomes * non-empty (regardless of whether UART is enabled) or if a receive data is * currently ongoing (after the start edge have been detected until a complete * byte, including all stop bits, has been received by the shift register). * * In IDLE Line mode the Busy signal also stays set during the idle time * generation. * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The status of the UART Busy bit * * @retval true The UART is busy * @retval false The UART is not busy * */ __STATIC_INLINE bool DL_UART_isBusy(const UART_Regs *uart) { return ((uart->STAT & UART_STAT_BUSY_MASK) == UART_STAT_BUSY_SET); } /** * @brief Checks if the RX FIFO is empty * * The meaning of this bit depends on if the FIFOs were enabled. * * @param[in] uart Pointer to the register overlay for the peripheral * * @return Returns the empty status of the RX FIFO * * @retval true If the FIFO is enabled, the receive FIFO is empty. * If the FIFO is disabled, the receiver has no data. * @retval false The receiver is not empty * * @sa DL_UART_enableFIFOs */ __STATIC_INLINE bool DL_UART_isRXFIFOEmpty(const UART_Regs *uart) { return ((uart->STAT & UART_STAT_RXFE_MASK) == UART_STAT_RXFE_SET); } /** * @brief Checks if the RX FIFO is full * * The meaning of this bit depends on if the FIFOs were enabled. * * @param[in] uart Pointer to the register overlay for the peripheral * * @return Returns the full status of the RX FIFO * * @retval true If the FIFO is enabled, the receive FIFO is full. * If the FIFO is disabled, the receiver has 1-byte * of data. * @retval false The receiver is not full * * @sa DL_UART_enableFIFOs */ __STATIC_INLINE bool DL_UART_isRXFIFOFull(const UART_Regs *uart) { return ((uart->STAT & UART_STAT_RXFF_MASK) == UART_STAT_RXFF_SET); } /** * @brief Checks if the TX FIFO is empty * * The meaning of this bit depends on if the FIFOs were enabled. * * @param[in] uart Pointer to the register overlay for the peripheral * * @return Returns the empty status of the TX FIFO * * @retval true If the FIFO is enabled, the transmit FIFO is empty. * If the FIFO is disabled, the transmitter has no data. * @retval false The transmitter is not empty * * @sa DL_UART_enableFIFOs */ __STATIC_INLINE bool DL_UART_isTXFIFOEmpty(const UART_Regs *uart) { return ((uart->STAT & UART_STAT_TXFE_MASK) == UART_STAT_TXFE_SET); } /** * @brief Checks if the TX FIFO is full * * The meaning of this bit depends on if the FIFOs were enabled. * * @param[in] uart Pointer to the register overlay for the peripheral * * @return Returns the full status of the TX FIFO * * @retval true If the FIFO is enabled, the transmit FIFO is full. * If the FIFO is disabled, the transmitter has 1-byte * of data. * @retval false The transmitter is not full * * @sa DL_UART_enableFIFOs */ __STATIC_INLINE bool DL_UART_isTXFIFOFull(const UART_Regs *uart) { return ((uart->STAT & UART_STAT_TXFF_MASK) == UART_STAT_TXFF_SET); } /** * @brief Checks if UART is clear to send * * @param[in] uart Pointer to the register overlay for the peripheral * * @return Returns the status of the CTS signal * * @retval true The CTS signal is asserted (low) * @retval false The CTS signal is not asserted (high) * * @sa DL_UART_isClearToSendEnabled */ __STATIC_INLINE bool DL_UART_isClearToSend(const UART_Regs *uart) { return ((uart->STAT & UART_STAT_CTS_MASK) == UART_STAT_CTS_SET); } /** * @brief Checks if Idle mode has been detected * * Idle mode has been detected in Idleline-Multiprocessor-Mode. The IDLE bit * is used as an address tag for each block of characters. In idle-line * multiprocessor format, this bit is set when a received character is an * address. * * @param[in] uart Pointer to the register overlay for the peripheral * * @return Returns the status if Idle mode has been detected * * @retval true Idle has been detected before last received character * @retval false Idle has not been detected before last received character * */ __STATIC_INLINE bool DL_UART_isIdleModeDetected(const UART_Regs *uart) { return ((uart->STAT & UART_STAT_IDLE_MASK) == UART_STAT_IDLE_SET); } /** * @brief Set the TX FIFO interrupt threshold level * * Select the threshold for the transmit FIFO interrupt. The interrupts are * generated based on a transition through a level rather than being based on * the level. That is, the interrupts are generated when the fill level * progresses through the trigger level. For example, if the transmit trigger * level is set to the half-way mark, the interrupt is triggered when the * transmit FIFO becomes half empty. In other words, if the transmit FIFO was * filled with four characters, the interrupt would trigger once there are * two or less characters after transmitting. * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] threshold One of @ref DL_UART_TX_FIFO_LEVEL * */ __STATIC_INLINE void DL_UART_setTXFIFOThreshold( UART_Regs *uart, DL_UART_TX_FIFO_LEVEL threshold) { DL_Common_updateReg( &uart->IFLS, (uint32_t) threshold, UART_IFLS_TXIFLSEL_MASK); } /** * @brief Get the TX FIFO interrupt threshold level * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The TX FIFO interrupt threshold level * * @retval One of @ref DL_UART_TX_FIFO_LEVEL */ __STATIC_INLINE DL_UART_TX_FIFO_LEVEL DL_UART_getTXFIFOThreshold( const UART_Regs *uart) { uint32_t threshold = uart->IFLS & UART_IFLS_TXIFLSEL_MASK; return (DL_UART_TX_FIFO_LEVEL)(threshold); } /** * @brief Set the RX FIFO interrupt threshold level. The interrupts are * generated based on a transition through a level rather than being based on * the level. That is, the interrupts are generated when the fill level * progresses through the trigger level. For example, if the receive trigger * level is set to the half-way mark, the interrupt is triggered when the * receive FIFO becomes half full. In other words, the interrupt is triggered * after the receive FIFO is filled with two or more characters. * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] threshold One of @ref DL_UART_RX_FIFO_LEVEL */ __STATIC_INLINE void DL_UART_setRXFIFOThreshold( UART_Regs *uart, DL_UART_RX_FIFO_LEVEL threshold) { DL_Common_updateReg( &uart->IFLS, (uint32_t) threshold, UART_IFLS_RXIFLSEL_MASK); } /** * @brief Get the RX FIFO interrupt threshold level * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The RX FIFO interrupt threshold level * * @retval One of @ref DL_UART_RX_FIFO_LEVEL */ __STATIC_INLINE DL_UART_RX_FIFO_LEVEL DL_UART_getRXFIFOThreshold( const UART_Regs *uart) { uint32_t threshold = uart->IFLS & UART_IFLS_RXIFLSEL_MASK; return (DL_UART_RX_FIFO_LEVEL)(threshold); } /** * @brief Set the RX interrupt timeout * * When an additional character has not been received within the set * timeout, a RX interrupt will still trigger even if the FIFO level has not * been reached. A value of 0 disables this function. * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] timeout Timeout to set the RX interrupt to. * Value between 0 - 15 */ __STATIC_INLINE void DL_UART_setRXInterruptTimeout( UART_Regs *uart, uint32_t timeout) { DL_Common_updateReg( &uart->IFLS, timeout << UART_IFLS_RXTOSEL_OFS, UART_IFLS_RXTOSEL_MASK); } /** * @brief Get the RX interrupt timeout * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The RX interrupt timeout value * * @retval 0 - 15 The RX interrupt timeout value * */ __STATIC_INLINE uint32_t DL_UART_getRXInterruptTimeout(const UART_Regs *uart) { return ((uart->IFLS & UART_IFLS_RXTOSEL_MASK) >> UART_IFLS_RXTOSEL_OFS); } /** * @brief Get Integer Baud-Rate Divisor * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The integer component of the baud rate divisor * * @retval 0 - 65535 The integer baud date divisor */ __STATIC_INLINE uint32_t DL_UART_getIntegerBaudRateDivisor( const UART_Regs *uart) { return (uart->IBRD & UART_IBRD_DIVINT_MASK); } /** * @brief Get Fractional Baud-Rate Divisor * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The fractional component of the baud rate divisor * * @retval 0 - 63 The fractional baud date divisor */ __STATIC_INLINE uint32_t DL_UART_getFractionalBaudRateDivisor( const UART_Regs *uart) { return (uart->FBRD & UART_FBRD_DIVFRAC_MASK); } /** * @brief Set the baud rate divisor * * Set the integer baud rate divisor and fractional baud rate divisor * components of the baud rate divisor * * @param[in] uart Pointer to the register overlay for the * peripheral * @param[in] integerDivisor The integer component of the baud rate * divisor * @param[in] fractionalDivisor The fractional component of the baud rate * divisor */ __STATIC_INLINE void DL_UART_setBaudRateDivisor( UART_Regs *uart, uint32_t integerDivisor, uint32_t fractionalDivisor) { DL_Common_updateReg(&uart->IBRD, integerDivisor, UART_IBRD_DIVINT_MASK); DL_Common_updateReg( &uart->FBRD, fractionalDivisor, UART_FBRD_DIVFRAC_MASK); // When updating the baud-rate divisor (UARTIBRD or UARTIFRD), // the LCRH register must also be written to (any bit in LCRH can // be written to for updating the baud-rate divisor). DL_Common_updateReg( &uart->LCRH, (uart->LCRH & UART_LCRH_BRK_MASK), UART_LCRH_BRK_MASK); } /** * @brief Set the baud rate divisor for IrDA mode * * Set the integer baud rate divisor and fractional baud rate divisor * components of the baud rate divisor * Divide integerDivisor by clkDivisor2 + 1 as a way of reducing the UART * clock frequency, which in turn reduces the baud rate divisor further * in accordance to IrDA standards * * @param[in] uart Pointer to the register overlay for the * peripheral * @param[in] integerDivisor The integer component of the baud rate * divisor * @param[in] fractionalDivisor The fractional component of the baud rate * divisor * @param[in] clkDivisor2 The additional factor to divide the clock, * One of @ref DL_UART_CLOCK_DIVIDE2_RATIO * */ __STATIC_INLINE void DL_UART_setIrDABaudRateDivisor(UART_Regs *uart, uint32_t integerDivisor, uint32_t fractionalDivisor, DL_UART_CLOCK_DIVIDE2_RATIO clkDivisor2) { DL_Common_updateReg(&uart->IBRD, (integerDivisor / ((uint32_t) clkDivisor2 + 1)), UART_IBRD_DIVINT_MASK); DL_Common_updateReg( &uart->FBRD, fractionalDivisor, UART_FBRD_DIVFRAC_MASK); // When updating the baud-rate divisor (UARTIBRD or UARTIFRD), // the LCRH register must also be written to (any bit in LCRH can // be written to for updating the baud-rate divisor). DL_Common_updateReg( &uart->LCRH, (uart->LCRH & UART_LCRH_BRK_MASK), UART_LCRH_BRK_MASK); } /** * @brief Set the pulse width select for the digital glitch suppresion * * Controls the pulse width select for glitch suppression on the RX line. * The glitch suppression values are in terms of functional clocks. * * In IrDA mode, this sets the receive filter length. The minimum pulse * length for receive is given by: t(MIN) = (DGFSEL) / f(IRTXCLK) * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] pulseWidth Pulse width select for the glitch suppresion. * Value between 0 - 63. */ __STATIC_INLINE void DL_UART_setDigitalPulseWidth( UART_Regs *uart, uint32_t pulseWidth) { DL_Common_updateReg(&uart->GFCTL, pulseWidth, UART_GFCTL_DGFSEL_MASK); } /** * @brief Get the pulse width select for the digital glitch suppresion * * Gets the pulse width select for glitch suppression on the RX line. * The glitch suppression values are in terms of functional clocks. * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The digital glitch suppression pulse width * * @retval 0 indicating digital glitch suppression is disabled * @retval 1 - 63 the digital glitch suppression pulse width */ __STATIC_INLINE uint32_t DL_UART_getDigitalPulseWidth(const UART_Regs *uart) { return (uart->GFCTL & UART_GFCTL_DGFSEL_MASK); } /** * @brief Writes data into the TX FIFO to transmit * * Puts the data into the TX FIFO without checking it's status. Use if already * sure the TX FIFO has space for the write. See related APIs for additional * transmit options. * * For transmitted data, if the FIFO is enabled, data written to this * location is pushed onto the transmit FIFO. If the FIFO is disabled, * data is stored in the 1-byte deep transmitter. * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] data The data to transmit * * * @sa DL_UART_transmitDataBlocking * @sa DL_UART_transmitDataCheck */ __STATIC_INLINE void DL_UART_transmitData(UART_Regs *uart, uint8_t data) { uart->TXDATA = data; } /** * @brief Reads data from the RX FIFO * * Reads the data from the RX FIFO without checking its status. Use if * already sure the RX FIFO has data available. See related APIs for * additional receive options. * * @note: As a result of reading the RX FIFO data, the corresponding * error status in the RXDATA register (OVRERR, BRKERR, PARERR, * FRMERR bits) will be dropped. * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The data in the RX FIFO * * @sa DL_UART_receiveDataBlocking * @sa DL_UART_receiveDataCheck */ __STATIC_INLINE uint8_t DL_UART_receiveData(const UART_Regs *uart) { return ((uint8_t)(uart->RXDATA & UART_RXDATA_DATA_MASK)); } /** * @brief Gets the status of the error flags of the received data * * @note: As a result of reading the error status, the corresponding * RX FIFO data in the RXDATA.DATA bit field will be dropped. * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] errorMask Bit mask of error flags to check. Bitwise OR of * @ref DL_UART_ERROR. * * @return The status of the requested UART error flags * * @retval Bitwise OR of @ref DL_UART_ERROR values */ __STATIC_INLINE uint32_t DL_UART_getErrorStatus( const UART_Regs *uart, uint32_t errorMask) { return (uart->RXDATA & errorMask); } /** * @brief Set the LIN counter value * * The LIN counter is a 16 bit up counter clocked by the functional clock of * the UART * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] value Pulse width select for the glitch suppresion. */ __STATIC_INLINE void DL_UART_setLINCounterValue( UART_Regs *uart, uint16_t value) { DL_Common_updateReg(&uart->LINCNT, value, UART_LINCNT_VALUE_MASK); } /** * @brief Get the LIN counter value * * The LIN counter is a 16 bit up counter clocked by the module clock of * the UART * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The clock counter value * * @retval 0 - 65535 The clock counter value * */ __STATIC_INLINE uint16_t DL_UART_getLINCounterValue(const UART_Regs *uart) { return ((uint16_t)(uart->LINCNT & UART_LINCNT_VALUE_MASK)); } /** * @brief Enable the LIN counter * * The LIN counter will only count when enabled. * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_enableLINCounter(UART_Regs *uart) { uart->LINCTL |= UART_LINCTL_CTRENA_ENABLE; } /** * @brief Check if the LIN counter is enabled * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The status of the LIN counter * * @retval true LIN counter is enabled * @retval false LIN counter is disabled */ __STATIC_INLINE bool DL_UART_isLINCounterEnabled(const UART_Regs *uart) { return ( (uart->LINCTL & UART_LINCTL_CTRENA_MASK) == UART_LINCTL_CTRENA_ENABLE); } /** * @brief Disable the LIN counter * * LIN counter will only count when enabled. * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_disableLINCounter(UART_Regs *uart) { uart->LINCTL &= ~(UART_LINCTL_CTRENA_MASK); } /** * @brief Enable LIN counter clear and start counting on falling edge of RXD * * When enabled, the counter is set to 0 and starts counting on the LIN counter * on a falling edge of RXD. * * The LIN counter will only count when it is enabled. * * @param[in] uart Pointer to the register overlay for the peripheral * * @sa DL_UART_enableLINCounter */ __STATIC_INLINE void DL_UART_enableLINCounterClearOnFallingEdge( UART_Regs *uart) { uart->LINCTL |= UART_LINCTL_ZERONE_ENABLE; } /** * @brief Check if LIN counting on falling edge of RXD is enabled * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The status of counting on falling edge of RXD * * @retval true Counting on falling edge is enabled * @retval false Counting on falling edge is disabled */ __STATIC_INLINE bool DL_UART_isLINCounterClearOnFallingEdge( const UART_Regs *uart) { return ( (uart->LINCTL & UART_LINCTL_ZERONE_MASK) == UART_LINCTL_ZERONE_ENABLE); } /** * @brief Disable LIN counting on falling edge of RXD * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_disableLINCounterClearOnFallingEdge( UART_Regs *uart) { uart->LINCTL &= ~(UART_LINCTL_ZERONE_MASK); } /** * @brief Enable LIN counter incrementing while RXD signal is low * * When LIN counter is enabled and the signal on RXD is low, the counter * increments * * @param[in] uart Pointer to the register overlay for the peripheral * * @sa DL_UART_enableLINCounter */ __STATIC_INLINE void DL_UART_enableLINCountWhileLow(UART_Regs *uart) { uart->LINCTL |= UART_LINCTL_CNTRXLOW_ENABLE; } /** * @brief Check if LIN counter increments while RXD signal is low is enabled * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The status of counter increments while RXD signal is low * * @retval true Counter increments while RXD signal is low is enabled * @retval false Counter increments while RXD signal is low is disabled */ __STATIC_INLINE bool DL_UART_isLINCountWhileLowEnabled(const UART_Regs *uart) { return ((uart->LINCTL & UART_LINCTL_CNTRXLOW_MASK) == UART_LINCTL_CNTRXLOW_ENABLE); } /** * @brief Disable LIN counter increments while RXD signal is low * * LIN counter will not increment while the RXD signal is low * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_disableLINCountWhileLow(UART_Regs *uart) { uart->LINCTL &= ~(UART_LINCTL_CNTRXLOW_MASK); } /** * @brief Enable capture of the LIN counter on a falling edge * * When enabled, the LIN counter value is captured to the LINC0 register on * each falling RXD edge. A LINC0 interrupt is triggered when enabled. * Disables counter compare match mode if enabled. * * * @param[in] uart Pointer to the register overlay for the peripheral * * @sa DL_UART_configLINMode */ __STATIC_INLINE void DL_UART_enableLINFallingEdgeCapture(UART_Regs *uart) { DL_Common_updateReg(&uart->LINCTL, UART_LINCTL_LINC0CAP_ENABLE | UART_LINCTL_LINC0_MATCH_DISABLE, UART_LINCTL_LINC0CAP_MASK | UART_LINCTL_LINC0_MATCH_MASK); } /** * @brief Check status of capture of LIN counter on a falling edge * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The status of capture the LIN counter on a falling edge * * @retval true Capture to LINC0 on falling RXD edge is enabled * @retval false Capture to LINC0 on falling RXD edge is disabled */ __STATIC_INLINE bool DL_UART_isLINFallingEdgeCaptureEnabled( const UART_Regs *uart) { return ((uart->LINCTL & UART_LINCTL_LINC0CAP_MASK) == UART_LINCTL_LINC0CAP_ENABLE); } /** * @brief Disable capture of LIN counter on a falling edge * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_disableLINFallingEdgeCapture(UART_Regs *uart) { uart->LINCTL &= ~(UART_LINCTL_LINC0CAP_MASK); } /** * @brief Enable capture of the LIN counter on a rising edge * * When enabled the LIN counter value is captured to LINC1 register on each * rising RXD edge. A LINC1 interrupt is triggered when enabled. * * @param[in] uart Pointer to the register overlay for the peripheral * */ __STATIC_INLINE void DL_UART_enableLINRisingEdgeCapture(UART_Regs *uart) { uart->LINCTL |= UART_LINCTL_LINC1CAP_ENABLE; } /** * @brief Check status of capture of LIN counter on a rising edge * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The status of capture of LIN counter on a rising edge * * @retval true Capture to LINC1 on rising RXD edge is enabled * @retval false Capture to LINC1 on rising RXD edge is disabled */ __STATIC_INLINE bool DL_UART_isLINRisingEdgeCaptureEnabled( const UART_Regs *uart) { return ((uart->LINCTL & UART_LINCTL_LINC1CAP_MASK) == UART_LINCTL_LINC1CAP_ENABLE); } /** * @brief Disable capture of LIN counter on a rising edge * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_disableLINRisingEdgeCapture(UART_Regs *uart) { uart->LINCTL &= ~(UART_LINCTL_LINC1CAP_MASK); } /** * @brief Enable LIN counter compare match mode * * When enabled, a match between a value in LINC0 and the LIN counter can * trigger a LINC0 interrupt. Disables capture on falling edge if enabled. * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_enableLINCounterCompareMatch(UART_Regs *uart) { DL_Common_updateReg(&uart->LINCTL, UART_LINCTL_LINC0_MATCH_ENABLE | UART_LINCTL_LINC0CAP_DISABLE, UART_LINCTL_LINC0CAP_MASK | UART_LINCTL_LINC0_MATCH_MASK); } /** * @brief Setup LIN counter control for sync field validation * * Enable LIN counter capture on rising RX edge. Enable LIN counter capture on falling RX edge. * Enable LIN counter clearing on RX falling edge. Enable LIN counter. * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_enableLINSyncFieldValidationCounterControl( UART_Regs *uart) { DL_Common_updateReg(&uart->LINCTL, UART_LINCTL_LINC0CAP_ENABLE | UART_LINCTL_LINC1CAP_ENABLE | UART_LINCTL_ZERONE_ENABLE | UART_LINCTL_CTRENA_ENABLE, UART_LINCTL_LINC0CAP_MASK | UART_LINCTL_LINC1CAP_MASK | UART_LINCTL_ZERONE_MASK | UART_LINCTL_CTRENA_MASK); } /** * @brief Setup LIN counter control for LIN reception * * Enable count while low signal on RXD. Enable LIN counter clearing on RXD falling edge. * Enable LIN counter. * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_enableLINReceptionCountControl(UART_Regs *uart) { DL_Common_updateReg(&uart->LINCTL, UART_LINCTL_CNTRXLOW_ENABLE | UART_LINCTL_ZERONE_ENABLE | UART_LINCTL_CTRENA_ENABLE, UART_LINCTL_CNTRXLOW_MASK | UART_LINCTL_ZERONE_MASK | UART_LINCTL_CTRENA_MASK); } /** * @brief Check if LIN counter compare match mode is enabled * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The status of counter compare match mode * * @retval true LIN counter compare match mode is enabled * @retval false LIN counter compare match mode is disabled */ __STATIC_INLINE bool DL_UART_isLINCounterCompareMatchEnabled( const UART_Regs *uart) { return ((uart->LINCTL & UART_LINCTL_LINC0_MATCH_MASK) == UART_LINCTL_LINC0_MATCH_ENABLE); } /** * @brief Disable LIN counter compare match mode * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_disableLINCounterCompareMatch(UART_Regs *uart) { uart->LINCTL &= ~(UART_LINCTL_LINC0_MATCH_MASK); } /** * @brief Set the value to be compared to the LIN counter * * Sets the value of LINC0 to be used to compare to the LIN counter. For use * when LIN counter compare match mode is enabled. * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] value Value to be compared to the LIN counter for matching. * Value between 0 - 65535. * * @sa DL_UART_enableLINCounterCompareMatch */ __STATIC_INLINE void DL_UART_setLINCounterCompareValue( UART_Regs *uart, uint16_t value) { DL_Common_updateReg(&uart->LINC0, value, UART_LINC0_DATA_MASK); } /** * @brief Get the LINC0 counter value * * Captures current LINCTR value on RXD falling edge. * * If capture is enabled with @ref DL_UART_enableLINFallingEdgeCapture, a * capture can generate a LINC0 interrupt. * If compare mode is enabled with @ref DL_UART_enableLINCounterCompareMatch, * a counter match can generate a LINC0 interrupt. * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The LINC0 counter value * * @retval 0 - 65535 The LINC0 counter value * * @sa DL_UART_enableLINFallingEdgeCapture * @sa DL_UART_enableLINCounterCompareMatch */ __STATIC_INLINE uint16_t DL_UART_getLINFallingEdgeCaptureValue( const UART_Regs *uart) { return ((uint16_t)(uart->LINC0 & UART_LINC0_DATA_MASK)); } /** * @brief Get the LINC1 counter value * * Captures current LINCTR value on RXD rising edge. For use when LIN rising * edge capture is enabled. It can generate a LINC1 interrupt on capture. * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The LINC1 counter value * * @retval 0 - 65535 The LINC1 counter value * * @sa DL_UART_enableLINRisingEdgeCapture */ __STATIC_INLINE uint16_t DL_UART_getLINRisingEdgeCaptureValue( const UART_Regs *uart) { return ((uint16_t)(uart->LINC1 & UART_LINC1_DATA_MASK)); } /** * @brief Enable the IrDA encoder/decoder * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_enableIrDAMode(UART_Regs *uart) { uart->IRCTL |= UART_IRCTL_IREN_ENABLE; } /** * @brief Check if the IrDA encoder/decoder is enabled * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The status of IrDA mode * * @retval true IrDA mode is enabled * @retval false IrDA mode is disabled */ __STATIC_INLINE bool DL_UART_isIrDAModeEnabled(const UART_Regs *uart) { return ((uart->IRCTL & UART_IRCTL_IREN_MASK) == UART_IRCTL_IREN_ENABLE); } /** * @brief Disable the IrDA encoder/decoder * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_disableIrDAMode(UART_Regs *uart) { uart->IRCTL &= ~(UART_IRCTL_IREN_MASK); } /** * @brief Set the IrDA transmit pulse clock select * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] uartClock The clock select for the IrDA pulse data to be based on. * One of @ref DL_UART_IRDA_CLOCK */ __STATIC_INLINE void DL_UART_setIrDATXPulseClockSelect( UART_Regs *uart, DL_UART_IRDA_CLOCK uartClock) { DL_Common_updateReg( &uart->IRCTL, (uint32_t) uartClock, UART_IRCTL_IRTXCLK_MASK); } /** * @brief Get the IrDA transmit pulse clock select * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The clock select that the IrDA pulse data is based on * * @retval One of @ref DL_UART_IRDA_CLOCK * */ __STATIC_INLINE DL_UART_IRDA_CLOCK DL_UART_getIrDATXPulseClockSelect( const UART_Regs *uart) { uint32_t uartClock = uart->IRCTL & UART_IRCTL_IRTXCLK_MASK; return (DL_UART_IRDA_CLOCK)(uartClock); } /** * @brief Set the IrDA configurations * * Calculates the baud rate divisor given the clock output of the UART clock * source and the target baud rate. This API also enables IrDA mode. * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] polarity The receive input polarity. * One of @ref DL_UART_IRDA_POLARITY. * @param[in] pulseLength The length of the IrDA transmit pulse. * @param[in] irdaClk The clock used for the transmit pulse. * One of @ref DL_UART_IRDA_CLOCK. */ void DL_UART_configIrDAMode(UART_Regs *uart, DL_UART_IRDA_POLARITY polarity, uint32_t pulseLength, DL_UART_IRDA_CLOCK irdaClk); /** * @brief Set the IrDA transmit pulse length * * The pulse length can be calculated with the following equation: * IRTXPLx = pulseLength * 2 * irdaClk - 1 * (IRTXCLK = functional clock of the UART) * * To set the pulse time of 3/16 bit period required by the IrDA period, * 16-bit oversampling is selected with HSE = 0, the baud rate clock is * selected with IRTXCLK = 1, and the pulse length is set to six one-half * clock cycles with IRTXPLx = 6 - 1 - 5. * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] pulseLength The length of the IrDA transmit pulse. * @param[in] irdaClk The clock used for the transmit pulse. * One of @ref DL_UART_IRDA_CLOCK. */ void DL_UART_setIrDAPulseLength( UART_Regs *uart, uint32_t pulseLength, DL_UART_IRDA_CLOCK irdaClk); /** * @brief Get the IrDA transmit pulse length * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The IrDA transmit pulse length is set to * * @retval 0 - 63 The IrDA transmit pulse length */ __STATIC_INLINE uint32_t DL_UART_getIrDATXPulseLength(const UART_Regs *uart) { return (uart->IRCTL & UART_IRCTL_IRTXPL_MASK); } /** * @brief Set the IrDA receive input UCAxRXD polarity * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] polarity The value to set the IrDA RX pulse polarity to. * One of @ref DL_UART_IRDA_POLARITY */ __STATIC_INLINE void DL_UART_setIrDARXPulsePolarity( UART_Regs *uart, DL_UART_IRDA_POLARITY polarity) { DL_Common_updateReg( &uart->IRCTL, (uint32_t) polarity, UART_IRCTL_IRRXPL_MASK); } /** * @brief Get the IrDA receive input UCAxRXD polarity * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The IrDA RX pulse polarity * * @retval One of @ref DL_UART_IRDA_POLARITY */ __STATIC_INLINE DL_UART_IRDA_POLARITY DL_UART_getIrDARXPulsePolarity( const UART_Regs *uart) { uint32_t polarity = uart->IRCTL & UART_IRCTL_IRRXPL_MASK; return (DL_UART_IRDA_POLARITY)(polarity); } /** * @brief Set the address mask for DALI, 9-bit, or Idle-Line mode * * The address bits are masked to create a set of addresses to be matched * with the received address byte. * * A 0 bit in the MSK bitfield configures that the corresponding bit in the * ADDR bitfield of the ADDR register is don't care. * A 1 bit in the MSK bitfield configures, that the corresponding bit in the * ADDR bitfield of the ADDR register must match. * * Used in DALI, UART 9-Bit or Idle-Line mode. * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] addressMask The address mask to set */ __STATIC_INLINE void DL_UART_setAddressMask( UART_Regs *uart, uint32_t addressMask) { DL_Common_updateReg(&uart->AMASK, addressMask, UART_AMASK_VALUE_MASK); } /** * @brief Get the address mask being used * * The address bits are masked to create a set of addresses to be matched * with the received address byte. * * A 0 bit in the MSK bitfield configures that the corresponding bit in the * ADDR bitfield of the ADDR register is don't care. * A 1 bit in the MSK bitfield configures, that the corresponding bit in the * ADDR bitfield of the ADDR register must match. * * Used in DALI, UART 9-Bit or Idle-Line mode. * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The address mask being used * * @retval 0-255 The address mask * */ __STATIC_INLINE uint32_t DL_UART_getAddressMask(const UART_Regs *uart) { return (uart->AMASK & UART_AMASK_VALUE_MASK); } /** * @brief Set the address * * Used to write the specific address that should be matched with the * receiving byte when the Address Mask (AMASK) is set to FFh. This register * is used in conjunction with AMASK to form a match for address-byte * received. * * Used in DALI, UART 9-Bit or Idle-Line mode. * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] address The address to set */ __STATIC_INLINE void DL_UART_setAddress(UART_Regs *uart, uint32_t address) { DL_Common_updateReg(&uart->ADDR, address, UART_ADDR_VALUE_MASK); } /** * @brief Get the address being used * * Used to write the specific address that should be matched with the * receiving byte when the Address Mask (AMASK) is set to FFh. This register * is used in conjunction with AMASK to form a match for address-byte * received. * * Used in DALI, UART 9-Bit or Idle-Line mode. * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The address being used * * @retval 0-255 The address being used * */ __STATIC_INLINE uint32_t DL_UART_getAddress(const UART_Regs *uart) { return (uart->ADDR & UART_ADDR_VALUE_MASK); } /** * @brief Enable UART interrupts * * @param[in] uart Pointer to the register overlay for the * peripheral * @param[in] interruptMask Bit mask of interrupts to enable. Bitwise OR of * @ref DL_UART_INTERRUPT. */ __STATIC_INLINE void DL_UART_enableInterrupt( UART_Regs *uart, uint32_t interruptMask) { uart->CPU_INT.IMASK |= interruptMask; } /** * @brief Disable UART interrupts * * @param[in] uart Pointer to the register overlay for the * peripheral * @param[in] interruptMask Bit mask of interrupts to disable. Bitwise OR of * @ref DL_UART_INTERRUPT. */ __STATIC_INLINE void DL_UART_disableInterrupt( UART_Regs *uart, uint32_t interruptMask) { uart->CPU_INT.IMASK &= ~(interruptMask); } /** * @brief Check which UART interrupts are enabled * * @param[in] uart Pointer to the register overlay for the * peripheral * @param[in] interruptMask Bit mask of interrupts to check. Bitwise OR of * @ref DL_UART_INTERRUPT. * * @return Which of the requested UART interrupts are enabled * * @retval Bitwise OR of @ref DL_UART_INTERRUPT values */ __STATIC_INLINE uint32_t DL_UART_getEnabledInterrupts( const UART_Regs *uart, uint32_t interruptMask) { return (uart->CPU_INT.IMASK & interruptMask); } /** * @brief Check interrupt flag of enabled UART interrupts * * Checks if any of the UART interrupts that were previously enabled are * pending. * * @param[in] uart Pointer to the register overlay for the * peripheral * @param[in] interruptMask Bit mask of interrupts to check. Bitwise OR of * @ref DL_UART_INTERRUPT. * * @return Which of the requested UART interrupts are pending * * @retval Bitwise OR of @ref DL_UART_INTERRUPT values * * @sa DL_UART_enableInterrupt */ __STATIC_INLINE uint32_t DL_UART_getEnabledInterruptStatus( const UART_Regs *uart, uint32_t interruptMask) { return (uart->CPU_INT.MIS & interruptMask); } /** * @brief Check interrupt flag of any UART interrupt * * Checks if any of the UART interrupts are pending. Interrupts do not have to * be previously enabled. * * @param[in] uart Pointer to the register overlay for the * peripheral * @param[in] interruptMask Bit mask of interrupts to check. Bitwise OR of * @ref DL_UART_INTERRUPT. * * @return Which of the requested UART interrupts are pending * * @retval Bitwise OR of @ref DL_UART_INTERRUPT values */ __STATIC_INLINE uint32_t DL_UART_getRawInterruptStatus( const UART_Regs *uart, uint32_t interruptMask) { return (uart->CPU_INT.RIS & interruptMask); } /** * @brief Get highest priority pending UART interrupt * * Checks if any of the UART interrupts are pending. Interrupts do not have to * be previously enabled. * * @param[in] uart Pointer to the register overlay for the * peripheral * * @return The highest priority pending UART interrupt * * @retval TBD */ __STATIC_INLINE DL_UART_IIDX DL_UART_getPendingInterrupt(const UART_Regs *uart) { return (DL_UART_IIDX)(uart->CPU_INT.IIDX); } /** * @brief Clear pending UART interrupts * * @param[in] uart Pointer to the register overlay for the * peripheral * @param[in] interruptMask Bit mask of interrupts to clear. Bitwise OR of * @ref DL_UART_INTERRUPT. */ __STATIC_INLINE void DL_UART_clearInterruptStatus( UART_Regs *uart, uint32_t interruptMask) { uart->CPU_INT.ICLR = interruptMask; } /** * @brief Prepares the UART to change the configuration * * If the UART has already been enabled, then it is recommended to call this * function before calling other APIs that make changes to the CTL0 register. * If changes are made to the CTL0 register without disabling the UART, then * results are unpredictable. This API performs the following: * 1. Disable the UART. * 2. Wait for the end of transmission or reception of the current character. * 3. Flush the transmit FIFO by clearing bit FEN in the UART control * register CTL0. * * @post After calling this API, the user must be re-enabled by calling * @ref DL_UART_enable. * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_changeConfig(UART_Regs *uart) { DL_UART_disable(uart); while (DL_UART_isBusy(uart)) { ; } DL_UART_disableFIFOs(uart); } /** * @brief Enable the analog glitch filter on the RX input * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_enableAnalogGlitchFilter(UART_Regs *uart) { uart->GFCTL |= UART_GFCTL_AGFEN_ENABLE; } /** * @brief Disable the analog glitch filter on the RX input * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_disableAnalogGlitchFilter(UART_Regs *uart) { uart->GFCTL &= ~(UART_GFCTL_AGFEN_MASK); } /** * @brief Returns if analog glitch filter is enabled * * @param[in] uart Pointer to the register overlay for the peripheral * * @return true if analog glitch filter is enabled * @return false if analog glitch filter is disabled */ __STATIC_INLINE bool DL_UART_isAnalogGlitchFilterEnabled(const UART_Regs *uart) { return ((uart->GFCTL & UART_GFCTL_AGFEN_MASK) == UART_GFCTL_AGFEN_ENABLE); } /** * @brief Enable analog and digital noise glitch filter chaining * * When enabled, analog and digital glitch filters are chained and the output * of the combination is made available to the IP logic for sampling. * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_enableGlitchFilterChaining(UART_Regs *uart) { uart->GFCTL |= UART_GFCTL_CHAIN_ENABLED; } /** * @brief Disable analog and digital noise glitch filter chaining * * When disabled, only digital filter output is available to the IP logic * for sampling. * * @param[in] uart Pointer to the register overlay for the peripheral */ __STATIC_INLINE void DL_UART_disableGlitchFilterChaining(UART_Regs *uart) { uart->GFCTL &= ~(UART_GFCTL_CHAIN_MASK); } /** * @brief Returns if glitch filter chaining enabled * * @param[in] uart Pointer to the register overlay for the peripheral * * @return true if glitch filter chaining is enabled * @return false if glitch filter chaining is disabled */ __STATIC_INLINE bool DL_UART_isGlitchFilterChainingEnabled( const UART_Regs *uart) { return ((uart->GFCTL & UART_GFCTL_CHAIN_MASK) == UART_GFCTL_CHAIN_ENABLED); } /** * @brief Set the pulse width select for the analog glitch suppresion * * Sets the pulse width select for the analog glitch * suppression on the RX line. See device datasheet for exact values. * * This only applies to Power Domain 0 (PD0). * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] pulseWidth Pulse width select for the glitch suppresion. One of @ref DL_UART_PULSE_WIDTH */ __STATIC_INLINE void DL_UART_setAnalogPulseWidth( UART_Regs *uart, DL_UART_PULSE_WIDTH pulseWidth) { DL_Common_updateReg( &uart->GFCTL, (uint32_t) pulseWidth, UART_GFCTL_AGFSEL_MASK); } /** * @brief Get the pulse width select for the glitch suppresion * * Gets the pulse width select for the analog glitch * suppression on the RX line. See device datasheet for exact values. * * This only applies to Power Domain 0 (PD0). * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The pulse width select for the glitch suppression * * @retval One of @ref DL_UART_PULSE_WIDTH */ __STATIC_INLINE DL_UART_PULSE_WIDTH DL_UART_getAnalogPulseWidth( const UART_Regs *uart) { uint32_t pulseWidth = uart->GFCTL & UART_GFCTL_AGFSEL_MASK; return (DL_UART_PULSE_WIDTH)(pulseWidth); } /** * @brief Blocks to ensure transmit is ready before sending data * * Puts the data into the TX FIFO after blocking to ensure the TX FIFO is not * full. Will wait indefintely until there is space in the TX FIFO. See * related APIs for additional transmit options. * * Can be used for any data transfers that are less than or equal to 8 bits. * * @param[in] uart pointer to the register overlay for the peripheral * @param[in] data data to send * * @sa DL_UART_transmitData * @sa DL_UART_transmitDataCheck */ void DL_UART_transmitDataBlocking(UART_Regs *uart, uint8_t data); /** * @brief Blocks to ensure receive is ready before reading data * * Reads the data from the RX FIFO after blocking to ensure the RX FIFO is not * empty. Will wait indefintely until there is data in the RX FIFO. See * related APIs for additional receive options. * * Can be used for any data transfers that are less than or equal to 8 bits. * * @note: As a result of reading the RX FIFO data, the corresponding * error status in the RXDATA register (OVRERR, BRKERR, PARERR, * FRMERR bits) will be dropped. * * @param[in] uart pointer to the register overlay for the peripheral * * @return The data in the RX FIFO * * @sa DL_UART_transmitData * @sa DL_UART_transmitDataCheck */ uint8_t DL_UART_receiveDataBlocking(const UART_Regs *uart); /** * @brief Checks the TX FIFO before trying to transmit data * * Checks if the TX FIFO is already full before trying to add new data to the * FIFO. Exits immediately if full rather than trying to block. See related * APIs for additional transmit options. * * Can be used for any data transfers that are less than or equal to 8 bits. * * @param[in] uart pointer to the register overlay for the peripheral * @param[in] data data to send * * @return If the transmit occurred * * @retval true if data was added to the TX FIFO * @retval false if the TX FIFO was full and data was not added * * @sa DL_UART_transmitData * @sa DL_UART_transmitDataBlocking */ bool DL_UART_transmitDataCheck(UART_Regs *uart, uint8_t data); /** * @brief Checks the RX FIFO before trying to transmit data * * Checks if the RX FIFO is already empty before trying to read new data from * the FIFO. Exits immediately if empty rather than trying to block. See * related APIs for additional receive options. * * Can be used for any data transfers that are less than or equal to 8 bits. * * @note: As a result of reading the RX FIFO data, the corresponding * error status in the RXDATA register (OVRERR, BRKERR, PARERR, * FRMERR bits) will be dropped. * * @param[in] uart pointer to the register overlay for the peripheral * @param[in] buffer a buffer to write the received data into * * @return If the receive occurred * * @retval true if data was read from the RX FIFO * @retval false if the RX FIFO was empty and data was not read * * @sa DL_UART_receiveData * @sa DL_UART_receiveDataBlocking */ bool DL_UART_receiveDataCheck(const UART_Regs *uart, uint8_t *buffer); /** * @brief Read all available data out of the RX FIFO using 8 bit access * * @param[in] uart Pointer to the register overlay for the peripheral * @param[out] buffer Buffer to write received data into * @param[in] maxCount Max number of bytes to read from the RX FIFO * * @return Number of bytes read from the RX FIFO */ uint32_t DL_UART_drainRXFIFO( const UART_Regs *uart, uint8_t *buffer, uint32_t maxCount); /** * @brief Fill the TX FIFO until full using 8 bit access * * Continuously write data into the TX FIFO until it is filled up or count has * been reached. * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] buffer Buffer of data to write to the TX FIFO * @param[in] count Max number of bytes to write to the TX FIFO * * @return Number of bytes written to the TX FIFO */ uint32_t DL_UART_fillTXFIFO( UART_Regs *uart, const uint8_t *buffer, uint32_t count); /** * @brief Enable UART interrupt for triggering the DMA receive event * * Enables the UART interrupt to be used as the condition to generate an * event to directly trigger the DMA. This API configures the DMA_TRIG_RX * register, which is the event publisher used for triggering the DMA to do * a receive data transfer. * * @note Only one interrupt source should be enabled at a time. * * @param[in] uart Pointer to the register overlay for the * peripheral * @param[in] interrupt Interrupt to enable as the trigger condition for * the DMA. One of @ref DL_UART_DMA_INTERRUPT_RX. */ __STATIC_INLINE void DL_UART_enableDMAReceiveEvent( UART_Regs *uart, uint32_t interrupt) { uart->DMA_TRIG_RX.IMASK = interrupt; } /** * @brief Enable UART interrupt for triggering the DMA transmit event * * Enables the UART interrupt to be used as the condition to generate an * event to directly trigger the DMA. This API configures the DMA_TRIG_TX * register, which is the event publisher used for triggering the DMA to do * a transmit data transfer. * * @note DMA_TRIG_TX only has one transmit interrupt source * * @param[in] uart Pointer to the register overlay for the * peripheral */ __STATIC_INLINE void DL_UART_enableDMATransmitEvent(UART_Regs *uart) { uart->DMA_TRIG_TX.IMASK = UART_DMA_TRIG_TX_IMASK_TXINT_SET; } /** * @brief Disables UART interrupt from triggering the DMA receive event * * Disables the UART interrupt as the condition to generate an event to * directly trigger the DMA. This API configures the DMA_TRIG_RX * register, which is the event publisher used for triggering the DMA to do * a receive data transfer. * * @param[in] uart Pointer to the register overlay for the * peripheral * @param[in] interrupt Interrupt to disable as the trigger condition for * the DMA. One of @ref DL_UART_DMA_INTERRUPT_RX. */ __STATIC_INLINE void DL_UART_disableDMAReceiveEvent( UART_Regs *uart, uint32_t interrupt) { uart->DMA_TRIG_RX.IMASK &= ~(interrupt); } /** * @brief Disables UART interrupt from triggering the DMA transmit event * * Disables the UART interrupt as the condition to generate an event to * directly trigger the DMA. This API configures the DMA_TRIG_TX * register, which is the event publisher used for triggering the DMA to do * a transmit data transfer. * * @note DMA_TRIG_TX only has one transmit interrupt source * * @param[in] uart Pointer to the register overlay for the * peripheral */ __STATIC_INLINE void DL_UART_disableDMATransmitEvent(UART_Regs *uart) { uart->DMA_TRIG_TX.IMASK = UART_DMA_TRIG_TX_IMASK_TXINT_CLR; } /** * @brief Check which UART interrupt for DMA receive events is enabled * * This API checks the DMA_TRIG_RX register, which is the event publisher used * for triggering the DMA to do a receive data transfer. * * @param[in] uart Pointer to the register overlay for the * peripheral * @param[in] interruptMask Bit mask of interrupts to check Bitwise OR of * @ref DL_UART_DMA_INTERRUPT_RX. * * @return Which of the requested UART interrupts is enabled * * @retval One of @ref DL_UART_DMA_INTERRUPT_RX */ __STATIC_INLINE uint32_t DL_UART_getEnabledDMAReceiveEvent( const UART_Regs *uart, uint32_t interruptMask) { return (uart->DMA_TRIG_RX.IMASK & interruptMask); } /** * @brief Check if UART interrupt for DMA transmit event is enabled * * This API checks the DMA_TRIG_TX register, which is the event publisher used * for triggering the DMA to do a transmit data transfer. * * @param[in] uart Pointer to the register overlay for the * peripheral * * @return The requested UART interrupt status * * @retval DL_UART_DMA_INTERRUPT_TX if enabled, 0 if not enabled */ __STATIC_INLINE uint32_t DL_UART_getEnabledDMATransmitEvent( const UART_Regs *uart) { return (uart->DMA_TRIG_TX.IMASK & UART_DMA_TRIG_TX_IMASK_TXINT_MASK); } /** * @brief Check interrupt flag of enabled UART interrupt for DMA receive event * * Checks if any of the UART interrupts for the DMA receive event that were * previously enabled are pending. * This API checks the DMA_TRIG_RX register, which is the event publisher used * for triggering the DMA to do a receive data transfer. * * @param[in] uart Pointer to the register overlay for the * peripheral * @param[in] interruptMask Bit mask of interrupts to check. Bitwise OR of * @ref DL_UART_DMA_INTERRUPT_RX. * * @return The requested UART interrupt status * * @retval One of @ref DL_UART_DMA_INTERRUPT_RX * * @sa DL_UART_enableDMAReceiveEvent */ __STATIC_INLINE uint32_t DL_UART_getEnabledDMAReceiveEventStatus( const UART_Regs *uart, uint32_t interruptMask) { return (uart->DMA_TRIG_RX.MIS & interruptMask); } /** * @brief Check interrupt flag of enabled UART interrupt for DMA transmit event * * Checks if the UART interrupt for the DMA transmit event that was * previously enabled is pending. * This API checks the DMA_TRIG_TX register, which is the event publisher used * for triggering the DMA to do a transmit data transfer. * * @param[in] uart Pointer to the register overlay for the * peripheral * * @return The requested UART interrupt status * * @retval DL_UART_DMA_INTERRUPT_TX if enabled, 0 if not enabled * * @sa DL_UART_enableDMATransmitEvent */ __STATIC_INLINE uint32_t DL_UART_getEnabledDMATransmitEventStatus( const UART_Regs *uart) { return (uart->DMA_TRIG_TX.MIS & UART_DMA_TRIG_TX_MIS_TXINT_MASK); } /** * @brief Check interrupt flag of any UART interrupt for DMA receive event * * Checks if any of the UART interrupts for DMA receive event are pending. * Interrupts do not have to be previously enabled. * This API checks the DMA_TRIG_RX register, which is the event publisher used * for triggering the DMA to do a receive data transfer. * * @param[in] uart Pointer to the register overlay for the * peripheral * @param[in] interruptMask Bit mask of interrupts to check. Bitwise OR of * @ref DL_UART_DMA_INTERRUPT_RX. * * @return Which of the requested UART interrupts are pending * * @retval Bitwise OR of @ref DL_UART_DMA_INTERRUPT_RX values */ __STATIC_INLINE uint32_t DL_UART_getRawDMAReceiveEventStatus( const UART_Regs *uart, uint32_t interruptMask) { return (uart->DMA_TRIG_RX.RIS & interruptMask); } /** * @brief Check interrupt flag of any UART interrupt for DMA transmit event * * Checks if any of the UART interrupts for DMA transmit event are pending. * Interrupts do not have to be previously enabled. * This API checks the DMA_TRIG_TX register, which is the event publisher used * for triggering the DMA to do a transmit data transfer. * * @param[in] uart Pointer to the register overlay for the * peripheral * * @return The requested UART interrupt status * * @retval DL_UART_DMA_INTERRUPT_TX if enabled, 0 if not enabled */ __STATIC_INLINE uint32_t DL_UART_getRawDMATransmitEventStatus( const UART_Regs *uart) { return (uart->DMA_TRIG_TX.RIS & UART_DMA_TRIG_TX_RIS_TXINT_MASK); } /** * @brief Get highest priority pending UART interrupt for DMA receive event * * Checks if any of the UART interrupts for DMA receive event are pending. * Interrupts do not have to be previously enabled. * This API checks the DMA_TRIG_RX register, which is the event publisher used * for triggering the DMA to do a receive data transfer. * * * @param[in] uart Pointer to the register overlay for the * peripheral * * @return The highest priority pending UART interrupt * * @retval One of @ref DL_UART_DMA_IIDX_RX */ __STATIC_INLINE DL_UART_DMA_IIDX_RX DL_UART_getPendingDMAReceiveEvent( const UART_Regs *uart) { return (DL_UART_DMA_IIDX_RX)(uart->DMA_TRIG_RX.IIDX); } /** * @brief Get highest priority pending UART interrupt for DMA transmit event * * Checks if the UART interrupt for DMA transmit event is pending. * Interrupts do not have to be previously enabled. * This API checks the DMA_TRIG_TX register, which is the event publisher used * for triggering the DMA to do a transmit data transfer. * * * @param[in] uart Pointer to the register overlay for the * peripheral * * @return The highest priority pending UART interrupt * * @retval DL_UART_DMA_IIDX_TX if pending, 0 if not pending */ __STATIC_INLINE DL_UART_DMA_IIDX_TX DL_UART_getPendingDMATransmitEvent( const UART_Regs *uart) { return (DL_UART_DMA_IIDX_TX)(uart->DMA_TRIG_TX.IIDX); } /** * @brief Clear pending UART interrupts for DMA receive event * * This API checks the DMA_TRIG_RX register, which is the event publisher used * for triggering the DMA to do a receive data transfer. * * @param[in] uart Pointer to the register overlay for the * peripheral * @param[in] interruptMask Bit mask of interrupts to clear. Bitwise OR of * @ref DL_UART_DMA_INTERRUPT_RX. */ __STATIC_INLINE void DL_UART_clearDMAReceiveEventStatus( UART_Regs *uart, uint32_t interruptMask) { uart->DMA_TRIG_RX.ICLR = interruptMask; } /** * @brief Clear pending UART interrupt for DMA transmit event * * This API checks the DMA_TRIG_TX register, which is the event publisher used * for triggering the DMA to do a transmit data transfer. * * @param[in] uart Pointer to the register overlay for the * peripheral * @note DMA_TRIG_TX only has one transmit interrupt source */ __STATIC_INLINE void DL_UART_clearDMATransmitEventStatus(UART_Regs *uart) { uart->DMA_TRIG_TX.ICLR = UART_DMA_TRIG_TX_ICLR_TXINT_CLR; } /*! * @brief Sets the second clock divider ratio * * This API sets the CLKDIV2 register, which stores the clock divider ratio * used to further divide the UART function clock in IrDA UART mode * * @param[in] uart Pointer to the register overlay for the peripheral * @param[in] ratio The CLKDIV2 value. One of @ref DL_UART_CLOCK_DIVIDE_RATIO */ __STATIC_INLINE void DL_UART_setClockDivider2( UART_Regs *uart, DL_UART_CLOCK_DIVIDE2_RATIO ratio) { uart->CLKDIV2 = (uint32_t) ratio; } /*! * @brief Gets the value of CLKDIV2 * * This API gets the value stored in the CLKDIV2 register, which stores the * clock divider ratio to further divide the UART function clock in IrDA Mode * * @param[in] uart Pointer to the register overlay for the peripheral * * @return The clock divider ratio stored in the CLKDIV2 register * * @retval The CLKDIV2 value. One of @ref DL_UART_CLOCK_DIVIDE2_RATIO */ __STATIC_INLINE DL_UART_CLOCK_DIVIDE2_RATIO DL_UART_getClockDivider2( const UART_Regs *uart) { uint32_t ratio = uart->CLKDIV2; return (DL_UART_CLOCK_DIVIDE2_RATIO) ratio; } #ifdef __MSPM0_HAS_UART_MAIN__ /** * @brief Save UART Main configuration before entering a power loss state. * * Some MSPM0G peripherals residing in PD1 domain do not retain register * contents when entering STOP or STANDBY modes. Please refer to the datasheet * for the full list of peripheral instances that exhibit this behavior. * * @param[in] uart Pointer to the register overlay for the peripheral * * @param[in] ptr Configuration backup setup structure. See * @ref DL_UART_Main_backupConfig. * * @retval FALSE if a configuration already exists in ptr (will not be * overwritten). TRUE if a configuration was successfully saved * */ bool DL_UART_Main_saveConfiguration( const UART_Regs *uart, DL_UART_Main_backupConfig *ptr); /** * @brief Restore UART Main configuration after leaving a power loss state. * * Some MSPM0G peripherals residing in PD1 domain do not retain register * contents when entering STOP or STANDBY modes. Please refer to the datasheet * for the full list of peripheral instances that exhibit this behavior. * * @param[in] uart Pointer to the register overlay for the peripheral * * @param[in] ptr Configuration backup setup structure. See * @ref DL_UART_Main_backupConfig. * * @retval FALSE if a configuration does not exist in ptr (will not be * loaded). TRUE if a configuration successfully loaded * */ bool DL_UART_Main_restoreConfiguration( UART_Regs *uart, DL_UART_Main_backupConfig *ptr); #endif /* __MSPM0_HAS_UART_MAIN__ */ #ifdef __MSPM0_HAS_UART_EXTD__ /** * @brief Save UART Extend configuration before entering a power loss * state. * * Some MSPM0G peripherals residing in PD1 domain do not retain register * contents when entering STOP or STANDBY modes. Please refer to the datasheet * for the full list of peripheral instances that exhibit this behavior. * * @param[in] uart Pointer to the register overlay for the peripheral * * @param[in] ptr Configuration backup setup structure. See * @ref DL_UART_Extend_backupConfig. * * @retval FALSE if a configuration already exists in ptr (will not be * overwritten). TRUE if a configuration was successfully saved * */ bool DL_UART_Extend_saveConfiguration( const UART_Regs *uart, DL_UART_Extend_backupConfig *ptr); /** * @brief Restore UART Extend configuration after leaving a power loss * state. * * Some MSPM0G peripherals residing in PD1 domain do not retain register * contents when entering STOP or STANDBY modes. Please refer to the datasheet * for the full list of peripheral instances that exhibit this behavior. * * @param[in] uart Pointer to the register overlay for the peripheral * * @param[in] ptr Configuration backup setup structure. See * @ref DL_UART_Extend_backupConfig. * * @retval FALSE if a configuration does not exist in ptr (will not be * loaded). TRUE if a configuration successfully loaded * */ bool DL_UART_Extend_restoreConfiguration( UART_Regs *uart, DL_UART_Extend_backupConfig *ptr); #endif /* __MSPM0_HAS_UART_EXTD__ */ #ifdef __cplusplus } #endif #endif /* __MSPM0_HAS_UART_MAIN__ || __MSPM0_HAS_UART_EXTD__ */ #else #warning \ "TI highly recommends accessing uart with dl_uart_main, dl_uart_extend.h only." #endif /* ti_dl_dl_uart_main__include ti_dl_dl_uart_extend__include */ #endif /* ti_dl_dl_uart__include */ /** @}*/