SilentSensors / mbed-dev

Fork of mbed-dev by mbed official

Committer:
AnnaBridge
Date:
Thu Aug 31 17:27:04 2017 +0100
Revision:
172:7d866c31b3c5
This updates the lib to the mbed lib v 150

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 172:7d866c31b3c5 1 /**************************************************************************//**
AnnaBridge 172:7d866c31b3c5 2 * @file uart.c
AnnaBridge 172:7d866c31b3c5 3 * @version V3.00
AnnaBridge 172:7d866c31b3c5 4 * @brief M480 series UART driver source file
AnnaBridge 172:7d866c31b3c5 5 *
AnnaBridge 172:7d866c31b3c5 6 * @copyright (C) 2016 Nuvoton Technology Corp. All rights reserved.
AnnaBridge 172:7d866c31b3c5 7 *****************************************************************************/
AnnaBridge 172:7d866c31b3c5 8
AnnaBridge 172:7d866c31b3c5 9 #include <stdio.h>
AnnaBridge 172:7d866c31b3c5 10 #include "M480.h"
AnnaBridge 172:7d866c31b3c5 11
AnnaBridge 172:7d866c31b3c5 12 /** @addtogroup M480_Device_Driver M480 Device Driver
AnnaBridge 172:7d866c31b3c5 13 @{
AnnaBridge 172:7d866c31b3c5 14 */
AnnaBridge 172:7d866c31b3c5 15
AnnaBridge 172:7d866c31b3c5 16 /** @addtogroup M480_UART_Driver UART Driver
AnnaBridge 172:7d866c31b3c5 17 @{
AnnaBridge 172:7d866c31b3c5 18 */
AnnaBridge 172:7d866c31b3c5 19
AnnaBridge 172:7d866c31b3c5 20 /** @addtogroup M480_UART_EXPORTED_FUNCTIONS UART Exported Functions
AnnaBridge 172:7d866c31b3c5 21 @{
AnnaBridge 172:7d866c31b3c5 22 */
AnnaBridge 172:7d866c31b3c5 23
AnnaBridge 172:7d866c31b3c5 24 /**
AnnaBridge 172:7d866c31b3c5 25 * @brief Clear UART specified interrupt flag
AnnaBridge 172:7d866c31b3c5 26 *
AnnaBridge 172:7d866c31b3c5 27 * @param[in] uart The pointer of the specified UART module.
AnnaBridge 172:7d866c31b3c5 28 * @param[in] u32InterruptFlag The specified interrupt of UART module.
AnnaBridge 172:7d866c31b3c5 29 * - \ref UART_INTSTS_LININT_Msk : LIN bus interrupt
AnnaBridge 172:7d866c31b3c5 30 * - \ref UART_INTEN_WKIEN_Msk : Wake-up interrupt
AnnaBridge 172:7d866c31b3c5 31 * - \ref UART_INTSTS_BUFERRINT_Msk : Buffer Error interrupt
AnnaBridge 172:7d866c31b3c5 32 * - \ref UART_INTSTS_MODEMINT_Msk : Modem Status interrupt
AnnaBridge 172:7d866c31b3c5 33 * - \ref UART_INTSTS_RLSINT_Msk : Receive Line Status interrupt
AnnaBridge 172:7d866c31b3c5 34 *
AnnaBridge 172:7d866c31b3c5 35 * @return None
AnnaBridge 172:7d866c31b3c5 36 *
AnnaBridge 172:7d866c31b3c5 37 * @details The function is used to clear UART specified interrupt flag.
AnnaBridge 172:7d866c31b3c5 38 */
AnnaBridge 172:7d866c31b3c5 39
AnnaBridge 172:7d866c31b3c5 40 void UART_ClearIntFlag(UART_T* uart , uint32_t u32InterruptFlag)
AnnaBridge 172:7d866c31b3c5 41 {
AnnaBridge 172:7d866c31b3c5 42
AnnaBridge 172:7d866c31b3c5 43 if(u32InterruptFlag & UART_INTSTS_RLSINT_Msk) { /* Clear Receive Line Status Interrupt */
AnnaBridge 172:7d866c31b3c5 44 uart->FIFOSTS = UART_FIFOSTS_BIF_Msk | UART_FIFOSTS_FEF_Msk | UART_FIFOSTS_FEF_Msk;
AnnaBridge 172:7d866c31b3c5 45 uart->FIFOSTS = UART_FIFOSTS_ADDRDETF_Msk;
AnnaBridge 172:7d866c31b3c5 46 }
AnnaBridge 172:7d866c31b3c5 47
AnnaBridge 172:7d866c31b3c5 48 if(u32InterruptFlag & UART_INTSTS_MODEMINT_Msk) { /* Clear Modem Status Interrupt */
AnnaBridge 172:7d866c31b3c5 49 uart->MODEMSTS |= UART_MODEMSTS_CTSDETF_Msk;
AnnaBridge 172:7d866c31b3c5 50 } else {
AnnaBridge 172:7d866c31b3c5 51 }
AnnaBridge 172:7d866c31b3c5 52
AnnaBridge 172:7d866c31b3c5 53 if(u32InterruptFlag & UART_INTSTS_BUFERRINT_Msk) { /* Clear Buffer Error Interrupt */
AnnaBridge 172:7d866c31b3c5 54 uart->FIFOSTS = UART_FIFOSTS_RXOVIF_Msk | UART_FIFOSTS_TXOVIF_Msk;
AnnaBridge 172:7d866c31b3c5 55 }
AnnaBridge 172:7d866c31b3c5 56
AnnaBridge 172:7d866c31b3c5 57 if(u32InterruptFlag & UART_INTSTS_WKINT_Msk) { /* Clear Wake-up Interrupt */
AnnaBridge 172:7d866c31b3c5 58 uart->WKSTS = UART_WKSTS_CTSWKF_Msk | UART_WKSTS_DATWKF_Msk |
AnnaBridge 172:7d866c31b3c5 59 UART_WKSTS_RFRTWKF_Msk |UART_WKSTS_RS485WKF_Msk |
AnnaBridge 172:7d866c31b3c5 60 UART_WKSTS_TOUTWKF_Msk;
AnnaBridge 172:7d866c31b3c5 61 }
AnnaBridge 172:7d866c31b3c5 62
AnnaBridge 172:7d866c31b3c5 63 if(u32InterruptFlag & UART_INTSTS_LININT_Msk) { /* Clear LIN Bus Interrupt */
AnnaBridge 172:7d866c31b3c5 64 uart->INTSTS = UART_INTSTS_LINIF_Msk;
AnnaBridge 172:7d866c31b3c5 65 uart->LINSTS = UART_LINSTS_BITEF_Msk | UART_LINSTS_BRKDETF_Msk |
AnnaBridge 172:7d866c31b3c5 66 UART_LINSTS_SLVSYNCF_Msk | UART_LINSTS_SLVIDPEF_Msk |
AnnaBridge 172:7d866c31b3c5 67 UART_LINSTS_SLVHEF_Msk | UART_LINSTS_SLVHDETF_Msk ;
AnnaBridge 172:7d866c31b3c5 68 }
AnnaBridge 172:7d866c31b3c5 69 }
AnnaBridge 172:7d866c31b3c5 70
AnnaBridge 172:7d866c31b3c5 71
AnnaBridge 172:7d866c31b3c5 72 /**
AnnaBridge 172:7d866c31b3c5 73 * @brief Disable UART interrupt
AnnaBridge 172:7d866c31b3c5 74 *
AnnaBridge 172:7d866c31b3c5 75 * @param[in] uart The pointer of the specified UART module.
AnnaBridge 172:7d866c31b3c5 76 *
AnnaBridge 172:7d866c31b3c5 77 * @return None
AnnaBridge 172:7d866c31b3c5 78 *
AnnaBridge 172:7d866c31b3c5 79 * @details The function is used to disable UART interrupt.
AnnaBridge 172:7d866c31b3c5 80 */
AnnaBridge 172:7d866c31b3c5 81 void UART_Close(UART_T* uart)
AnnaBridge 172:7d866c31b3c5 82 {
AnnaBridge 172:7d866c31b3c5 83 uart->INTEN = 0ul;
AnnaBridge 172:7d866c31b3c5 84 }
AnnaBridge 172:7d866c31b3c5 85
AnnaBridge 172:7d866c31b3c5 86
AnnaBridge 172:7d866c31b3c5 87 /**
AnnaBridge 172:7d866c31b3c5 88 * @brief Disable UART auto flow control function
AnnaBridge 172:7d866c31b3c5 89 *
AnnaBridge 172:7d866c31b3c5 90 * @param[in] uart The pointer of the specified UART module.
AnnaBridge 172:7d866c31b3c5 91 *
AnnaBridge 172:7d866c31b3c5 92 * @return None
AnnaBridge 172:7d866c31b3c5 93 *
AnnaBridge 172:7d866c31b3c5 94 * @details The function is used to disable UART auto flow control.
AnnaBridge 172:7d866c31b3c5 95 */
AnnaBridge 172:7d866c31b3c5 96 void UART_DisableFlowCtrl(UART_T* uart)
AnnaBridge 172:7d866c31b3c5 97 {
AnnaBridge 172:7d866c31b3c5 98 uart->INTEN &= ~(UART_INTEN_ATORTSEN_Msk | UART_INTEN_ATOCTSEN_Msk);
AnnaBridge 172:7d866c31b3c5 99 }
AnnaBridge 172:7d866c31b3c5 100
AnnaBridge 172:7d866c31b3c5 101
AnnaBridge 172:7d866c31b3c5 102 /**
AnnaBridge 172:7d866c31b3c5 103 * @brief Disable UART specified interrupt
AnnaBridge 172:7d866c31b3c5 104 *
AnnaBridge 172:7d866c31b3c5 105 * @param[in] uart The pointer of the specified UART module.
AnnaBridge 172:7d866c31b3c5 106 * @param[in] u32InterruptFlag The specified interrupt of UART module.
AnnaBridge 172:7d866c31b3c5 107 * - \ref UART_INTEN_WKIEN_Msk : Wake-up interrupt
AnnaBridge 172:7d866c31b3c5 108 * - \ref UART_INTEN_LINIEN_Msk : Lin bus interrupt
AnnaBridge 172:7d866c31b3c5 109 * - \ref UART_INTEN_BUFERRIEN_Msk : Buffer Error interrupt
AnnaBridge 172:7d866c31b3c5 110 * - \ref UART_INTEN_RXTOIEN_Msk : Rx time-out interrupt
AnnaBridge 172:7d866c31b3c5 111 * - \ref UART_INTEN_MODEMIEN_Msk : Modem status interrupt
AnnaBridge 172:7d866c31b3c5 112 * - \ref UART_INTEN_RLSIEN_Msk : Receive Line status interrupt
AnnaBridge 172:7d866c31b3c5 113 * - \ref UART_INTEN_THREIEN_Msk : Tx empty interrupt
AnnaBridge 172:7d866c31b3c5 114 * - \ref UART_INTEN_RDAIEN_Msk : Rx ready interrupt *
AnnaBridge 172:7d866c31b3c5 115 *
AnnaBridge 172:7d866c31b3c5 116 * @return None
AnnaBridge 172:7d866c31b3c5 117 *
AnnaBridge 172:7d866c31b3c5 118 * @details The function is used to disable UART specified interrupt and disable NVIC UART IRQ.
AnnaBridge 172:7d866c31b3c5 119 */
AnnaBridge 172:7d866c31b3c5 120 void UART_DisableInt(UART_T* uart, uint32_t u32InterruptFlag)
AnnaBridge 172:7d866c31b3c5 121 {
AnnaBridge 172:7d866c31b3c5 122 /* Disable UART specified interrupt */
AnnaBridge 172:7d866c31b3c5 123 UART_DISABLE_INT(uart, u32InterruptFlag);
AnnaBridge 172:7d866c31b3c5 124 }
AnnaBridge 172:7d866c31b3c5 125
AnnaBridge 172:7d866c31b3c5 126
AnnaBridge 172:7d866c31b3c5 127 /**
AnnaBridge 172:7d866c31b3c5 128 * @brief Enable UART auto flow control function
AnnaBridge 172:7d866c31b3c5 129 *
AnnaBridge 172:7d866c31b3c5 130 * @param[in] uart The pointer of the specified UART module.
AnnaBridge 172:7d866c31b3c5 131 *
AnnaBridge 172:7d866c31b3c5 132 * @return None
AnnaBridge 172:7d866c31b3c5 133 *
AnnaBridge 172:7d866c31b3c5 134 * @details The function is used to Enable UART auto flow control.
AnnaBridge 172:7d866c31b3c5 135 */
AnnaBridge 172:7d866c31b3c5 136 void UART_EnableFlowCtrl(UART_T* uart)
AnnaBridge 172:7d866c31b3c5 137 {
AnnaBridge 172:7d866c31b3c5 138 /* Set RTS pin output is low level active */
AnnaBridge 172:7d866c31b3c5 139 uart->MODEM |= UART_MODEM_RTSACTLV_Msk;
AnnaBridge 172:7d866c31b3c5 140
AnnaBridge 172:7d866c31b3c5 141 /* Set CTS pin input is low level active */
AnnaBridge 172:7d866c31b3c5 142 uart->MODEMSTS |= UART_MODEMSTS_CTSACTLV_Msk;
AnnaBridge 172:7d866c31b3c5 143
AnnaBridge 172:7d866c31b3c5 144 /* Set RTS and CTS auto flow control enable */
AnnaBridge 172:7d866c31b3c5 145 uart->INTEN |= UART_INTEN_ATORTSEN_Msk | UART_INTEN_ATOCTSEN_Msk;
AnnaBridge 172:7d866c31b3c5 146 }
AnnaBridge 172:7d866c31b3c5 147
AnnaBridge 172:7d866c31b3c5 148
AnnaBridge 172:7d866c31b3c5 149 /**
AnnaBridge 172:7d866c31b3c5 150 * @brief The function is used to enable UART specified interrupt and enable NVIC UART IRQ.
AnnaBridge 172:7d866c31b3c5 151 *
AnnaBridge 172:7d866c31b3c5 152 * @param[in] uart The pointer of the specified UART module.
AnnaBridge 172:7d866c31b3c5 153 * @param[in] u32InterruptFlag The specified interrupt of UART module:
AnnaBridge 172:7d866c31b3c5 154 * - \ref UART_INTEN_WKIEN_Msk : Wake-up interrupt
AnnaBridge 172:7d866c31b3c5 155 * - \ref UART_INTEN_LINIEN_Msk : Lin bus interrupt
AnnaBridge 172:7d866c31b3c5 156 * - \ref UART_INTEN_BUFERRIEN_Msk : Buffer Error interrupt
AnnaBridge 172:7d866c31b3c5 157 * - \ref UART_INTEN_RXTOIEN_Msk : Rx time-out interrupt
AnnaBridge 172:7d866c31b3c5 158 * - \ref UART_INTEN_MODEMIEN_Msk : Modem status interrupt
AnnaBridge 172:7d866c31b3c5 159 * - \ref UART_INTEN_RLSIEN_Msk : Receive Line status interrupt
AnnaBridge 172:7d866c31b3c5 160 * - \ref UART_INTEN_THREIEN_Msk : Tx empty interrupt
AnnaBridge 172:7d866c31b3c5 161 * - \ref UART_INTEN_RDAIEN_Msk : Rx ready interrupt *
AnnaBridge 172:7d866c31b3c5 162 *
AnnaBridge 172:7d866c31b3c5 163 * @return None
AnnaBridge 172:7d866c31b3c5 164 *
AnnaBridge 172:7d866c31b3c5 165 * @details The function is used to enable UART specified interrupt and enable NVIC UART IRQ.
AnnaBridge 172:7d866c31b3c5 166 */
AnnaBridge 172:7d866c31b3c5 167 void UART_EnableInt(UART_T* uart, uint32_t u32InterruptFlag)
AnnaBridge 172:7d866c31b3c5 168 {
AnnaBridge 172:7d866c31b3c5 169 /* Enable UART specified interrupt */
AnnaBridge 172:7d866c31b3c5 170 UART_ENABLE_INT(uart, u32InterruptFlag);
AnnaBridge 172:7d866c31b3c5 171 }
AnnaBridge 172:7d866c31b3c5 172
AnnaBridge 172:7d866c31b3c5 173
AnnaBridge 172:7d866c31b3c5 174 /**
AnnaBridge 172:7d866c31b3c5 175 * @brief Open and set UART function
AnnaBridge 172:7d866c31b3c5 176 *
AnnaBridge 172:7d866c31b3c5 177 * @param[in] uart The pointer of the specified UART module.
AnnaBridge 172:7d866c31b3c5 178 * @param[in] u32baudrate The baudrate of UART module.
AnnaBridge 172:7d866c31b3c5 179 *
AnnaBridge 172:7d866c31b3c5 180 * @return None
AnnaBridge 172:7d866c31b3c5 181 *
AnnaBridge 172:7d866c31b3c5 182 * @details This function use to enable UART function and set baud-rate.
AnnaBridge 172:7d866c31b3c5 183 */
AnnaBridge 172:7d866c31b3c5 184 void UART_Open(UART_T* uart, uint32_t u32baudrate)
AnnaBridge 172:7d866c31b3c5 185 {
AnnaBridge 172:7d866c31b3c5 186 uint32_t u32UartClkSrcSel=0ul, u32UartClkDivNum=0ul;
AnnaBridge 172:7d866c31b3c5 187 uint32_t u32ClkTbl[4] = {__HXT, 0ul, __LXT, __HIRC};
AnnaBridge 172:7d866c31b3c5 188 uint32_t u32Baud_Div = 0ul;
AnnaBridge 172:7d866c31b3c5 189
AnnaBridge 172:7d866c31b3c5 190
AnnaBridge 172:7d866c31b3c5 191 if(uart==(UART_T*)UART0) {
AnnaBridge 172:7d866c31b3c5 192 /* Get UART clock source selection */
AnnaBridge 172:7d866c31b3c5 193 u32UartClkSrcSel = ((uint32_t)(CLK->CLKSEL1 & CLK_CLKSEL1_UART0SEL_Msk)) >> CLK_CLKSEL1_UART0SEL_Pos;
AnnaBridge 172:7d866c31b3c5 194 /* Get UART clock divider number */
AnnaBridge 172:7d866c31b3c5 195 u32UartClkDivNum = (CLK->CLKDIV0 & CLK_CLKDIV0_UART0DIV_Msk) >> CLK_CLKDIV0_UART0DIV_Pos;
AnnaBridge 172:7d866c31b3c5 196 } else if(uart==(UART_T*)UART1) {
AnnaBridge 172:7d866c31b3c5 197 /* Get UART clock source selection */
AnnaBridge 172:7d866c31b3c5 198 u32UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UART1SEL_Msk) >> CLK_CLKSEL1_UART1SEL_Pos;
AnnaBridge 172:7d866c31b3c5 199 /* Get UART clock divider number */
AnnaBridge 172:7d866c31b3c5 200 u32UartClkDivNum = (CLK->CLKDIV0 & CLK_CLKDIV0_UART1DIV_Msk) >> CLK_CLKDIV0_UART1DIV_Pos;
AnnaBridge 172:7d866c31b3c5 201 } else if(uart==(UART_T*)UART2) {
AnnaBridge 172:7d866c31b3c5 202 /* Get UART clock source selection */
AnnaBridge 172:7d866c31b3c5 203 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART2SEL_Msk) >> CLK_CLKSEL3_UART2SEL_Pos;
AnnaBridge 172:7d866c31b3c5 204 /* Get UART clock divider number */
AnnaBridge 172:7d866c31b3c5 205 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART2DIV_Msk) >> CLK_CLKDIV4_UART2DIV_Pos;
AnnaBridge 172:7d866c31b3c5 206 } else if(uart==(UART_T*)UART3) {
AnnaBridge 172:7d866c31b3c5 207 /* Get UART clock source selection */
AnnaBridge 172:7d866c31b3c5 208 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART3SEL_Msk) >> CLK_CLKSEL3_UART3SEL_Pos;
AnnaBridge 172:7d866c31b3c5 209 /* Get UART clock divider number */
AnnaBridge 172:7d866c31b3c5 210 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART3DIV_Msk) >> CLK_CLKDIV4_UART3DIV_Pos;
AnnaBridge 172:7d866c31b3c5 211 } else if(uart==(UART_T*)UART4) {
AnnaBridge 172:7d866c31b3c5 212 /* Get UART clock source selection */
AnnaBridge 172:7d866c31b3c5 213 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART4SEL_Msk) >> CLK_CLKSEL3_UART4SEL_Pos;
AnnaBridge 172:7d866c31b3c5 214 /* Get UART clock divider number */
AnnaBridge 172:7d866c31b3c5 215 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART4DIV_Msk) >> CLK_CLKDIV4_UART4DIV_Pos;
AnnaBridge 172:7d866c31b3c5 216 } else if(uart==(UART_T*)UART5) {
AnnaBridge 172:7d866c31b3c5 217 /* Get UART clock source selection */
AnnaBridge 172:7d866c31b3c5 218 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART5SEL_Msk) >> CLK_CLKSEL3_UART5SEL_Pos;
AnnaBridge 172:7d866c31b3c5 219 /* Get UART clock divider number */
AnnaBridge 172:7d866c31b3c5 220 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART5DIV_Msk) >> CLK_CLKDIV4_UART5DIV_Pos;
AnnaBridge 172:7d866c31b3c5 221 }
AnnaBridge 172:7d866c31b3c5 222
AnnaBridge 172:7d866c31b3c5 223 /* Select UART function */
AnnaBridge 172:7d866c31b3c5 224 uart->FUNCSEL = UART_FUNCSEL_UART;
AnnaBridge 172:7d866c31b3c5 225
AnnaBridge 172:7d866c31b3c5 226 /* Set UART line configuration */
AnnaBridge 172:7d866c31b3c5 227 uart->LINE = UART_WORD_LEN_8 | UART_PARITY_NONE | UART_STOP_BIT_1;
AnnaBridge 172:7d866c31b3c5 228
AnnaBridge 172:7d866c31b3c5 229 /* Set UART Rx and RTS trigger level */
AnnaBridge 172:7d866c31b3c5 230 uart->FIFO &= ~(UART_FIFO_RFITL_Msk | UART_FIFO_RTSTRGLV_Msk);
AnnaBridge 172:7d866c31b3c5 231
AnnaBridge 172:7d866c31b3c5 232 /* Get PLL clock frequency if UART clock source selection is PLL */
AnnaBridge 172:7d866c31b3c5 233 if(u32UartClkSrcSel == 1ul) {
AnnaBridge 172:7d866c31b3c5 234 u32ClkTbl[u32UartClkSrcSel] = CLK_GetPLLClockFreq();
AnnaBridge 172:7d866c31b3c5 235 }
AnnaBridge 172:7d866c31b3c5 236
AnnaBridge 172:7d866c31b3c5 237 /* Set UART baud rate */
AnnaBridge 172:7d866c31b3c5 238 if(u32baudrate != 0ul) {
AnnaBridge 172:7d866c31b3c5 239 u32Baud_Div = UART_BAUD_MODE2_DIVIDER((u32ClkTbl[u32UartClkSrcSel]) / (u32UartClkDivNum + 1ul), u32baudrate);
AnnaBridge 172:7d866c31b3c5 240
AnnaBridge 172:7d866c31b3c5 241 if(u32Baud_Div > 0xFFFFul) {
AnnaBridge 172:7d866c31b3c5 242 uart->BAUD = (UART_BAUD_MODE0 | UART_BAUD_MODE0_DIVIDER((u32ClkTbl[u32UartClkSrcSel]) / (u32UartClkDivNum + 1ul), u32baudrate));
AnnaBridge 172:7d866c31b3c5 243 } else {
AnnaBridge 172:7d866c31b3c5 244 uart->BAUD = (UART_BAUD_MODE2 | u32Baud_Div);
AnnaBridge 172:7d866c31b3c5 245 }
AnnaBridge 172:7d866c31b3c5 246 }
AnnaBridge 172:7d866c31b3c5 247 }
AnnaBridge 172:7d866c31b3c5 248
AnnaBridge 172:7d866c31b3c5 249
AnnaBridge 172:7d866c31b3c5 250 /**
AnnaBridge 172:7d866c31b3c5 251 * @brief Read UART data
AnnaBridge 172:7d866c31b3c5 252 *
AnnaBridge 172:7d866c31b3c5 253 * @param[in] uart The pointer of the specified UART module.
AnnaBridge 172:7d866c31b3c5 254 * @param[in] pu8RxBuf The buffer to receive the data of receive FIFO.
AnnaBridge 172:7d866c31b3c5 255 * @param[in] u32ReadBytes The the read bytes number of data.
AnnaBridge 172:7d866c31b3c5 256 *
AnnaBridge 172:7d866c31b3c5 257 * @return u32Count Receive byte count
AnnaBridge 172:7d866c31b3c5 258 *
AnnaBridge 172:7d866c31b3c5 259 * @details The function is used to read Rx data from RX FIFO and the data will be stored in pu8RxBuf.
AnnaBridge 172:7d866c31b3c5 260 */
AnnaBridge 172:7d866c31b3c5 261 uint32_t UART_Read(UART_T* uart, uint8_t pu8RxBuf[], uint32_t u32ReadBytes)
AnnaBridge 172:7d866c31b3c5 262 {
AnnaBridge 172:7d866c31b3c5 263 uint32_t u32Count, u32delayno;
AnnaBridge 172:7d866c31b3c5 264 uint32_t u32Exit = 0ul;
AnnaBridge 172:7d866c31b3c5 265
AnnaBridge 172:7d866c31b3c5 266 for(u32Count = 0ul; u32Count < u32ReadBytes; u32Count++) {
AnnaBridge 172:7d866c31b3c5 267 u32delayno = 0ul;
AnnaBridge 172:7d866c31b3c5 268
AnnaBridge 172:7d866c31b3c5 269 while(uart->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) { /* Check RX empty => failed */
AnnaBridge 172:7d866c31b3c5 270 u32delayno++;
AnnaBridge 172:7d866c31b3c5 271 if(u32delayno >= 0x40000000ul) {
AnnaBridge 172:7d866c31b3c5 272 u32Exit = 1ul;
AnnaBridge 172:7d866c31b3c5 273 break;
AnnaBridge 172:7d866c31b3c5 274 } else {
AnnaBridge 172:7d866c31b3c5 275 }
AnnaBridge 172:7d866c31b3c5 276 }
AnnaBridge 172:7d866c31b3c5 277
AnnaBridge 172:7d866c31b3c5 278 if(u32Exit == 1ul) {
AnnaBridge 172:7d866c31b3c5 279 break;
AnnaBridge 172:7d866c31b3c5 280 } else {
AnnaBridge 172:7d866c31b3c5 281 pu8RxBuf[u32Count] = (uint8_t)uart->DAT; /* Get Data from UART RX */
AnnaBridge 172:7d866c31b3c5 282 }
AnnaBridge 172:7d866c31b3c5 283 }
AnnaBridge 172:7d866c31b3c5 284
AnnaBridge 172:7d866c31b3c5 285 return u32Count;
AnnaBridge 172:7d866c31b3c5 286
AnnaBridge 172:7d866c31b3c5 287 }
AnnaBridge 172:7d866c31b3c5 288
AnnaBridge 172:7d866c31b3c5 289
AnnaBridge 172:7d866c31b3c5 290 /**
AnnaBridge 172:7d866c31b3c5 291 * @brief Set UART line configuration
AnnaBridge 172:7d866c31b3c5 292 *
AnnaBridge 172:7d866c31b3c5 293 * @param[in] uart The pointer of the specified UART module.
AnnaBridge 172:7d866c31b3c5 294 * @param[in] u32baudrate The register value of baudrate of UART module.
AnnaBridge 172:7d866c31b3c5 295 * If u32baudrate = 0, UART baudrate will not change.
AnnaBridge 172:7d866c31b3c5 296 * @param[in] u32data_width The data length of UART module.
AnnaBridge 172:7d866c31b3c5 297 * - \ref UART_WORD_LEN_5
AnnaBridge 172:7d866c31b3c5 298 * - \ref UART_WORD_LEN_6
AnnaBridge 172:7d866c31b3c5 299 * - \ref UART_WORD_LEN_7
AnnaBridge 172:7d866c31b3c5 300 * - \ref UART_WORD_LEN_8
AnnaBridge 172:7d866c31b3c5 301 * @param[in] u32parity The parity setting (none/odd/even/mark/space) of UART module.
AnnaBridge 172:7d866c31b3c5 302 * - \ref UART_PARITY_NONE
AnnaBridge 172:7d866c31b3c5 303 * - \ref UART_PARITY_ODD
AnnaBridge 172:7d866c31b3c5 304 * - \ref UART_PARITY_EVEN
AnnaBridge 172:7d866c31b3c5 305 * - \ref UART_PARITY_MARK
AnnaBridge 172:7d866c31b3c5 306 * - \ref UART_PARITY_SPACE
AnnaBridge 172:7d866c31b3c5 307 * @param[in] u32stop_bits The stop bit length (1/1.5/2 bit) of UART module.
AnnaBridge 172:7d866c31b3c5 308 * - \ref UART_STOP_BIT_1
AnnaBridge 172:7d866c31b3c5 309 * - \ref UART_STOP_BIT_1_5
AnnaBridge 172:7d866c31b3c5 310 * - \ref UART_STOP_BIT_2
AnnaBridge 172:7d866c31b3c5 311 *
AnnaBridge 172:7d866c31b3c5 312 * @return None
AnnaBridge 172:7d866c31b3c5 313 *
AnnaBridge 172:7d866c31b3c5 314 * @details This function use to config UART line setting.
AnnaBridge 172:7d866c31b3c5 315 */
AnnaBridge 172:7d866c31b3c5 316 void UART_SetLine_Config(UART_T* uart, uint32_t u32baudrate, uint32_t u32data_width, uint32_t u32parity, uint32_t u32stop_bits)
AnnaBridge 172:7d866c31b3c5 317 {
AnnaBridge 172:7d866c31b3c5 318 uint32_t u32UartClkSrcSel=0ul, u32UartClkDivNum=0ul;
AnnaBridge 172:7d866c31b3c5 319 uint32_t u32ClkTbl[4ul] = {__HXT, 0ul, __LXT, __HIRC};
AnnaBridge 172:7d866c31b3c5 320 uint32_t u32Baud_Div = 0ul;
AnnaBridge 172:7d866c31b3c5 321
AnnaBridge 172:7d866c31b3c5 322
AnnaBridge 172:7d866c31b3c5 323 if(uart==(UART_T*)UART0) {
AnnaBridge 172:7d866c31b3c5 324 /* Get UART clock source selection */
AnnaBridge 172:7d866c31b3c5 325 u32UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UART0SEL_Msk) >> CLK_CLKSEL1_UART0SEL_Pos;
AnnaBridge 172:7d866c31b3c5 326 /* Get UART clock divider number */
AnnaBridge 172:7d866c31b3c5 327 u32UartClkDivNum = (CLK->CLKDIV0 & CLK_CLKDIV0_UART0DIV_Msk) >> CLK_CLKDIV0_UART0DIV_Pos;
AnnaBridge 172:7d866c31b3c5 328 } else if(uart==(UART_T*)UART1) {
AnnaBridge 172:7d866c31b3c5 329 /* Get UART clock source selection */
AnnaBridge 172:7d866c31b3c5 330 u32UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UART1SEL_Msk) >> CLK_CLKSEL1_UART1SEL_Pos;
AnnaBridge 172:7d866c31b3c5 331 /* Get UART clock divider number */
AnnaBridge 172:7d866c31b3c5 332 u32UartClkDivNum = (CLK->CLKDIV0 & CLK_CLKDIV0_UART1DIV_Msk) >> CLK_CLKDIV0_UART1DIV_Pos;
AnnaBridge 172:7d866c31b3c5 333 } else if(uart==(UART_T*)UART2) {
AnnaBridge 172:7d866c31b3c5 334 /* Get UART clock source selection */
AnnaBridge 172:7d866c31b3c5 335 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART2SEL_Msk) >> CLK_CLKSEL3_UART2SEL_Pos;
AnnaBridge 172:7d866c31b3c5 336 /* Get UART clock divider number */
AnnaBridge 172:7d866c31b3c5 337 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART2DIV_Msk) >> CLK_CLKDIV4_UART2DIV_Pos;
AnnaBridge 172:7d866c31b3c5 338 } else if(uart==(UART_T*)UART3) {
AnnaBridge 172:7d866c31b3c5 339 /* Get UART clock source selection */
AnnaBridge 172:7d866c31b3c5 340 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART3SEL_Msk) >> CLK_CLKSEL3_UART3SEL_Pos;
AnnaBridge 172:7d866c31b3c5 341 /* Get UART clock divider number */
AnnaBridge 172:7d866c31b3c5 342 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART3DIV_Msk) >> CLK_CLKDIV4_UART3DIV_Pos;
AnnaBridge 172:7d866c31b3c5 343 } else if(uart==(UART_T*)UART4) {
AnnaBridge 172:7d866c31b3c5 344 /* Get UART clock source selection */
AnnaBridge 172:7d866c31b3c5 345 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART4SEL_Msk) >> CLK_CLKSEL3_UART4SEL_Pos;
AnnaBridge 172:7d866c31b3c5 346 /* Get UART clock divider number */
AnnaBridge 172:7d866c31b3c5 347 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART4DIV_Msk) >> CLK_CLKDIV4_UART4DIV_Pos;
AnnaBridge 172:7d866c31b3c5 348 } else if(uart==(UART_T*)UART5) {
AnnaBridge 172:7d866c31b3c5 349 /* Get UART clock source selection */
AnnaBridge 172:7d866c31b3c5 350 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART5SEL_Msk) >> CLK_CLKSEL3_UART5SEL_Pos;
AnnaBridge 172:7d866c31b3c5 351 /* Get UART clock divider number */
AnnaBridge 172:7d866c31b3c5 352 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART5DIV_Msk) >> CLK_CLKDIV4_UART5DIV_Pos;
AnnaBridge 172:7d866c31b3c5 353 }
AnnaBridge 172:7d866c31b3c5 354
AnnaBridge 172:7d866c31b3c5 355 /* Get PLL clock frequency if UART clock source selection is PLL */
AnnaBridge 172:7d866c31b3c5 356 if(u32UartClkSrcSel == 1ul) {
AnnaBridge 172:7d866c31b3c5 357 u32ClkTbl[u32UartClkSrcSel] = CLK_GetPLLClockFreq();
AnnaBridge 172:7d866c31b3c5 358 } else {
AnnaBridge 172:7d866c31b3c5 359 }
AnnaBridge 172:7d866c31b3c5 360
AnnaBridge 172:7d866c31b3c5 361 /* Set UART baud rate */
AnnaBridge 172:7d866c31b3c5 362 if(u32baudrate != 0ul) {
AnnaBridge 172:7d866c31b3c5 363 u32Baud_Div = UART_BAUD_MODE2_DIVIDER((u32ClkTbl[u32UartClkSrcSel]) / (u32UartClkDivNum + 1ul), u32baudrate);
AnnaBridge 172:7d866c31b3c5 364
AnnaBridge 172:7d866c31b3c5 365 if(u32Baud_Div > 0xFFFFul) {
AnnaBridge 172:7d866c31b3c5 366 uart->BAUD = (UART_BAUD_MODE0 | UART_BAUD_MODE0_DIVIDER((u32ClkTbl[u32UartClkSrcSel]) / (u32UartClkDivNum + 1ul), u32baudrate));
AnnaBridge 172:7d866c31b3c5 367 } else {
AnnaBridge 172:7d866c31b3c5 368 uart->BAUD = (UART_BAUD_MODE2 | u32Baud_Div);
AnnaBridge 172:7d866c31b3c5 369 }
AnnaBridge 172:7d866c31b3c5 370 }
AnnaBridge 172:7d866c31b3c5 371
AnnaBridge 172:7d866c31b3c5 372 /* Set UART line configuration */
AnnaBridge 172:7d866c31b3c5 373 uart->LINE = u32data_width | u32parity | u32stop_bits;
AnnaBridge 172:7d866c31b3c5 374 }
AnnaBridge 172:7d866c31b3c5 375
AnnaBridge 172:7d866c31b3c5 376
AnnaBridge 172:7d866c31b3c5 377 /**
AnnaBridge 172:7d866c31b3c5 378 * @brief Set Rx timeout count
AnnaBridge 172:7d866c31b3c5 379 *
AnnaBridge 172:7d866c31b3c5 380 * @param[in] uart The pointer of the specified UART module.
AnnaBridge 172:7d866c31b3c5 381 * @param[in] u32TOC Rx timeout counter.
AnnaBridge 172:7d866c31b3c5 382 *
AnnaBridge 172:7d866c31b3c5 383 * @return None
AnnaBridge 172:7d866c31b3c5 384 *
AnnaBridge 172:7d866c31b3c5 385 * @details This function use to set Rx timeout count.
AnnaBridge 172:7d866c31b3c5 386 */
AnnaBridge 172:7d866c31b3c5 387 void UART_SetTimeoutCnt(UART_T* uart, uint32_t u32TOC)
AnnaBridge 172:7d866c31b3c5 388 {
AnnaBridge 172:7d866c31b3c5 389 /* Set time-out interrupt comparator */
AnnaBridge 172:7d866c31b3c5 390 uart->TOUT = (uart->TOUT & ~UART_TOUT_TOIC_Msk) | (u32TOC);
AnnaBridge 172:7d866c31b3c5 391
AnnaBridge 172:7d866c31b3c5 392 /* Set time-out counter enable */
AnnaBridge 172:7d866c31b3c5 393 uart->INTEN |= UART_INTEN_TOCNTEN_Msk;
AnnaBridge 172:7d866c31b3c5 394 }
AnnaBridge 172:7d866c31b3c5 395
AnnaBridge 172:7d866c31b3c5 396
AnnaBridge 172:7d866c31b3c5 397 /**
AnnaBridge 172:7d866c31b3c5 398 * @brief Select and configure IrDA function
AnnaBridge 172:7d866c31b3c5 399 *
AnnaBridge 172:7d866c31b3c5 400 * @param[in] uart The pointer of the specified UART module.
AnnaBridge 172:7d866c31b3c5 401 * @param[in] u32Buadrate The baudrate of UART module.
AnnaBridge 172:7d866c31b3c5 402 * @param[in] u32Direction The direction of UART module in IrDA mode:
AnnaBridge 172:7d866c31b3c5 403 * - \ref UART_IRDA_TXEN
AnnaBridge 172:7d866c31b3c5 404 * - \ref UART_IRDA_RXEN
AnnaBridge 172:7d866c31b3c5 405 *
AnnaBridge 172:7d866c31b3c5 406 * @return None
AnnaBridge 172:7d866c31b3c5 407 *
AnnaBridge 172:7d866c31b3c5 408 * @details The function is used to configure IrDA relative settings. It consists of TX or RX mode and baudrate.
AnnaBridge 172:7d866c31b3c5 409 */
AnnaBridge 172:7d866c31b3c5 410 void UART_SelectIrDAMode(UART_T* uart, uint32_t u32Buadrate, uint32_t u32Direction)
AnnaBridge 172:7d866c31b3c5 411 {
AnnaBridge 172:7d866c31b3c5 412 uint32_t u32UartClkSrcSel=0ul, u32UartClkDivNum=0ul;
AnnaBridge 172:7d866c31b3c5 413 uint32_t u32ClkTbl[4ul] = {__HXT, 0ul, __LXT, __HIRC};
AnnaBridge 172:7d866c31b3c5 414 uint32_t u32Baud_Div;
AnnaBridge 172:7d866c31b3c5 415
AnnaBridge 172:7d866c31b3c5 416 /* Select IrDA function mode */
AnnaBridge 172:7d866c31b3c5 417 uart->FUNCSEL = UART_FUNCSEL_IrDA;
AnnaBridge 172:7d866c31b3c5 418
AnnaBridge 172:7d866c31b3c5 419
AnnaBridge 172:7d866c31b3c5 420 if(uart==UART0) {
AnnaBridge 172:7d866c31b3c5 421 /* Get UART clock source selection */
AnnaBridge 172:7d866c31b3c5 422 u32UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UART0SEL_Msk) >> CLK_CLKSEL1_UART0SEL_Pos;
AnnaBridge 172:7d866c31b3c5 423 /* Get UART clock divider number */
AnnaBridge 172:7d866c31b3c5 424 u32UartClkDivNum = (CLK->CLKDIV0 & CLK_CLKDIV0_UART0DIV_Msk) >> CLK_CLKDIV0_UART0DIV_Pos;
AnnaBridge 172:7d866c31b3c5 425 } else if(uart==UART1) {
AnnaBridge 172:7d866c31b3c5 426 /* Get UART clock source selection */
AnnaBridge 172:7d866c31b3c5 427 u32UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UART1SEL_Msk) >> CLK_CLKSEL1_UART1SEL_Pos;
AnnaBridge 172:7d866c31b3c5 428 /* Get UART clock divider number */
AnnaBridge 172:7d866c31b3c5 429 u32UartClkDivNum = (CLK->CLKDIV0 & CLK_CLKDIV0_UART1DIV_Msk) >> CLK_CLKDIV0_UART1DIV_Pos;
AnnaBridge 172:7d866c31b3c5 430 } else if(uart==UART2) {
AnnaBridge 172:7d866c31b3c5 431 /* Get UART clock source selection */
AnnaBridge 172:7d866c31b3c5 432 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART2SEL_Msk) >> CLK_CLKSEL3_UART2SEL_Pos;
AnnaBridge 172:7d866c31b3c5 433 /* Get UART clock divider number */
AnnaBridge 172:7d866c31b3c5 434 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART2DIV_Msk) >> CLK_CLKDIV4_UART2DIV_Pos;
AnnaBridge 172:7d866c31b3c5 435 } else if(uart==UART3) {
AnnaBridge 172:7d866c31b3c5 436 /* Get UART clock source selection */
AnnaBridge 172:7d866c31b3c5 437 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART3SEL_Msk) >> CLK_CLKSEL3_UART3SEL_Pos;
AnnaBridge 172:7d866c31b3c5 438 /* Get UART clock divider number */
AnnaBridge 172:7d866c31b3c5 439 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART3DIV_Msk) >> CLK_CLKDIV4_UART3DIV_Pos;
AnnaBridge 172:7d866c31b3c5 440 } else if(uart==UART4) {
AnnaBridge 172:7d866c31b3c5 441 /* Get UART clock source selection */
AnnaBridge 172:7d866c31b3c5 442 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART4SEL_Msk) >> CLK_CLKSEL3_UART4SEL_Pos;
AnnaBridge 172:7d866c31b3c5 443 /* Get UART clock divider number */
AnnaBridge 172:7d866c31b3c5 444 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART4DIV_Msk) >> CLK_CLKDIV4_UART4DIV_Pos;
AnnaBridge 172:7d866c31b3c5 445 } else if(uart==UART5) {
AnnaBridge 172:7d866c31b3c5 446 /* Get UART clock source selection */
AnnaBridge 172:7d866c31b3c5 447 u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART5SEL_Msk) >> CLK_CLKSEL3_UART5SEL_Pos;
AnnaBridge 172:7d866c31b3c5 448 /* Get UART clock divider number */
AnnaBridge 172:7d866c31b3c5 449 u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART5DIV_Msk) >> CLK_CLKDIV4_UART5DIV_Pos;
AnnaBridge 172:7d866c31b3c5 450 }
AnnaBridge 172:7d866c31b3c5 451
AnnaBridge 172:7d866c31b3c5 452
AnnaBridge 172:7d866c31b3c5 453 /* Get PLL clock frequency if UART clock source selection is PLL */
AnnaBridge 172:7d866c31b3c5 454 if(u32UartClkSrcSel == 1ul) {
AnnaBridge 172:7d866c31b3c5 455 u32ClkTbl[u32UartClkSrcSel] = CLK_GetPLLClockFreq();
AnnaBridge 172:7d866c31b3c5 456 } else {
AnnaBridge 172:7d866c31b3c5 457 }
AnnaBridge 172:7d866c31b3c5 458
AnnaBridge 172:7d866c31b3c5 459 /* Set UART IrDA baud rate in mode 0 */
AnnaBridge 172:7d866c31b3c5 460 if(u32Buadrate != 0ul) {
AnnaBridge 172:7d866c31b3c5 461 u32Baud_Div = UART_BAUD_MODE0_DIVIDER((u32ClkTbl[u32UartClkSrcSel]) / (u32UartClkDivNum + 1ul), u32Buadrate);
AnnaBridge 172:7d866c31b3c5 462
AnnaBridge 172:7d866c31b3c5 463 if(u32Baud_Div < 0xFFFFul) {
AnnaBridge 172:7d866c31b3c5 464 uart->BAUD = (UART_BAUD_MODE0 | u32Baud_Div);
AnnaBridge 172:7d866c31b3c5 465 } else {
AnnaBridge 172:7d866c31b3c5 466 }
AnnaBridge 172:7d866c31b3c5 467 }
AnnaBridge 172:7d866c31b3c5 468
AnnaBridge 172:7d866c31b3c5 469 /* Configure IrDA relative settings */
AnnaBridge 172:7d866c31b3c5 470 if(u32Direction == UART_IRDA_RXEN) {
AnnaBridge 172:7d866c31b3c5 471 uart->IRDA |= UART_IRDA_RXINV_Msk; /*Rx signal is inverse*/
AnnaBridge 172:7d866c31b3c5 472 uart->IRDA &= ~UART_IRDA_TXEN_Msk;
AnnaBridge 172:7d866c31b3c5 473 } else {
AnnaBridge 172:7d866c31b3c5 474 uart->IRDA &= ~UART_IRDA_TXINV_Msk; /*Tx signal is not inverse*/
AnnaBridge 172:7d866c31b3c5 475 uart->IRDA |= UART_IRDA_TXEN_Msk;
AnnaBridge 172:7d866c31b3c5 476 }
AnnaBridge 172:7d866c31b3c5 477
AnnaBridge 172:7d866c31b3c5 478 }
AnnaBridge 172:7d866c31b3c5 479
AnnaBridge 172:7d866c31b3c5 480
AnnaBridge 172:7d866c31b3c5 481 /**
AnnaBridge 172:7d866c31b3c5 482 * @brief Select and configure RS485 function
AnnaBridge 172:7d866c31b3c5 483 *
AnnaBridge 172:7d866c31b3c5 484 * @param[in] uart The pointer of the specified UART module.
AnnaBridge 172:7d866c31b3c5 485 * @param[in] u32Mode The operation mode(NMM/AUD/AAD).
AnnaBridge 172:7d866c31b3c5 486 * - \ref UART_ALTCTL_RS485NMM_Msk
AnnaBridge 172:7d866c31b3c5 487 * - \ref UART_ALTCTL_RS485AUD_Msk
AnnaBridge 172:7d866c31b3c5 488 * - \ref UART_ALTCTL_RS485AAD_Msk
AnnaBridge 172:7d866c31b3c5 489 * @param[in] u32Addr The RS485 address.
AnnaBridge 172:7d866c31b3c5 490 *
AnnaBridge 172:7d866c31b3c5 491 * @return None
AnnaBridge 172:7d866c31b3c5 492 *
AnnaBridge 172:7d866c31b3c5 493 * @details The function is used to set RS485 relative setting.
AnnaBridge 172:7d866c31b3c5 494 */
AnnaBridge 172:7d866c31b3c5 495 void UART_SelectRS485Mode(UART_T* uart, uint32_t u32Mode, uint32_t u32Addr)
AnnaBridge 172:7d866c31b3c5 496 {
AnnaBridge 172:7d866c31b3c5 497 /* Select UART RS485 function mode */
AnnaBridge 172:7d866c31b3c5 498 uart->FUNCSEL = UART_FUNCSEL_RS485;
AnnaBridge 172:7d866c31b3c5 499
AnnaBridge 172:7d866c31b3c5 500 /* Set RS585 configuration */
AnnaBridge 172:7d866c31b3c5 501 uart->ALTCTL &= ~(UART_ALTCTL_RS485NMM_Msk | UART_ALTCTL_RS485AUD_Msk | UART_ALTCTL_RS485AAD_Msk | UART_ALTCTL_ADDRMV_Msk);
AnnaBridge 172:7d866c31b3c5 502 uart->ALTCTL |= (u32Mode | (u32Addr << UART_ALTCTL_ADDRMV_Pos));
AnnaBridge 172:7d866c31b3c5 503 }
AnnaBridge 172:7d866c31b3c5 504
AnnaBridge 172:7d866c31b3c5 505
AnnaBridge 172:7d866c31b3c5 506 /**
AnnaBridge 172:7d866c31b3c5 507 * @brief Select and configure LIN function
AnnaBridge 172:7d866c31b3c5 508 *
AnnaBridge 172:7d866c31b3c5 509 * @param[in] uart The pointer of the specified UART module.
AnnaBridge 172:7d866c31b3c5 510 * @param[in] u32Mode The LIN direction :
AnnaBridge 172:7d866c31b3c5 511 * - \ref UART_ALTCTL_LINTXEN_Msk
AnnaBridge 172:7d866c31b3c5 512 * - \ref UART_ALTCTL_LINRXEN_Msk
AnnaBridge 172:7d866c31b3c5 513 * @param[in] u32BreakLength The break field length.
AnnaBridge 172:7d866c31b3c5 514 *
AnnaBridge 172:7d866c31b3c5 515 * @return None
AnnaBridge 172:7d866c31b3c5 516 *
AnnaBridge 172:7d866c31b3c5 517 * @details The function is used to set LIN relative setting.
AnnaBridge 172:7d866c31b3c5 518 */
AnnaBridge 172:7d866c31b3c5 519 void UART_SelectLINMode(UART_T* uart, uint32_t u32Mode, uint32_t u32BreakLength)
AnnaBridge 172:7d866c31b3c5 520 {
AnnaBridge 172:7d866c31b3c5 521 /* Select LIN function mode */
AnnaBridge 172:7d866c31b3c5 522 uart->FUNCSEL = UART_FUNCSEL_LIN;
AnnaBridge 172:7d866c31b3c5 523
AnnaBridge 172:7d866c31b3c5 524 /* Select LIN function setting : Tx enable, Rx enable and break field length */
AnnaBridge 172:7d866c31b3c5 525 uart->ALTCTL &= ~(UART_ALTCTL_LINTXEN_Msk | UART_ALTCTL_LINRXEN_Msk | UART_ALTCTL_BRKFL_Msk);
AnnaBridge 172:7d866c31b3c5 526 uart->ALTCTL |= (u32Mode | (u32BreakLength << UART_ALTCTL_BRKFL_Pos));
AnnaBridge 172:7d866c31b3c5 527 }
AnnaBridge 172:7d866c31b3c5 528
AnnaBridge 172:7d866c31b3c5 529
AnnaBridge 172:7d866c31b3c5 530 /**
AnnaBridge 172:7d866c31b3c5 531 * @brief Write UART data
AnnaBridge 172:7d866c31b3c5 532 *
AnnaBridge 172:7d866c31b3c5 533 * @param[in] uart The pointer of the specified UART module.
AnnaBridge 172:7d866c31b3c5 534 * @param[in] pu8TxBuf The buffer to send the data to UART transmission FIFO.
AnnaBridge 172:7d866c31b3c5 535 * @param[out] u32WriteBytes The byte number of data.
AnnaBridge 172:7d866c31b3c5 536 *
AnnaBridge 172:7d866c31b3c5 537 * @return u32Count transfer byte count
AnnaBridge 172:7d866c31b3c5 538 *
AnnaBridge 172:7d866c31b3c5 539 * @details The function is to write data into TX buffer to transmit data by UART.
AnnaBridge 172:7d866c31b3c5 540 */
AnnaBridge 172:7d866c31b3c5 541 uint32_t UART_Write(UART_T* uart, uint8_t pu8TxBuf[], uint32_t u32WriteBytes)
AnnaBridge 172:7d866c31b3c5 542 {
AnnaBridge 172:7d866c31b3c5 543 uint32_t u32Count, u32delayno;
AnnaBridge 172:7d866c31b3c5 544 uint32_t u32Exit = 0ul;
AnnaBridge 172:7d866c31b3c5 545
AnnaBridge 172:7d866c31b3c5 546 for(u32Count = 0ul; u32Count != u32WriteBytes; u32Count++) {
AnnaBridge 172:7d866c31b3c5 547 u32delayno = 0ul;
AnnaBridge 172:7d866c31b3c5 548 while((uart->FIFOSTS & UART_FIFOSTS_TXEMPTYF_Msk) == 0ul) { /* Wait Tx empty and Time-out manner */
AnnaBridge 172:7d866c31b3c5 549 u32delayno++;
AnnaBridge 172:7d866c31b3c5 550 if(u32delayno >= 0x40000000ul) {
AnnaBridge 172:7d866c31b3c5 551 u32Exit = 1ul;
AnnaBridge 172:7d866c31b3c5 552 break;
AnnaBridge 172:7d866c31b3c5 553 } else {
AnnaBridge 172:7d866c31b3c5 554 }
AnnaBridge 172:7d866c31b3c5 555 }
AnnaBridge 172:7d866c31b3c5 556
AnnaBridge 172:7d866c31b3c5 557 if(u32Exit == 1ul) {
AnnaBridge 172:7d866c31b3c5 558 break;
AnnaBridge 172:7d866c31b3c5 559 } else {
AnnaBridge 172:7d866c31b3c5 560 uart->DAT = pu8TxBuf[u32Count]; /* Send UART Data from buffer */
AnnaBridge 172:7d866c31b3c5 561 }
AnnaBridge 172:7d866c31b3c5 562 }
AnnaBridge 172:7d866c31b3c5 563
AnnaBridge 172:7d866c31b3c5 564 return u32Count;
AnnaBridge 172:7d866c31b3c5 565
AnnaBridge 172:7d866c31b3c5 566 }
AnnaBridge 172:7d866c31b3c5 567
AnnaBridge 172:7d866c31b3c5 568
AnnaBridge 172:7d866c31b3c5 569 /*@}*/ /* end of group M480_UART_EXPORTED_FUNCTIONS */
AnnaBridge 172:7d866c31b3c5 570
AnnaBridge 172:7d866c31b3c5 571 /*@}*/ /* end of group M480_UART_Driver */
AnnaBridge 172:7d866c31b3c5 572
AnnaBridge 172:7d866c31b3c5 573 /*@}*/ /* end of group M480_Device_Driver */
AnnaBridge 172:7d866c31b3c5 574
AnnaBridge 172:7d866c31b3c5 575 /*** (C) COPYRIGHT 2016 Nuvoton Technology Corp. ***/
AnnaBridge 172:7d866c31b3c5 576
AnnaBridge 172:7d866c31b3c5 577
AnnaBridge 172:7d866c31b3c5 578