f2838x_cm_cia402_solution/device/driverlib_cm/uart.h

1677 lines
55 KiB
C
Raw Normal View History

//###########################################################################
//
// FILE: uart.h
//
// TITLE: CM UARTdriver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2022 Texas Instruments Incorporated - http://www.ti.com
//
// 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.
// $
//###########################################################################
#ifndef UART_H
#define UART_H
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
#ifdef __cplusplus
extern "C"
{
#endif
//*****************************************************************************
//
//! \addtogroup uart_api UART
//! \brief The UART module is used for UART configurations.
//! @{
//
//*****************************************************************************
#include <stdbool.h>
#include <stdint.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_uart.h"
#include "debug.h"
#include "interrupt.h"
//*****************************************************************************
//
// Defines for the API.
//
//*****************************************************************************
//*****************************************************************************
//
// Values that can be passed to UART_enableInterrupt,
// UART_disableInterrupt, and UART_clearInterruptStatus
// as the intFlags parameter, and returned from UART_getInterruptStatus.
//
//*****************************************************************************
#define UART_INT_DMATX 0x20000U //!<DMA TX interrupt
#define UART_INT_DMARX 0x10000U //!< DMA RX interrupt
#define UART_INT_9BIT 0x1000U //!<9-bit address match interrupt
#define UART_INT_EOT 0x800U //!<Receive Interrupt Mask
#define UART_INT_OE 0x400U //!<Overrun Error Interrupt Mask
#define UART_INT_BE 0x200U //!<Break Error Interrupt Mask
#define UART_INT_PE 0x100U //!<Parity Error Interrupt Mask
#define UART_INT_FE 0x080U //!<Framing Error Interrupt Mask
#define UART_INT_RT 0x040U //!<Receive Timeout Interrupt Mask
#define UART_INT_TX 0x020U //!<Transmit Interrupt Mask
#define UART_INT_RX 0x010U //!<Receive Interrupt Mask
//*****************************************************************************
//
// Values that can be passed to UART_setConfig as the config parameter
// and returned by UART_getConfig in the config parameter.
// Additionally, the UART_CONFIG_PAR_* subset can be passed to
// UART_setParityMode as the parity parameter, and are returned by
// UART_getParityMode.
//
//*****************************************************************************
#define UART_CONFIG_WLEN_MASK 0x00000060UL //!<Mask for extracting wordlength
#define UART_CONFIG_WLEN_8 0x00000060UL //!< 8 bit data
#define UART_CONFIG_WLEN_7 0x00000040UL //!< 7 bit data
#define UART_CONFIG_WLEN_6 0x00000020UL //!< 6 bit data
#define UART_CONFIG_WLEN_5 0x00000000UL //!< 5 bit data
#define UART_CONFIG_STOP_MASK 0x00000008UL //!< Mask for extracting stop bits
#define UART_CONFIG_STOP_ONE 0x00000000UL //!< One stop bit
#define UART_CONFIG_STOP_TWO 0x00000008UL //!< Two stop bits
#define UART_CONFIG_PAR_MASK 0x00000086UL //!< Mask for extracting parity
#define UART_CONFIG_PAR_NONE 0x00000000UL //!< No parity
#define UART_CONFIG_PAR_EVEN 0x00000006UL //!< Even parity
#define UART_CONFIG_PAR_ODD 0x00000002UL //!< Odd parity
#define UART_CONFIG_PAR_ONE 0x00000082UL //!< Parity bit is one
#define UART_CONFIG_PAR_ZERO 0x00000086UL //!< Parity bit is zero
//*****************************************************************************
//
// Values that can be passed to UART_setFIFOLevel as the txLevel parameter
// and returned by UART_getFIFOLevel in the txLevel.
// These are 8 bit (1 byte) wide and 16 locations deep FIFOs.
// For example, to get a transmit interrupt after 4 data bytes are transmitted,
// we need a trigger after the transmit FIFO has 4 bytes with 4 locations deep,
// that is, 4 out of 16 locations deep which is 1/4 full.(UART_FIFO_TX2_8)
//
//*****************************************************************************
#define UART_FIFO_TX1_8 0x00000000UL //!< Transmit interrupt at 1/8 Full
#define UART_FIFO_TX2_8 0x00000001UL //!< Transmit interrupt at 1/4 Full
#define UART_FIFO_TX4_8 0x00000002UL //!< Transmit interrupt at 1/2 Full
#define UART_FIFO_TX6_8 0x00000003UL //!< Transmit interrupt at 3/4 Full
#define UART_FIFO_TX7_8 0x00000004UL //!< Transmit interrupt at 7/8 Full
//*****************************************************************************
//
// Values that can be passed to UART_setFIFOLevel as the rxLevel parameter
// and returned by UART_getFIFOLevel in the rxLevel.
// These are 8 bit (1 byte) wide and 16 locations deep FIFOs.
// For example, to get a receive interrupt after 4 data bytes are received,
// we need a trigger after the receive FIFO has 4 bytes with 4 locations deep,
// that is, 4 out of 16 locations deep which is 1/4 full.(UART_FIFO_RX2_8)
//
//*****************************************************************************
#define UART_FIFO_RX1_8 0x00000000UL //!< Receive interrupt at 1/8 Full
#define UART_FIFO_RX2_8 0x00000008UL //!< Receive interrupt at 1/4 Full
#define UART_FIFO_RX4_8 0x00000010UL //!< Receive interrupt at 1/2 Full
#define UART_FIFO_RX6_8 0x00000018UL //!< Receive interrupt at 3/4 Full
#define UART_FIFO_RX7_8 0x00000020UL //!< Receive interrupt at 7/8 Full
//*****************************************************************************
//
// Values that can be passed to UART_enableDMA() and UART_disableDMA().
//
//*****************************************************************************
#define UART_DMA_ERR_RXSTOP 0x00000004UL //!< Stop DMA receive if UART error
#define UART_DMA_TX 0x00000002UL //!< Enable DMA for transmit
#define UART_DMA_RX 0x00000001UL //!< Enable DMA for receive
//*****************************************************************************
//
// Values returned from UART_getRxError().
//
//*****************************************************************************
#define UART_RXERROR_OVERRUN 0x00000008UL
#define UART_RXERROR_BREAK 0x00000004UL
#define UART_RXERROR_PARITY 0x00000002UL
#define UART_RXERROR_FRAMING 0x00000001UL
//*****************************************************************************
//
// Values that can be passed to UART_setTxIntMode() or returned from
// UART_getTxIntMode().
//
//*****************************************************************************
#define UART_TXINT_MODE_FIFO 0x00000000UL //!< trigger based on tx FIFOlevel
#define UART_TXINT_MODE_EOT 0x00000010UL //!< trigger when transmitter idle
//*****************************************************************************
//
// The system clock divider defining the maximum baud rate supported by the
// UART.
//
//*****************************************************************************
#define UART_CLK_DIVIDER 8U
//*****************************************************************************
//
// UART clock frequency in HZ .
// Value that can be passed to UART_setConfig() & UART_getConfig().
//
//*****************************************************************************
#define UART_CLK_FREQ CM_CLK_FREQ //!< CPU frequency
//
//Mask for all errors
//
#define UART_RSR_ALL_M (UART_RSR_BE | UART_RSR_FE | UART_RSR_OE | UART_RSR_PE)
//*****************************************************************************
//
//SIR ( IrDA ) Low Power Baud macro . IrLPBaud16 is nominally 1.8432 MHz.
// Value that can be passed to UART_setIrDALPDivisor().
//
//*****************************************************************************
#define UART_CLK_IRLPBAUD16 1843200U
//*****************************************************************************
//
// UART interrupt type.Values that can be passed to UART_getInterruptStatus()
//
//*****************************************************************************
#define UART_RAW_INT false //!<raw interrupt
#define UART_MASKED_INT true //!<masked interrupt
typedef bool Uart_IntType;
//*****************************************************************************
//
// Values that can be passed to UART_enableSIR().
//
//*****************************************************************************
#define UART_SIR_LOWPOWER_DISABLE false //!<raw interrupt
#define UART_SIR_LOWPOWER_ENABLE true //!<masked interrupt
typedef bool Uart_SirLPMode;
//*****************************************************************************
//
//! \internal
//! Checks a UART base address.
//!
//! \param base is the base address of the UART port.
//!
//! This function determines if a UART port base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
#ifdef DEBUG
static inline bool
UART_isBaseValid(uint32_t base)
{
return(
(base == UART0_BASE)
);
}
#endif
//*****************************************************************************
//
//! Sets the type of parity.
//!
//! \param base is the base address of the UART port.
//! \param parity specifies the type of parity to use.
//!
//! This function configures the type of parity to use for transmitting and
//! expect when receiving. The \e parity parameter must be one of
//! \b UART_CONFIG_PAR_NONE, \b UART_CONFIG_PAR_EVEN,
//! \b UART_CONFIG_PAR_ODD, \b UART_CONFIG_PAR_ONE,
//! or \b UART_CONFIG_PAR_ZERO. The last two parameters allow direct
//! control of the parity bit; it is always either one or zero based on the
//! mode.
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_setParityMode(uint32_t base, uint32_t parity)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
ASSERT((parity == UART_CONFIG_PAR_NONE) ||
(parity == UART_CONFIG_PAR_EVEN) ||
(parity == UART_CONFIG_PAR_ODD) ||
(parity == UART_CONFIG_PAR_ONE) ||
(parity == UART_CONFIG_PAR_ZERO));
//
// Set the parity mode.
//
HWREG(base + UART_O_LCRH) = ((HWREG(base + UART_O_LCRH) &
~(UART_LCRH_SPS | UART_LCRH_EPS |
UART_LCRH_PEN)) | parity);
}
//*****************************************************************************
//
//! Gets the type of parity currently being used.
//!
//! \param base is the base address of the UART port.
//!
//! This function gets the type of parity used for transmitting data and
//! expected when receiving data.
//!
//! \return Returns the current parity settings, specified as one of
//! \b UART_CONFIG_PAR_NONE, \b UART_CONFIG_PAR_EVEN,
//! \b UART_CONFIG_PAR_ODD,
//! \b UART_CONFIG_PAR_ONE, or \b UART_CONFIG_PAR_ZERO.
//
//*****************************************************************************
static inline uint32_t
UART_getParityMode(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Return the current parity setting.
//
return(HWREG(base + UART_O_LCRH) & (UART_LCRH_SPS |
UART_LCRH_EPS |
UART_LCRH_PEN));
}
//*****************************************************************************
//
//! Sets the FIFO level at which interrupts are generated.
//!
//! \param base is the base address of the UART port.
//! \param txLevel is the transmit FIFO interrupt level, specified as one
//! of \b UART_FIFO_TX1_8, \b UART_FIFO_TX2_8, \b UART_FIFO_TX4_8,
//! \b UART_FIFO_TX6_8, or \b UART_FIFO_TX7_8.
//! \param rxLevel is the receive FIFO interrupt level, specified as one of
//! \b UART_FIFO_RX1_8, \b UART_FIFO_RX2_8, \b UART_FIFO_RX4_8,
//! \b UART_FIFO_RX6_8, or \b UART_FIFO_RX7_8.
//!
//! This function configures the FIFO level at which transmit and receive
//! interrupts are generated.
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_setFIFOLevel(uint32_t base, uint32_t txLevel,
uint32_t rxLevel)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
ASSERT((txLevel == UART_FIFO_TX1_8) ||
(txLevel == UART_FIFO_TX2_8) ||
(txLevel == UART_FIFO_TX4_8) ||
(txLevel == UART_FIFO_TX6_8) ||
(txLevel == UART_FIFO_TX7_8));
ASSERT((rxLevel == UART_FIFO_RX1_8) ||
(rxLevel == UART_FIFO_RX2_8) ||
(rxLevel == UART_FIFO_RX4_8) ||
(rxLevel == UART_FIFO_RX6_8) ||
(rxLevel == UART_FIFO_RX7_8));
//
// Set the FIFO interrupt levels.
//
HWREG(base + UART_O_IFLS) = txLevel | rxLevel;
}
//*****************************************************************************
//
//! Gets the FIFO level at which interrupts are generated.
//!
//! \param base is the base address of the UART port.
//! \param txLevel is a pointer to storage for the transmit FIFO level,
//! returned as one of \b UART_FIFO_TX1_8, \b UART_FIFO_TX2_8,
//! \b UART_FIFO_TX4_8, \b UART_FIFO_TX6_8, or \b UART_FIFO_TX7_8.
//! \param rxLevel is a pointer to storage for the receive FIFO level,
//! returned as one of \b UART_FIFO_RX1_8, \b UART_FIFO_RX2_8,
//! \b UART_FIFO_RX4_8, \b UART_FIFO_RX6_8, or \b UART_FIFO_RX7_8.
//!
//! This function gets the FIFO level at which transmit and receive interrupts
//! are generated.
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_getFIFOLevel(uint32_t base, uint32_t *txLevel,
uint32_t *rxLevel)
{
uint32_t temp;
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Read the FIFO level register.
//
temp = HWREG(base + UART_O_IFLS);
//
// Extract the transmit and receive FIFO levels.
//
*txLevel = temp & UART_IFLS_TXIFLSEL_M;
*rxLevel = temp & UART_IFLS_RXIFLSEL_M;
}
//*****************************************************************************
//
//! Enables transmitting and receiving.
//!
//! \param base is the base address of the UART port.
//!
//! This function enables the UART and its transmit and receive FIFOs.
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_enableModule(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Enable the FIFO.
//
HWREG(base + UART_O_LCRH) |= UART_LCRH_FEN;
//
// Enable RX, TX, and the UART.
//
HWREG(base + UART_O_CTL) |= (UART_CTL_UARTEN | UART_CTL_TXE |
UART_CTL_RXE);
}
//*****************************************************************************
//
//! Disables transmitting and receiving.
//!
//! \param base is the base address of the UART port.
//!
//! This function disables the UART, waits for the end of transmission of the
//! current character, and flushes the transmit FIFO.
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_disableModule(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Wait for end of TX.
//
while((HWREG(base + UART_O_FR) & UART_FR_BUSY) == UART_FR_BUSY)
{
}
//
// Disable the FIFO.
//
HWREG(base + UART_O_LCRH) &= ~(UART_LCRH_FEN);
//
// Disable the UART.
//
HWREG(base + UART_O_CTL) &= ~(UART_CTL_UARTEN | UART_CTL_TXE |
UART_CTL_RXE);
}
//*****************************************************************************
//
//! Enables the transmit and receive FIFOs.
//!
//! \param base is the base address of the UART port.
//!
//! This functions enables the transmit and receive FIFOs in the UART.
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_enableFIFO(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Enable the FIFO.
//
HWREG(base + UART_O_LCRH) |= UART_LCRH_FEN;
}
//*****************************************************************************
//
//! Disables the transmit and receive FIFOs.
//!
//! \param base is the base address of the UART port.
//!
//! This function disables the transmit and receive FIFOs in the UART.
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_disableFIFO(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Disable the FIFO.
//
HWREG(base + UART_O_LCRH) &= ~(UART_LCRH_FEN);
}
//*****************************************************************************
//
//! Enables transmitting and receiving without FIFO.
//!
//! \param base is the base address of the UART port.
//!
//! This function enables the UART.
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_enableModuleNonFIFO(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Enable RX, TX, and the UART.
//
HWREG(base + UART_O_CTL) |= (UART_CTL_UARTEN | UART_CTL_TXE |
UART_CTL_RXE);
}
//*****************************************************************************
//
//! Disables transmitting and receiving without FIFO.
//!
//! \param base is the base address of the UART port.
//!
//! This function disables the UART, waits for the end of transmission of the
//! current character.
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_disableModuleNonFIFO(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Wait for end of TX.
//
while((HWREG(base + UART_O_FR) & UART_FR_BUSY) == UART_FR_BUSY)
{
}
//
// Disable the UART.
//
HWREG(base + UART_O_CTL) &= ~(UART_CTL_UARTEN | UART_CTL_TXE |
UART_CTL_RXE);
}
//*****************************************************************************
//
//! Determines if the transmit and receive FIFOs are enabled
//!
//! \param base is the base address of the UART port.
//!
//! This function returns a flag indicating whether or not the
//! transmit and receive FIFOs are enabled.
//!
//! \return Returns \b true if FIFOs are enabled or \b false
//! if FIFOs are not enabled.
//
//*****************************************************************************
static inline bool
UART_isFIFOEnabled(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Returns the FIFO is enabled or disabled.
//
return(((HWREG(base + UART_O_LCRH) & UART_LCRH_FEN)== UART_LCRH_FEN) ?
true : false);
}
//*****************************************************************************
//
//! Enables SIR (IrDA) mode on the specified UART.
//!
//! \param base is the base address of the UART port.
//! \param bLowPower indicates if SIR Low Power Mode is to be used.
//! This parameter is of type UART_SirLPMode.
//!
//! This function enables SIR (IrDA) mode on the UART. If the \e bLowPower
//! flag is set, then SIR low power mode will be selected as well. This
//! function only has an effect if the UART has not been enabled by a call to
//! UART_enableModule(). The call UART_enableSIR() must be made before
//! a call to UART_setConfig() because the UART_setConfig() function
//! calls the UART_enableModule() function. Another option is to call
//! UART_disableModule() followed by UART_enableSIR() and then enable
//! the UART by calling UART_enableModule().
//!
//! \note The IrDA SIR physical layer specifies a minimum 10-ms delay
//! between transmission and reception which needs to be provided.
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_enableSIR(uint32_t base, Uart_SirLPMode bLowPower)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Enable SIR and SIRLP (if appropriate).
//
if(bLowPower)
{
HWREG(base + UART_O_CTL) |= (UART_CTL_SIREN | UART_CTL_SIRLP);
}
else
{
HWREG(base + UART_O_CTL) = ((HWREG(base + UART_O_CTL) &
~(UART_CTL_SIREN | UART_CTL_SIRLP)) |
(UART_CTL_SIREN));
}
}
//*****************************************************************************
//
//! Disables SIR (IrDA) mode on the specified UART.
//!
//! \param base is the base address of the UART port.
//!
//! This function disables SIR(IrDA) mode on the UART. This function only has
//! an effect if the UART has not been enabled by a call to
//! UART_enableModule(). The call UART_enableSIR() must be made before
//! a call to UART_setConfig() because the UART_setConfig() function
//! calls the UART_enableModule() function.
//! Another option is to call UART_disableModule() followed by
//! UART_enableSIR() and then enable the UART by calling
//! UART_enableModule().
//!
//! \note The IrDA SIR physical layer specifies a minimum 10-ms delay
//! between transmission and reception which needs to be provided.
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_disableSIR(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Disable SIR and SIRLP (if appropriate).
//
HWREG(base + UART_O_CTL) &= ~(UART_CTL_SIREN | UART_CTL_SIRLP);
}
//*****************************************************************************
//
//! Sets the operating mode for the UART transmit interrupt.
//!
//! \param base is the base address of the UART port.
//! \param mode is the operating mode for the transmit interrupt. It may
//! be \b UART_TXINT_MODE_EOT to trigger interrupts when the transmitter is
//! idle or \b UART_TXINT_MODE_FIFO to trigger based on the current transmit
//! FIFO level.
//!
//! This function allows the mode of the UART transmit interrupt to be set. By
//! default, the transmit interrupt is asserted when the FIFO level falls past
//! a threshold set via a call to UART_setFIFOLevel(). Alternatively, if this
//! function is called with \e mode set to \b UART_TXINT_MODE_EOT, the
//! transmit interrupt is asserted once the transmitter is completely idle -
//! the transmit FIFO is empty and all bits, including any stop bits, have
//! cleared the transmitter.
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_setTxIntMode(uint32_t base, uint32_t mode)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
ASSERT((mode == UART_TXINT_MODE_EOT) ||
(mode == UART_TXINT_MODE_FIFO));
//
// Set or clear the EOT bit of the UART control register as appropriate.
//
HWREG(base + UART_O_CTL) = ((HWREG(base + UART_O_CTL) &
~(UART_TXINT_MODE_EOT |
UART_TXINT_MODE_FIFO)) | mode);
}
//*****************************************************************************
//
//! Returns the current operating mode for the UART transmit interrupt.
//!
//! \param base is the base address of the UART port.
//!
//! This function returns the current operating mode for the UART transmit
//! interrupt. The return value is \b UART_TXINT_MODE_EOT if the transmit
//! interrupt is currently configured to be asserted once the transmitter is
//! completely idle - the transmit FIFO is empty and all bits, including any
//! stop bits, have cleared the transmitter. The return value is
//! \b UART_TXINT_MODE_FIFO if the interrupt is configured to be asserted
//! based on the level of the transmit FIFO.
//!
//! \return Returns \b UART_TXINT_MODE_FIFO or \b UART_TXINT_MODE_EOT.
//
//*****************************************************************************
static inline uint32_t
UART_getTxIntMode(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Return the current transmit interrupt mode.
//
return(HWREG(base + UART_O_CTL) & (UART_TXINT_MODE_EOT |
UART_TXINT_MODE_FIFO));
}
//*****************************************************************************
//
//! Determines if there are any characters in the receive FIFO.
//!
//! \param base is the base address of the UART port.
//!
//! This function returns a flag indicating whether or not there is data
//! available in the receive FIFO.
//!
//! \return Returns \b true if there is data in the receive FIFO or \b false
//! if there is no data in the receive FIFO.
//
//*****************************************************************************
static inline bool
UART_isDataAvailable(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Return the availability of characters.
//
return(((HWREG(base + UART_O_FR) & UART_FR_RXFE)== UART_FR_RXFE) ?
false : true);
}
//*****************************************************************************
//
//! Determines if there is any space in the transmit FIFO.
//!
//! \param base is the base address of the UART port.
//!
//! This function returns a flag indicating whether or not there is space
//! available in the transmit FIFO.
//!
//! \return Returns \b true if there is space available in the transmit FIFO
//! or \b false if there is no space available in the transmit FIFO.
//
//*****************************************************************************
static inline bool
UART_isSpaceAvailable(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Return the availability of space.
//
return(((HWREG(base + UART_O_FR) & UART_FR_TXFF)== UART_FR_TXFF) ?
false : true);
}
//*****************************************************************************
//
//! Receives a character from the specified port.
//!
//! \param base is the base address of the UART port.
//!
//! This function gets a character from the receive FIFO for the specified
//! port.
//!
//! \return Returns the character read from the specified port, cast as a
//! \e int32_t. A \b -1 is returned if there are no characters present in the
//! receive FIFO. The UART_isDataAvailable() function should be called
//! before attempting to call this function.
//
//*****************************************************************************
static inline int32_t
UART_readCharNonBlocking(uint32_t base)
{
int32_t ret;
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// See if there are any characters in the receive FIFO.
//
if(((HWREG(base + UART_O_FR) & UART_FR_RXFE)) == 0U)
{
//
// Read and return the next character.
//
ret = HWREG(base + UART_O_DR);
}
else
{
//
// There are no characters, so return a failure.
//
ret = -1;
}
return(ret);
}
//*****************************************************************************
//
//! Waits for a character from the specified port.
//!
//! \param base is the base address of the UART port.
//!
//! This function gets a character from the receive FIFO for the specified
//! port. If there are no characters available, this function waits until a
//! character is received before returning.
//!
//! \return Returns the character read from the specified port, cast as a
//! \e int32_t.
//
//*****************************************************************************
static inline int32_t
UART_readChar(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Wait until a char is available.
//
while((HWREG(base + UART_O_FR) & UART_FR_RXFE)== UART_FR_RXFE)
{
}
//
// Now get the char.
//
return(HWREG(base + UART_O_DR));
}
//*****************************************************************************
//
//! Waits to send a character from the specified port.
//!
//! \param base is the base address of the UART port.
//! \param data is the character to be transmitted.
//!
//! This function sends the character \e data to the transmit FIFO for the
//! specified port. If there is no space available in the transmit FIFO, this
//! function waits until there is space available before returning.
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_writeChar(uint32_t base, uint8_t data)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Wait until space is available.
//
while((HWREG(base + UART_O_FR) & UART_FR_TXFF)== UART_FR_TXFF)
{
}
//
// Send the char.
//
HWREG(base + UART_O_DR) = data;
}
//*****************************************************************************
//
//! Causes a BREAK to be sent.
//!
//! \param base is the base address of the UART port.
//! \param breakState controls the output level.
//!
//! Calling this function with \e bBreakState set to \b true asserts a break
//! condition on the UART. Calling this function with \e bBreakState set to
//! \b false removes the break condition. For proper transmission of a break
//! command, the break must be asserted for at least two complete frames.
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_setBreakConfig(uint32_t base, bool breakState)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Set the break condition as requested.
//
HWREG(base + UART_O_LCRH) = (breakState ?
(HWREG(base + UART_O_LCRH) | UART_LCRH_BRK) :
(HWREG(base + UART_O_LCRH) & ~(UART_LCRH_BRK)));
}
//*****************************************************************************
//
//! Determines whether the UART transmitter is busy or not.
//!
//! \param base is the base address of the UART port.
//!
//! This function allows the caller to determine whether all transmitted bytes
//! have cleared the transmitter hardware. If \b false is returned, the
//! transmit FIFO is empty and all bits of the last transmitted character,
//! including all stop bits, have left the hardware shift register.
//!
//! \return Returns \b true if the UART is transmitting or \b false if all
//! transmissions are complete.
//
//*****************************************************************************
static inline bool
UART_isBusy(uint32_t base)
{
//
// Check the argument.
//
ASSERT(UART_isBaseValid(base));
//
// Determine if the UART is busy.
//
return(((HWREG(base + UART_O_FR) & UART_FR_BUSY) == UART_FR_BUSY) ?
true : false);
}
//*****************************************************************************
//
//! Registers an interrupt handler for a UART interrupt.
//!
//! \param interruptNum specifies the interrupt in question.
//! \param pfnHandler is a pointer to the function to be called when the
//! UART interrupt occurs.
//!
//! This function does the actual registering of the interrupt handler. This
//! function enables the global interrupt in the interrupt controller; specific
//! UART interrupts must be enabled via UART_enableInterrupt(). It is the
//! interrupt handler's responsibility to clear the interrupt source.
//!
//! \sa Interrupt_registerHandler() for important information about registering
//! interrupt handlers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_registerInterrupt(uint32_t interruptNum, void (*pfnHandler)(void))
{
//
// Register the interrupt handler.
//
Interrupt_registerHandler(interruptNum, pfnHandler);
//
// Enable the UART interrupt.
//
Interrupt_enable(interruptNum);
}
//*****************************************************************************
//
//! Unregisters an interrupt handler for a UART interrupt.
//!
//! \param interruptNum specifies the interrupt in question.
//!
//! This function does the actual unregistering of the interrupt handler. It
//! clears the handler to be called when a UART interrupt occurs. This
//! function also masks off the interrupt in the interrupt controller so that
//! the interrupt handler no longer is called.
//!
//! \sa Interrupt_unregisterHandler() for important information about
//! registering interrupt handlers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_unregisterInterrupt(uint32_t interruptNum)
{
//
// Disable the interrupt.
//
Interrupt_disable(interruptNum);
//
// Unregister the interrupt handler.
//
Interrupt_unregisterHandler(interruptNum);
}
//*****************************************************************************
//
//! Enables individual UART interrupt sources.
//!
//! \param base is the base address of the UART port.
//! \param intFlags is the bit mask of the interrupt sources to be enabled.
//!
//! This function enables the indicated UART interrupt sources. Only the
//! sources that are enabled can be reflected to the processor interrupt
//! disabled sources have no effect on the processor.
//!
//! The \e intFlags parameter is the logical OR of any of the following:
//!
//! - \b UART_INT_DMATX - Transmit DMA interrupt
//! - \b UART_INT_DMARX - Receive DMA interrupt
//! - \b UART_INT_9BIT - 9-bit Address Match interrupt
//! - \b UART_INT_EOT - End of Transmission interrupt
//! - \b UART_INT_OE - Overrun Error interrupt
//! - \b UART_INT_BE - Break Error interrupt
//! - \b UART_INT_PE - Parity Error interrupt
//! - \b UART_INT_FE - Framing Error interrupt
//! - \b UART_INT_RT - Receive Timeout interrupt
//! - \b UART_INT_TX - Transmit interrupt
//! - \b UART_INT_RX - Receive interrupt
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_enableInterrupt(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Enable the specified interrupts.
//
HWREG(base + UART_O_IM) |= intFlags;
}
//*****************************************************************************
//
//! Disables individual UART interrupt sources.
//!
//! \param base is the base address of the UART port.
//! \param intFlags is the bit mask of the interrupt sources to be
//! disabled.
//!
//! This function disables the indicated UART interrupt sources. Only the
//! sources that are enabled can be reflected to the processor interrupt
//! disabled sources have no effect on the processor.
//!
//! The \e intFlags parameter has the same definition as the
//! \e intFlags parameter to UART_enableInterrupt().
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_disableInterrupt(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Disable the specified interrupts.
//
HWREG(base + UART_O_IM) &= ~(intFlags);
}
//*****************************************************************************
//
//! Gets the current interrupt status.
//!
//! \param base is the base address of the UART port.
//! \param masked of type Uart_IntType is UART_RAW_INT
//! if the raw interrupt status is requested and UART_MASKED_INT
//! if the masked interrupt status is requested.
//!
//! This function returns the interrupt status for the specified UART. Either
//! the raw interrupt status or the status of interrupts that are allowed to
//! reflect to the processor can be returned.
//!
//! \return Returns the current interrupt status, enumerated as a bit field of
//! values described in UART_enableInterrupt().
//
//*****************************************************************************
static inline uint32_t
UART_getInterruptStatus(uint32_t base, Uart_IntType masked)
{
uint32_t ret;
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Return either the interrupt status or the raw interrupt status as
// requested.
//
if(masked)
{
ret = HWREG(base + UART_O_MIS);
}
else
{
ret = HWREG(base + UART_O_RIS);
}
return(ret);
}
//*****************************************************************************
//
//! Clears UART interrupt sources.
//!
//! \param base is the base address of the UART port.
//! \param intFlags is a bit mask of the interrupt sources to be cleared.
//!
//! The specified UART interrupt sources are cleared, so that they no longer
//! assert. This function must be called in the interrupt handler to keep the
//! interrupt from being triggered again immediately upon exit.
//!
//! The \e intFlags parameter has the same definition as the
//! \e intFlags parameter to UART_enableInterrupt().
//!
//! \note Because there is a write buffer in the Cortex-M processor, it may
//! take several clock cycles before the interrupt source is actually cleared.
//! Therefore, it is recommended that the interrupt source be cleared early in
//! the interrupt handler(as opposed to the very last action)to astatic inline
//! void returning from the interrupt handler before the interrupt source is
//! actually cleared. Failure to do so may result in the interrupt handler
//! being immediately reentered (because the interrupt controller still sees
//! the interrupt source asserted).
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_clearInterruptStatus(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Clear the requested interrupt sources.
//
HWREG(base + UART_O_ICR) = intFlags;
}
//*****************************************************************************
//
//! Enable UART uDMA operation.
//!
//! \param base is the base address of the UART port.
//! \param dmaFlags is a bit mask of the uDMA features to enable.
//!
//! The specified UART uDMA features are enabled. The UART can be
//! configured to use uDMA for transmit or receive and to disable
//! receive if an error occurs. The \e dmaFlags parameter is the
//! logical OR of any of the following values:
//!
//! - \b UART_DMA_RX - enable uDMA for receive
//! - \b UART_DMA_TX - enable uDMA for transmit
//! - \b UART_DMA_ERR_RXSTOP - disable uDMA receive on UART error
//!
//! \note The uDMA controller must also be set up before DMA can be used
//! with the UART.
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_enableDMA(uint32_t base, uint32_t dmaFlags)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Set the requested bits in the UART uDMA control register.
//
HWREG(base + UART_O_DMACTL) |= dmaFlags;
}
//*****************************************************************************
//
//! Disable UART uDMA operation.
//!
//! \param base is the base address of the UART port.
//! \param dmaFlags is a bit mask of the uDMA features to disable.
//!
//! This function is used to disable UART uDMA features that were enabled
//! by UART_enableDMA(). The specified UART uDMA features are disabled. The
//! \e dmaFlags parameter is the logical OR of any of the following values:
//!
//! - \b UART_DMA_RX - disable uDMA for receive
//! - \b UART_DMA_TX - disable uDMA for transmit
//! - \b UART_DMA_ERR_RXSTOP - do not disable uDMA receive on UART error
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_disableDMA(uint32_t base, uint32_t dmaFlags)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Clear the requested bits in the UART uDMA control register.
//
HWREG(base + UART_O_DMACTL) &= ~dmaFlags;
}
//*****************************************************************************
//
//! Gets current receiver errors.
//!
//! \param base is the base address of the UART port.
//!
//! This function returns the current state of each of the 4 receiver error
//! sources. The returned errors are equivalent to the four error bits
//! returned via the previous call to UART_readChar() or
//! UART_readCharNonBlocking() with the exception that the overrun error is
//! set immediately when the overrun occurs rather than when a character is
//! next read.
//!
//! \return Returns a logical OR combination of the receiver error flags,
//! \b UART_RXERROR_FRAMING, \b UART_RXERROR_PARITY,
//! \b UART_RXERROR_BREAK and \b UART_RXERROR_OVERRUN.
//
//*****************************************************************************
static inline uint32_t
UART_getRxError(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Return the current value of the receive status register.
//
return(HWREG(base + UART_O_RSR) & UART_RSR_ALL_M);
}
//*****************************************************************************
//
//! Clears all reported receiver errors.
//!
//! \param base is the base address of the UART port.
//!
//! This function is used to clear all receiver error conditions reported via
//! UART_getRxError(). If using the overrun, framing error, parity error or
//! break interrupts, this function must be called after clearing the interrupt
//! to ensure that later errors of the same type trigger another interrupt.
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_clearRxError(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Any write to the Error Clear Register clears all bits which are
// currently set.
//
HWREG(base + UART_O_ECR) &= ~UART_RSR_ALL_M;
}
//*****************************************************************************
//
//! Enables 9-bit mode on the specified UART.
//!
//! \param base is the base address of the UART port.
//!
//! This function enables the 9-bit operational mode of the UART.
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_enable9Bit(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Enable 9-bit mode.
//
HWREG(base + UART_O_9BITADDR) |= UART_9BITADDR_9BITEN;
}
//*****************************************************************************
//
//! Disables 9-bit mode on the specified UART.
//!
//! \param base is the base address of the UART port.
//!
//! This function disables the 9-bit operational mode of the UART.
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_disable9Bit(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Disable 9-bit mode.
//
HWREG(base + UART_O_9BITADDR) &= ~UART_9BITADDR_9BITEN;
}
//*****************************************************************************
//
//! Sets the device address(es) for 9-bit mode.
//!
//! \param base is the base address of the UART port.
//! \param addr is the device address.
//! \param mask is the device address mask.
//!
//! This function configures the device address or range of device addresses
//! that respond to requests on the 9-bit UART port. The received address is
//! masked with the mask and then compared against the given address, allowing
//! either a single address (if \b mask is 0xff) or a set of addresses to be
//! matched.
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_set9BitAddress(uint32_t base, uint8_t addr,
uint8_t mask)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Set the address and mask.
//
HWREG(base + UART_O_9BITADDR) = addr << UART_9BITADDR_ADDR_S;
HWREG(base + UART_O_9BITAMASK) = mask << UART_9BITAMASK_MASK_S;
}
//*****************************************************************************
//
//! Sets the SIR (IrDA) Low Power Divisor.
//!
//! \param base is the base address of the UART port.
//! \param uartClk is the rate of the clock supplied to the UART module.
//! It should be provided as UART_CLK_FREQ using the updated clk rate.
//! This clock is same as the CM4 CPU Clock frequency.
//!
//!
//! This function configures the SIR (IrDA) Low power divisor. This
//! function is used only if the SIR ( IrDA ) is to be used in Low Power
//! mode which is indicated as part of the UART_enableSIR().
//!
//! \return None.
//
//*****************************************************************************
static inline void
UART_setIrDALPDivisor(uint32_t base, uint32_t uartClk)
{
uint32_t divider;
//
// Compute the IrDA Low Power divisor.
//
divider = uartClk / UART_CLK_IRLPBAUD16;
//
// Set the IrDA Low Power divisor.
//
HWREG(base + UART_O_ILPR) = divider;
}
//*****************************************************************************
//
//! Enables internal loopback mode for an UART port.
//!
//! \param base is the base address of the UART module.
//!
//! This function configures an UART port in internal loopback mode to help
//! with diagnostics and debug.In this mode, the UART Tx path is fed through
//! the UARTRx path. This allows data to be transferred between the TX and RX
//! of the same UART port, without having to go through I/O's.UART_writeChar()
//! & UART_writeCharNonBlocking() can be used along with this function.
//!
//! \return None.
//
//*****************************************************************************
static inline void UART_enableLoopback(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// Write the loopback enable bit to the register.
//
HWREG(base + UART_O_CTL) |= UART_CTL_LBE;
}
//*****************************************************************************
//
//! Disables internal loopback mode for an UART port.
//!
//! \param base is the base address of the UART module.
//!
//! This function disables internal loopback mode in an UART port.
//! In this mode, the UARTTx path is not fed through the
//! UARTRx path. This prevents data to be transferred between the TX and RX
//! of the same UART port, without having to go through I/O's.
//!
//! \return None.
//
//*****************************************************************************
static inline void UART_disableLoopback(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(UART_isBaseValid(base));
//
// clears the loopback enable bit of the register.
//
HWREG(base + UART_O_CTL) &= ~UART_CTL_LBE;
}
//*****************************************************************************
//
//! Sends an address character from the specified port when operating in 9-bit
//! mode.
//!
//! \param base is the base address of the UART port.
//! \param addr is the address to be transmitted.
//!
//! This function waits until all data has been sent from the specified port
//! and then sends the given address as an address byte. It then waits until
//! the address byte has been transmitted before returning.
//!
//! \return None.
//
//*****************************************************************************
extern void UART_send9BitAddress(uint32_t base, uint8_t addr);
//*****************************************************************************
//
//! Exits the 9-bit data transmission mode for the specified port.
//!
//! \param base is the base address of the UART port.
//! \param lcrh is the address/data setting needed to restore the normal
//! transmission mode after the full 9-bit data transmission.
//!
//! This function waits until all data has been sent from the specified port
//! and then restores the settings for the normal transmission mode.
//!
//! \return None.
//
//*****************************************************************************
extern void UART_stop9BitDataMode(uint32_t base, uint32_t lcrh);
//*****************************************************************************
//
//! Configures the specified port to operate in 9-bit data mode.
//!
//! \param base is the base address of the UART port.
//!
//! This function waits until all data has been sent from the specified port
//! and then configures to send 9-bit data.
//!
//! \note The 9-bit data is sent after the UART_send9BitAddress() is complete.
//! The data transmission is left to the user to handle outside this API.
//! This can be done using UART_writeChar() or UART_writeCharNonBlocking().
//!
//! \return Returns the address/data setting needed to restore the normal
//! transmission mode after the full 9-bit data transmission.
//
//*****************************************************************************
extern uint32_t UART_configure9BitDataMode(uint32_t base);
//*****************************************************************************
//
//! Sets the configuration of a UART.
//!
//! \param base is the base address of the UART port.
//! \param uartClk is the rate of the clock supplied to the UART module.
//! It should be provided as UART_CLK_FREQ using the updated clk rate
//! This clock is same as the CM4 CPU Clock frequency.
//!
//! \param baud is the desired baud rate.
//! \param config is the data format for the port (number of data bits,
//! number of stop bits, and parity).
//!
//! This function configures the UART for operation in the specified data
//! format. The baud rate is provided in the \e baud parameter and the
//! data format in the \e config parameter.
//!
//! The \e config parameter is the logical OR of three values: the number
//! of data bits, the number of stop bits, and the parity.
//! \b UART_CONFIG_WLEN_8, \b UART_CONFIG_WLEN_7,
//! \b UART_CONFIG_WLEN_6, and \b UART_CONFIG_WLEN_5 select from eight
//! to five data bits per byte (respectively). \b UART_CONFIG_STOP_ONE
//! and \b UART_CONFIG_STOP_TWO select one or two stop bits (respectively).
//! \b UART_CONFIG_PAR_NONE \b UART_CONFIG_PAR_EVEN,
//! \b UART_CONFIG_PAR_ODD, \b UART_CONFIG_PAR_ONE,
//! and \b UART_CONFIG_PAR_ZERO select the parity mode (no parity bit, even
//! parity bit, odd parity bit, parity bit always one, and parity bit always
//! zero, respectively).
//!
//! \return None.
//
//*****************************************************************************
extern void UART_setConfig(uint32_t base, uint32_t uartClk,
uint32_t baud, uint32_t config);
//*****************************************************************************
//
//! Gets the current configuration of a UART.
//!
//! \param base is the base address of the UART port.
//! \param uartClk is the rate of the clock supplied to the UART module.
//! It should be provided as UART_CLK_FREQ using the updated clk rate
//! This clock is same as the CM4 CPU Clock frequency.
//!
//! \param baud is the desired baud rate.
//! \param baud is a pointer to storage for the baud rate.
//! \param config is a pointer to storage for the data format.
//!
//! This function determines the baud rate and data format for the UART, given
//! an explicitly provided peripheral clock. The
//! returned baud rate is the actual baud rate; it may not be the exact baud
//! rate requested or an ``official'' baud rate. The data format returned in
//! \e config is enumerated the same as the \e config parameter of
//! UART_setConfig().
//!
//! \return None.
//
//*****************************************************************************
extern void UART_getConfig(uint32_t base, uint32_t uartClk,
uint32_t *baud, uint32_t *config);
//*****************************************************************************
//
//! Sends a character to the specified port.
//!
//! \param base is the base address of the UART port.
//! \param data is the character to be transmitted.
//!
//! This function writes the character \e data to the transmit FIFO for the
//! specified port. This function does not block, so if there is no space
//! available, then a \b false is returned and the application must retry the
//! function later.
//!
//! \return Returns \b true if the character was successfully placed in the
//! transmit FIFO or \b false if there was no space available in the transmit
//! FIFO.
//
//*****************************************************************************
extern bool UART_writeCharNonBlocking(uint32_t base, uint8_t data);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
#ifdef __cplusplus
}
#endif
#endif // UART_H