Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of OmniWheels by
mbed-os/targets/TARGET_NUVOTON/TARGET_M480/device/StdDriver/m480_usci_uart.c@1:9c5af431a1f1, 2018-05-01 (annotated)
- Committer:
- gustavatmel
- Date:
- Tue May 01 15:47:08 2018 +0000
- Revision:
- 1:9c5af431a1f1
sdf
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gustavatmel | 1:9c5af431a1f1 | 1 | /**************************************************************************//** |
gustavatmel | 1:9c5af431a1f1 | 2 | * @file usci_uart.c |
gustavatmel | 1:9c5af431a1f1 | 3 | * @version V3.00 |
gustavatmel | 1:9c5af431a1f1 | 4 | * @brief M480 series USCI UART (UUART) driver source file |
gustavatmel | 1:9c5af431a1f1 | 5 | * |
gustavatmel | 1:9c5af431a1f1 | 6 | * @copyright (C) 2016 Nuvoton Technology Corp. All rights reserved. |
gustavatmel | 1:9c5af431a1f1 | 7 | *****************************************************************************/ |
gustavatmel | 1:9c5af431a1f1 | 8 | |
gustavatmel | 1:9c5af431a1f1 | 9 | #include <stdio.h> |
gustavatmel | 1:9c5af431a1f1 | 10 | #include "M480.h" |
gustavatmel | 1:9c5af431a1f1 | 11 | |
gustavatmel | 1:9c5af431a1f1 | 12 | /** @addtogroup M480_Device_Driver M480 Device Driver |
gustavatmel | 1:9c5af431a1f1 | 13 | @{ |
gustavatmel | 1:9c5af431a1f1 | 14 | */ |
gustavatmel | 1:9c5af431a1f1 | 15 | |
gustavatmel | 1:9c5af431a1f1 | 16 | /** @addtogroup M480_USCI_UART_Driver USCI_UART Driver |
gustavatmel | 1:9c5af431a1f1 | 17 | @{ |
gustavatmel | 1:9c5af431a1f1 | 18 | */ |
gustavatmel | 1:9c5af431a1f1 | 19 | |
gustavatmel | 1:9c5af431a1f1 | 20 | /** @addtogroup M480_USCI_UART_EXPORTED_FUNCTIONS USCI_UART Exported Functions |
gustavatmel | 1:9c5af431a1f1 | 21 | @{ |
gustavatmel | 1:9c5af431a1f1 | 22 | */ |
gustavatmel | 1:9c5af431a1f1 | 23 | |
gustavatmel | 1:9c5af431a1f1 | 24 | /** |
gustavatmel | 1:9c5af431a1f1 | 25 | * @brief Clear USCI_UART specified interrupt flag |
gustavatmel | 1:9c5af431a1f1 | 26 | * |
gustavatmel | 1:9c5af431a1f1 | 27 | * @param[in] uuart The pointer of the specified USCI_UART module. |
gustavatmel | 1:9c5af431a1f1 | 28 | * @param[in] u32Mask The combination of all related interrupt sources. |
gustavatmel | 1:9c5af431a1f1 | 29 | * Each bit corresponds to a interrupt source. |
gustavatmel | 1:9c5af431a1f1 | 30 | * This parameter decides which interrupt flags will be cleared. It could be the combination of: |
gustavatmel | 1:9c5af431a1f1 | 31 | * - \ref UUART_ABR_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 32 | * - \ref UUART_RLS_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 33 | * - \ref UUART_BUF_RXOV_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 34 | * - \ref UUART_TXST_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 35 | * - \ref UUART_TXEND_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 36 | * - \ref UUART_RXST_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 37 | * - \ref UUART_RXEND_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 38 | * |
gustavatmel | 1:9c5af431a1f1 | 39 | * @return None |
gustavatmel | 1:9c5af431a1f1 | 40 | * |
gustavatmel | 1:9c5af431a1f1 | 41 | * @details The function is used to clear USCI_UART related interrupt flags specified by u32Mask parameter. |
gustavatmel | 1:9c5af431a1f1 | 42 | */ |
gustavatmel | 1:9c5af431a1f1 | 43 | |
gustavatmel | 1:9c5af431a1f1 | 44 | void UUART_ClearIntFlag(UUART_T* uuart , uint32_t u32Mask) |
gustavatmel | 1:9c5af431a1f1 | 45 | { |
gustavatmel | 1:9c5af431a1f1 | 46 | |
gustavatmel | 1:9c5af431a1f1 | 47 | if(u32Mask & UUART_ABR_INT_MASK) { /* Clear Auto-baud Rate Interrupt */ |
gustavatmel | 1:9c5af431a1f1 | 48 | uuart->PROTSTS = UUART_PROTSTS_ABRDETIF_Msk; |
gustavatmel | 1:9c5af431a1f1 | 49 | } |
gustavatmel | 1:9c5af431a1f1 | 50 | |
gustavatmel | 1:9c5af431a1f1 | 51 | if(u32Mask & UUART_RLS_INT_MASK) { /* Clear Receive Line Status Interrupt */ |
gustavatmel | 1:9c5af431a1f1 | 52 | uuart->PROTSTS = (UUART_PROTSTS_BREAK_Msk | UUART_PROTSTS_FRMERR_Msk | UUART_PROTSTS_PARITYERR_Msk); |
gustavatmel | 1:9c5af431a1f1 | 53 | } |
gustavatmel | 1:9c5af431a1f1 | 54 | |
gustavatmel | 1:9c5af431a1f1 | 55 | if(u32Mask & UUART_BUF_RXOV_INT_MASK) { /* Clear Receive Buffer Over-run Error Interrupt */ |
gustavatmel | 1:9c5af431a1f1 | 56 | uuart->BUFSTS = UUART_BUFSTS_RXOVIF_Msk; |
gustavatmel | 1:9c5af431a1f1 | 57 | } |
gustavatmel | 1:9c5af431a1f1 | 58 | |
gustavatmel | 1:9c5af431a1f1 | 59 | if(u32Mask & UUART_TXST_INT_MASK) { /* Clear Transmit Start Interrupt */ |
gustavatmel | 1:9c5af431a1f1 | 60 | uuart->PROTSTS = UUART_PROTSTS_TXSTIF_Msk; |
gustavatmel | 1:9c5af431a1f1 | 61 | } |
gustavatmel | 1:9c5af431a1f1 | 62 | |
gustavatmel | 1:9c5af431a1f1 | 63 | if(u32Mask & UUART_TXEND_INT_MASK) { /* Clear Transmit End Interrupt */ |
gustavatmel | 1:9c5af431a1f1 | 64 | uuart->PROTSTS = UUART_PROTSTS_TXENDIF_Msk; |
gustavatmel | 1:9c5af431a1f1 | 65 | } |
gustavatmel | 1:9c5af431a1f1 | 66 | |
gustavatmel | 1:9c5af431a1f1 | 67 | if(u32Mask & UUART_RXST_INT_MASK) { /* Clear Receive Start Interrupt */ |
gustavatmel | 1:9c5af431a1f1 | 68 | uuart->PROTSTS = UUART_PROTSTS_RXSTIF_Msk; |
gustavatmel | 1:9c5af431a1f1 | 69 | } |
gustavatmel | 1:9c5af431a1f1 | 70 | |
gustavatmel | 1:9c5af431a1f1 | 71 | if(u32Mask & UUART_RXEND_INT_MASK) { /* Clear Receive End Interrupt */ |
gustavatmel | 1:9c5af431a1f1 | 72 | uuart->PROTSTS = UUART_PROTSTS_RXENDIF_Msk; |
gustavatmel | 1:9c5af431a1f1 | 73 | } |
gustavatmel | 1:9c5af431a1f1 | 74 | |
gustavatmel | 1:9c5af431a1f1 | 75 | } |
gustavatmel | 1:9c5af431a1f1 | 76 | |
gustavatmel | 1:9c5af431a1f1 | 77 | /** |
gustavatmel | 1:9c5af431a1f1 | 78 | * @brief Get USCI_UART specified interrupt flag |
gustavatmel | 1:9c5af431a1f1 | 79 | * |
gustavatmel | 1:9c5af431a1f1 | 80 | * @param[in] uuart The pointer of the specified USCI_UART module. |
gustavatmel | 1:9c5af431a1f1 | 81 | * @param[in] u32Mask The combination of all related interrupt sources. |
gustavatmel | 1:9c5af431a1f1 | 82 | * Each bit corresponds to a interrupt source. |
gustavatmel | 1:9c5af431a1f1 | 83 | * This parameter decides which interrupt flags will be read. It is combination of: |
gustavatmel | 1:9c5af431a1f1 | 84 | * - \ref UUART_ABR_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 85 | * - \ref UUART_RLS_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 86 | * - \ref UUART_BUF_RXOV_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 87 | * - \ref UUART_TXST_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 88 | * - \ref UUART_TXEND_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 89 | * - \ref UUART_RXST_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 90 | * - \ref UUART_RXEND_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 91 | * |
gustavatmel | 1:9c5af431a1f1 | 92 | * @return Interrupt flags of selected sources. |
gustavatmel | 1:9c5af431a1f1 | 93 | * |
gustavatmel | 1:9c5af431a1f1 | 94 | * @details The function is used to get USCI_UART related interrupt flags specified by u32Mask parameter. |
gustavatmel | 1:9c5af431a1f1 | 95 | */ |
gustavatmel | 1:9c5af431a1f1 | 96 | |
gustavatmel | 1:9c5af431a1f1 | 97 | uint32_t UUART_GetIntFlag(UUART_T* uuart , uint32_t u32Mask) |
gustavatmel | 1:9c5af431a1f1 | 98 | { |
gustavatmel | 1:9c5af431a1f1 | 99 | uint32_t u32IntFlag = 0ul; |
gustavatmel | 1:9c5af431a1f1 | 100 | uint32_t u32Tmp1, u32Tmp2; |
gustavatmel | 1:9c5af431a1f1 | 101 | |
gustavatmel | 1:9c5af431a1f1 | 102 | /* Check Auto-baud Rate Interrupt Flag */ |
gustavatmel | 1:9c5af431a1f1 | 103 | u32Tmp1 = (u32Mask & UUART_ABR_INT_MASK); |
gustavatmel | 1:9c5af431a1f1 | 104 | u32Tmp2 = (uuart->PROTSTS & UUART_PROTSTS_ABRDETIF_Msk); |
gustavatmel | 1:9c5af431a1f1 | 105 | if(u32Tmp1 && u32Tmp2) { |
gustavatmel | 1:9c5af431a1f1 | 106 | u32IntFlag |= UUART_ABR_INT_MASK; |
gustavatmel | 1:9c5af431a1f1 | 107 | } |
gustavatmel | 1:9c5af431a1f1 | 108 | |
gustavatmel | 1:9c5af431a1f1 | 109 | /* Check Receive Line Status Interrupt Flag */ |
gustavatmel | 1:9c5af431a1f1 | 110 | u32Tmp1 = (u32Mask & UUART_RLS_INT_MASK); |
gustavatmel | 1:9c5af431a1f1 | 111 | u32Tmp2 = (uuart->PROTSTS & (UUART_PROTSTS_BREAK_Msk | UUART_PROTSTS_FRMERR_Msk | UUART_PROTSTS_PARITYERR_Msk)); |
gustavatmel | 1:9c5af431a1f1 | 112 | if(u32Tmp1 && u32Tmp2) { |
gustavatmel | 1:9c5af431a1f1 | 113 | u32IntFlag |= UUART_RLS_INT_MASK; |
gustavatmel | 1:9c5af431a1f1 | 114 | } |
gustavatmel | 1:9c5af431a1f1 | 115 | |
gustavatmel | 1:9c5af431a1f1 | 116 | /* Check Receive Buffer Over-run Error Interrupt Flag */ |
gustavatmel | 1:9c5af431a1f1 | 117 | u32Tmp1 = (u32Mask & UUART_BUF_RXOV_INT_MASK); |
gustavatmel | 1:9c5af431a1f1 | 118 | u32Tmp2 = (uuart->BUFSTS & UUART_BUFSTS_RXOVIF_Msk); |
gustavatmel | 1:9c5af431a1f1 | 119 | if(u32Tmp1 && u32Tmp2) { |
gustavatmel | 1:9c5af431a1f1 | 120 | u32IntFlag |= UUART_BUF_RXOV_INT_MASK; |
gustavatmel | 1:9c5af431a1f1 | 121 | } |
gustavatmel | 1:9c5af431a1f1 | 122 | |
gustavatmel | 1:9c5af431a1f1 | 123 | /* Check Transmit Start Interrupt Flag */ |
gustavatmel | 1:9c5af431a1f1 | 124 | u32Tmp1 = (u32Mask & UUART_TXST_INT_MASK); |
gustavatmel | 1:9c5af431a1f1 | 125 | u32Tmp2 = (uuart->PROTSTS & UUART_PROTSTS_TXSTIF_Msk); |
gustavatmel | 1:9c5af431a1f1 | 126 | if(u32Tmp1 && u32Tmp2) { |
gustavatmel | 1:9c5af431a1f1 | 127 | u32IntFlag |= UUART_TXST_INT_MASK; |
gustavatmel | 1:9c5af431a1f1 | 128 | } |
gustavatmel | 1:9c5af431a1f1 | 129 | |
gustavatmel | 1:9c5af431a1f1 | 130 | /* Check Transmit End Interrupt Flag */ |
gustavatmel | 1:9c5af431a1f1 | 131 | u32Tmp1 = (u32Mask & UUART_TXEND_INT_MASK); |
gustavatmel | 1:9c5af431a1f1 | 132 | u32Tmp2 = (uuart->PROTSTS & UUART_PROTSTS_TXENDIF_Msk); |
gustavatmel | 1:9c5af431a1f1 | 133 | if(u32Tmp1 && u32Tmp2) { |
gustavatmel | 1:9c5af431a1f1 | 134 | u32IntFlag |= UUART_TXEND_INT_MASK; |
gustavatmel | 1:9c5af431a1f1 | 135 | } |
gustavatmel | 1:9c5af431a1f1 | 136 | |
gustavatmel | 1:9c5af431a1f1 | 137 | /* Check Receive Start Interrupt Flag */ |
gustavatmel | 1:9c5af431a1f1 | 138 | u32Tmp1 = (u32Mask & UUART_RXST_INT_MASK); |
gustavatmel | 1:9c5af431a1f1 | 139 | u32Tmp2 = (uuart->PROTSTS & UUART_PROTSTS_RXSTIF_Msk); |
gustavatmel | 1:9c5af431a1f1 | 140 | if(u32Tmp1 && u32Tmp2) { |
gustavatmel | 1:9c5af431a1f1 | 141 | u32IntFlag |= UUART_RXST_INT_MASK; |
gustavatmel | 1:9c5af431a1f1 | 142 | } |
gustavatmel | 1:9c5af431a1f1 | 143 | |
gustavatmel | 1:9c5af431a1f1 | 144 | /* Check Receive End Interrupt Flag */ |
gustavatmel | 1:9c5af431a1f1 | 145 | u32Tmp1 = (u32Mask & UUART_RXEND_INT_MASK); |
gustavatmel | 1:9c5af431a1f1 | 146 | u32Tmp2 = (uuart->PROTSTS & UUART_PROTSTS_RXENDIF_Msk); |
gustavatmel | 1:9c5af431a1f1 | 147 | if(u32Tmp1 && u32Tmp2) { |
gustavatmel | 1:9c5af431a1f1 | 148 | u32IntFlag |= UUART_RXEND_INT_MASK; |
gustavatmel | 1:9c5af431a1f1 | 149 | } |
gustavatmel | 1:9c5af431a1f1 | 150 | |
gustavatmel | 1:9c5af431a1f1 | 151 | return u32IntFlag; |
gustavatmel | 1:9c5af431a1f1 | 152 | |
gustavatmel | 1:9c5af431a1f1 | 153 | } |
gustavatmel | 1:9c5af431a1f1 | 154 | |
gustavatmel | 1:9c5af431a1f1 | 155 | |
gustavatmel | 1:9c5af431a1f1 | 156 | /** |
gustavatmel | 1:9c5af431a1f1 | 157 | * @brief Disable USCI_UART function mode |
gustavatmel | 1:9c5af431a1f1 | 158 | * |
gustavatmel | 1:9c5af431a1f1 | 159 | * @param[in] uuart The pointer of the specified USCI_UART module. |
gustavatmel | 1:9c5af431a1f1 | 160 | * |
gustavatmel | 1:9c5af431a1f1 | 161 | * @return None |
gustavatmel | 1:9c5af431a1f1 | 162 | * |
gustavatmel | 1:9c5af431a1f1 | 163 | * @details The function is used to disable USCI_UART function mode. |
gustavatmel | 1:9c5af431a1f1 | 164 | */ |
gustavatmel | 1:9c5af431a1f1 | 165 | void UUART_Close(UUART_T* uuart) |
gustavatmel | 1:9c5af431a1f1 | 166 | { |
gustavatmel | 1:9c5af431a1f1 | 167 | uuart->CTL = 0ul; |
gustavatmel | 1:9c5af431a1f1 | 168 | } |
gustavatmel | 1:9c5af431a1f1 | 169 | |
gustavatmel | 1:9c5af431a1f1 | 170 | |
gustavatmel | 1:9c5af431a1f1 | 171 | /** |
gustavatmel | 1:9c5af431a1f1 | 172 | * @brief Disable interrupt function. |
gustavatmel | 1:9c5af431a1f1 | 173 | * |
gustavatmel | 1:9c5af431a1f1 | 174 | * @param[in] uuart The pointer of the specified USCI_UART module. |
gustavatmel | 1:9c5af431a1f1 | 175 | * @param[in] u32Mask The combination of all related interrupt enable bits. |
gustavatmel | 1:9c5af431a1f1 | 176 | * Each bit corresponds to a interrupt enable bit. |
gustavatmel | 1:9c5af431a1f1 | 177 | * This parameter decides which interrupts will be disabled. It is combination of: |
gustavatmel | 1:9c5af431a1f1 | 178 | * - \ref UUART_ABR_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 179 | * - \ref UUART_RLS_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 180 | * - \ref UUART_BUF_RXOV_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 181 | * - \ref UUART_TXST_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 182 | * - \ref UUART_TXEND_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 183 | * - \ref UUART_RXST_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 184 | * - \ref UUART_RXEND_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 185 | * |
gustavatmel | 1:9c5af431a1f1 | 186 | * @return None |
gustavatmel | 1:9c5af431a1f1 | 187 | * |
gustavatmel | 1:9c5af431a1f1 | 188 | * @details The function is used to disabled USCI_UART related interrupts specified by u32Mask parameter. |
gustavatmel | 1:9c5af431a1f1 | 189 | */ |
gustavatmel | 1:9c5af431a1f1 | 190 | void UUART_DisableInt(UUART_T* uuart, uint32_t u32Mask) |
gustavatmel | 1:9c5af431a1f1 | 191 | { |
gustavatmel | 1:9c5af431a1f1 | 192 | |
gustavatmel | 1:9c5af431a1f1 | 193 | /* Disable Auto-baud rate interrupt flag */ |
gustavatmel | 1:9c5af431a1f1 | 194 | if((u32Mask & UUART_ABR_INT_MASK) == UUART_ABR_INT_MASK) { |
gustavatmel | 1:9c5af431a1f1 | 195 | uuart->PROTIEN &= ~UUART_PROTIEN_ABRIEN_Msk; |
gustavatmel | 1:9c5af431a1f1 | 196 | } |
gustavatmel | 1:9c5af431a1f1 | 197 | |
gustavatmel | 1:9c5af431a1f1 | 198 | /* Disable receive line status interrupt flag */ |
gustavatmel | 1:9c5af431a1f1 | 199 | if((u32Mask & UUART_RLS_INT_MASK) == UUART_RLS_INT_MASK) { |
gustavatmel | 1:9c5af431a1f1 | 200 | uuart->PROTIEN &= ~UUART_PROTIEN_RLSIEN_Msk; |
gustavatmel | 1:9c5af431a1f1 | 201 | } |
gustavatmel | 1:9c5af431a1f1 | 202 | |
gustavatmel | 1:9c5af431a1f1 | 203 | /* Disable RX overrun interrupt flag */ |
gustavatmel | 1:9c5af431a1f1 | 204 | if((u32Mask & UUART_BUF_RXOV_INT_MASK) == UUART_BUF_RXOV_INT_MASK) { |
gustavatmel | 1:9c5af431a1f1 | 205 | uuart->BUFCTL &= ~UUART_BUFCTL_RXOVIEN_Msk; |
gustavatmel | 1:9c5af431a1f1 | 206 | } |
gustavatmel | 1:9c5af431a1f1 | 207 | |
gustavatmel | 1:9c5af431a1f1 | 208 | /* Disable TX start interrupt flag */ |
gustavatmel | 1:9c5af431a1f1 | 209 | if((u32Mask & UUART_TXST_INT_MASK) == UUART_TXST_INT_MASK) { |
gustavatmel | 1:9c5af431a1f1 | 210 | uuart->INTEN &= ~UUART_INTEN_TXSTIEN_Msk; |
gustavatmel | 1:9c5af431a1f1 | 211 | } |
gustavatmel | 1:9c5af431a1f1 | 212 | |
gustavatmel | 1:9c5af431a1f1 | 213 | /* Disable TX end interrupt flag */ |
gustavatmel | 1:9c5af431a1f1 | 214 | if((u32Mask & UUART_TXEND_INT_MASK) == UUART_TXEND_INT_MASK) { |
gustavatmel | 1:9c5af431a1f1 | 215 | uuart->INTEN &= ~UUART_INTEN_TXENDIEN_Msk; |
gustavatmel | 1:9c5af431a1f1 | 216 | } |
gustavatmel | 1:9c5af431a1f1 | 217 | |
gustavatmel | 1:9c5af431a1f1 | 218 | /* Disable RX start interrupt flag */ |
gustavatmel | 1:9c5af431a1f1 | 219 | if((u32Mask & UUART_RXST_INT_MASK) == UUART_RXST_INT_MASK) { |
gustavatmel | 1:9c5af431a1f1 | 220 | uuart->INTEN &= ~UUART_INTEN_RXSTIEN_Msk; |
gustavatmel | 1:9c5af431a1f1 | 221 | } |
gustavatmel | 1:9c5af431a1f1 | 222 | |
gustavatmel | 1:9c5af431a1f1 | 223 | /* Disable RX end interrupt flag */ |
gustavatmel | 1:9c5af431a1f1 | 224 | if((u32Mask & UUART_RXEND_INT_MASK) == UUART_RXEND_INT_MASK) { |
gustavatmel | 1:9c5af431a1f1 | 225 | uuart->INTEN &= ~UUART_INTEN_RXENDIEN_Msk; |
gustavatmel | 1:9c5af431a1f1 | 226 | } |
gustavatmel | 1:9c5af431a1f1 | 227 | } |
gustavatmel | 1:9c5af431a1f1 | 228 | |
gustavatmel | 1:9c5af431a1f1 | 229 | |
gustavatmel | 1:9c5af431a1f1 | 230 | /** |
gustavatmel | 1:9c5af431a1f1 | 231 | * @brief Enable interrupt function. |
gustavatmel | 1:9c5af431a1f1 | 232 | * |
gustavatmel | 1:9c5af431a1f1 | 233 | * @param[in] uuart The pointer of the specified USCI_UART module. |
gustavatmel | 1:9c5af431a1f1 | 234 | * @param[in] u32Mask The combination of all related interrupt enable bits. |
gustavatmel | 1:9c5af431a1f1 | 235 | * Each bit corresponds to a interrupt enable bit. |
gustavatmel | 1:9c5af431a1f1 | 236 | * This parameter decides which interrupts will be enabled. It is combination of: |
gustavatmel | 1:9c5af431a1f1 | 237 | * - \ref UUART_ABR_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 238 | * - \ref UUART_RLS_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 239 | * - \ref UUART_BUF_RXOV_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 240 | * - \ref UUART_TXST_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 241 | * - \ref UUART_TXEND_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 242 | * - \ref UUART_RXST_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 243 | * - \ref UUART_RXEND_INT_MASK |
gustavatmel | 1:9c5af431a1f1 | 244 | * |
gustavatmel | 1:9c5af431a1f1 | 245 | * @return None |
gustavatmel | 1:9c5af431a1f1 | 246 | * |
gustavatmel | 1:9c5af431a1f1 | 247 | * @details The function is used to enable USCI_UART related interrupts specified by u32Mask parameter. |
gustavatmel | 1:9c5af431a1f1 | 248 | */ |
gustavatmel | 1:9c5af431a1f1 | 249 | void UUART_EnableInt(UUART_T* uuart, uint32_t u32Mask) |
gustavatmel | 1:9c5af431a1f1 | 250 | { |
gustavatmel | 1:9c5af431a1f1 | 251 | /* Enable Auto-baud rate interrupt flag */ |
gustavatmel | 1:9c5af431a1f1 | 252 | if((u32Mask & UUART_ABR_INT_MASK) == UUART_ABR_INT_MASK) { |
gustavatmel | 1:9c5af431a1f1 | 253 | uuart->PROTIEN |= UUART_PROTIEN_ABRIEN_Msk; |
gustavatmel | 1:9c5af431a1f1 | 254 | } |
gustavatmel | 1:9c5af431a1f1 | 255 | |
gustavatmel | 1:9c5af431a1f1 | 256 | /* Enable receive line status interrupt flag */ |
gustavatmel | 1:9c5af431a1f1 | 257 | if((u32Mask & UUART_RLS_INT_MASK) == UUART_RLS_INT_MASK) { |
gustavatmel | 1:9c5af431a1f1 | 258 | uuart->PROTIEN |= UUART_PROTIEN_RLSIEN_Msk; |
gustavatmel | 1:9c5af431a1f1 | 259 | } |
gustavatmel | 1:9c5af431a1f1 | 260 | |
gustavatmel | 1:9c5af431a1f1 | 261 | /* Enable RX overrun interrupt flag */ |
gustavatmel | 1:9c5af431a1f1 | 262 | if((u32Mask & UUART_BUF_RXOV_INT_MASK) == UUART_BUF_RXOV_INT_MASK) { |
gustavatmel | 1:9c5af431a1f1 | 263 | uuart->BUFCTL |= UUART_BUFCTL_RXOVIEN_Msk; |
gustavatmel | 1:9c5af431a1f1 | 264 | } |
gustavatmel | 1:9c5af431a1f1 | 265 | |
gustavatmel | 1:9c5af431a1f1 | 266 | /* Enable TX start interrupt flag */ |
gustavatmel | 1:9c5af431a1f1 | 267 | if((u32Mask & UUART_TXST_INT_MASK) == UUART_TXST_INT_MASK) { |
gustavatmel | 1:9c5af431a1f1 | 268 | uuart->INTEN |= UUART_INTEN_TXSTIEN_Msk; |
gustavatmel | 1:9c5af431a1f1 | 269 | } |
gustavatmel | 1:9c5af431a1f1 | 270 | |
gustavatmel | 1:9c5af431a1f1 | 271 | /* Enable TX end interrupt flag */ |
gustavatmel | 1:9c5af431a1f1 | 272 | if((u32Mask & UUART_TXEND_INT_MASK) == UUART_TXEND_INT_MASK) { |
gustavatmel | 1:9c5af431a1f1 | 273 | uuart->INTEN |= UUART_INTEN_TXENDIEN_Msk; |
gustavatmel | 1:9c5af431a1f1 | 274 | } |
gustavatmel | 1:9c5af431a1f1 | 275 | |
gustavatmel | 1:9c5af431a1f1 | 276 | /* Enable RX start interrupt flag */ |
gustavatmel | 1:9c5af431a1f1 | 277 | if((u32Mask & UUART_RXST_INT_MASK) == UUART_RXST_INT_MASK) { |
gustavatmel | 1:9c5af431a1f1 | 278 | uuart->INTEN |= UUART_INTEN_RXSTIEN_Msk; |
gustavatmel | 1:9c5af431a1f1 | 279 | } |
gustavatmel | 1:9c5af431a1f1 | 280 | |
gustavatmel | 1:9c5af431a1f1 | 281 | /* Enable RX end interrupt flag */ |
gustavatmel | 1:9c5af431a1f1 | 282 | if((u32Mask & UUART_RXEND_INT_MASK) == UUART_RXEND_INT_MASK) { |
gustavatmel | 1:9c5af431a1f1 | 283 | uuart->INTEN |= UUART_INTEN_RXENDIEN_Msk; |
gustavatmel | 1:9c5af431a1f1 | 284 | } |
gustavatmel | 1:9c5af431a1f1 | 285 | } |
gustavatmel | 1:9c5af431a1f1 | 286 | |
gustavatmel | 1:9c5af431a1f1 | 287 | |
gustavatmel | 1:9c5af431a1f1 | 288 | /** |
gustavatmel | 1:9c5af431a1f1 | 289 | * @brief Open and set USCI_UART function |
gustavatmel | 1:9c5af431a1f1 | 290 | * |
gustavatmel | 1:9c5af431a1f1 | 291 | * @param[in] uuart The pointer of the specified USCI_UART module. |
gustavatmel | 1:9c5af431a1f1 | 292 | * @param[in] u32baudrate The baud rate of USCI_UART module. |
gustavatmel | 1:9c5af431a1f1 | 293 | * |
gustavatmel | 1:9c5af431a1f1 | 294 | * @return Real baud rate of USCI_UART module. |
gustavatmel | 1:9c5af431a1f1 | 295 | * |
gustavatmel | 1:9c5af431a1f1 | 296 | * @details This function use to enable USCI_UART function and set baud-rate. |
gustavatmel | 1:9c5af431a1f1 | 297 | */ |
gustavatmel | 1:9c5af431a1f1 | 298 | uint32_t UUART_Open(UUART_T* uuart, uint32_t u32baudrate) |
gustavatmel | 1:9c5af431a1f1 | 299 | { |
gustavatmel | 1:9c5af431a1f1 | 300 | uint32_t u32PCLKFreq, u32PDSClk, u32PDSCnt, u32DSCnt, u32ClkDiv; |
gustavatmel | 1:9c5af431a1f1 | 301 | uint32_t u32Tmp, u32Tmp2, u32Min, u32MinClkDiv, u32MinDSCnt; |
gustavatmel | 1:9c5af431a1f1 | 302 | |
gustavatmel | 1:9c5af431a1f1 | 303 | /* Get PCLK frequency */ |
gustavatmel | 1:9c5af431a1f1 | 304 | if( uuart == UUART0) { |
gustavatmel | 1:9c5af431a1f1 | 305 | u32PDSClk = u32PCLKFreq = CLK_GetPCLK0Freq(); |
gustavatmel | 1:9c5af431a1f1 | 306 | } else { |
gustavatmel | 1:9c5af431a1f1 | 307 | u32PDSClk = u32PCLKFreq = CLK_GetPCLK1Freq(); |
gustavatmel | 1:9c5af431a1f1 | 308 | } |
gustavatmel | 1:9c5af431a1f1 | 309 | |
gustavatmel | 1:9c5af431a1f1 | 310 | for(u32PDSCnt = 1ul; u32PDSCnt <= 0x04ul; u32PDSCnt++) { /* PDSCNT could be 0~0x3 */ |
gustavatmel | 1:9c5af431a1f1 | 311 | u32PDSClk = u32PCLKFreq / u32PDSCnt; |
gustavatmel | 1:9c5af431a1f1 | 312 | |
gustavatmel | 1:9c5af431a1f1 | 313 | if(u32PDSClk > (80000000ul/4ul)) { /* max. PCLK freq = 80MHz */ |
gustavatmel | 1:9c5af431a1f1 | 314 | } else { |
gustavatmel | 1:9c5af431a1f1 | 315 | break; |
gustavatmel | 1:9c5af431a1f1 | 316 | } |
gustavatmel | 1:9c5af431a1f1 | 317 | } |
gustavatmel | 1:9c5af431a1f1 | 318 | |
gustavatmel | 1:9c5af431a1f1 | 319 | /* Find best solution */ |
gustavatmel | 1:9c5af431a1f1 | 320 | u32Min = (uint32_t) - 1; |
gustavatmel | 1:9c5af431a1f1 | 321 | u32MinDSCnt = 0ul; |
gustavatmel | 1:9c5af431a1f1 | 322 | u32MinClkDiv = 0ul; |
gustavatmel | 1:9c5af431a1f1 | 323 | for(u32DSCnt = 6ul; u32DSCnt <= 0x10ul; u32DSCnt++) { /* DSCNT could be 0x5~0xF */ |
gustavatmel | 1:9c5af431a1f1 | 324 | for(u32ClkDiv = 1ul; u32ClkDiv <= 0x400ul; u32ClkDiv++) { /* CLKDIV could be 0~0x3FF */ |
gustavatmel | 1:9c5af431a1f1 | 325 | |
gustavatmel | 1:9c5af431a1f1 | 326 | u32Tmp = u32PDSClk / u32DSCnt / u32ClkDiv; |
gustavatmel | 1:9c5af431a1f1 | 327 | |
gustavatmel | 1:9c5af431a1f1 | 328 | u32Tmp2 = (u32Tmp > u32baudrate) ? u32Tmp - u32baudrate : u32baudrate - u32Tmp; |
gustavatmel | 1:9c5af431a1f1 | 329 | |
gustavatmel | 1:9c5af431a1f1 | 330 | if(u32Tmp2 < u32Min) { |
gustavatmel | 1:9c5af431a1f1 | 331 | u32Min = u32Tmp2; |
gustavatmel | 1:9c5af431a1f1 | 332 | u32MinDSCnt = u32DSCnt; |
gustavatmel | 1:9c5af431a1f1 | 333 | u32MinClkDiv = u32ClkDiv; |
gustavatmel | 1:9c5af431a1f1 | 334 | |
gustavatmel | 1:9c5af431a1f1 | 335 | /* Break when get good results */ |
gustavatmel | 1:9c5af431a1f1 | 336 | if(u32Min == 0ul) { |
gustavatmel | 1:9c5af431a1f1 | 337 | break; |
gustavatmel | 1:9c5af431a1f1 | 338 | } |
gustavatmel | 1:9c5af431a1f1 | 339 | } |
gustavatmel | 1:9c5af431a1f1 | 340 | } |
gustavatmel | 1:9c5af431a1f1 | 341 | } |
gustavatmel | 1:9c5af431a1f1 | 342 | |
gustavatmel | 1:9c5af431a1f1 | 343 | /* Enable USCI_UART protocol */ |
gustavatmel | 1:9c5af431a1f1 | 344 | uuart->CTL &= ~UUART_CTL_FUNMODE_Msk; |
gustavatmel | 1:9c5af431a1f1 | 345 | uuart->CTL = 2ul << UUART_CTL_FUNMODE_Pos; |
gustavatmel | 1:9c5af431a1f1 | 346 | |
gustavatmel | 1:9c5af431a1f1 | 347 | /* Set USCI_UART line configuration */ |
gustavatmel | 1:9c5af431a1f1 | 348 | uuart->LINECTL = UUART_WORD_LEN_8 | UUART_LINECTL_LSB_Msk; |
gustavatmel | 1:9c5af431a1f1 | 349 | uuart->DATIN0 = (2ul << UUART_DATIN0_EDGEDET_Pos); /* Set falling edge detection */ |
gustavatmel | 1:9c5af431a1f1 | 350 | |
gustavatmel | 1:9c5af431a1f1 | 351 | /* Set USCI_UART baud rate */ |
gustavatmel | 1:9c5af431a1f1 | 352 | uuart->BRGEN = ((u32MinClkDiv-1ul) << UUART_BRGEN_CLKDIV_Pos) | |
gustavatmel | 1:9c5af431a1f1 | 353 | ((u32MinDSCnt-1ul) << UUART_BRGEN_DSCNT_Pos) | |
gustavatmel | 1:9c5af431a1f1 | 354 | ((u32PDSCnt-1ul) << UUART_BRGEN_PDSCNT_Pos); |
gustavatmel | 1:9c5af431a1f1 | 355 | |
gustavatmel | 1:9c5af431a1f1 | 356 | uuart->PROTCTL |= UUART_PROTCTL_PROTEN_Msk; |
gustavatmel | 1:9c5af431a1f1 | 357 | |
gustavatmel | 1:9c5af431a1f1 | 358 | return (u32PCLKFreq/u32PDSCnt/u32MinDSCnt/u32MinClkDiv); |
gustavatmel | 1:9c5af431a1f1 | 359 | } |
gustavatmel | 1:9c5af431a1f1 | 360 | |
gustavatmel | 1:9c5af431a1f1 | 361 | |
gustavatmel | 1:9c5af431a1f1 | 362 | /** |
gustavatmel | 1:9c5af431a1f1 | 363 | * @brief Read USCI_UART data |
gustavatmel | 1:9c5af431a1f1 | 364 | * |
gustavatmel | 1:9c5af431a1f1 | 365 | * @param[in] uuart The pointer of the specified USCI_UART module. |
gustavatmel | 1:9c5af431a1f1 | 366 | * @param[in] pu8RxBuf The buffer to receive the data of receive buffer. |
gustavatmel | 1:9c5af431a1f1 | 367 | * @param[in] u32ReadBytes The read bytes number of data. |
gustavatmel | 1:9c5af431a1f1 | 368 | * |
gustavatmel | 1:9c5af431a1f1 | 369 | * @return Receive byte count |
gustavatmel | 1:9c5af431a1f1 | 370 | * |
gustavatmel | 1:9c5af431a1f1 | 371 | * @details The function is used to read Rx data from RX buffer and the data will be stored in pu8RxBuf. |
gustavatmel | 1:9c5af431a1f1 | 372 | */ |
gustavatmel | 1:9c5af431a1f1 | 373 | uint32_t UUART_Read(UUART_T* uuart, uint8_t pu8RxBuf[], uint32_t u32ReadBytes) |
gustavatmel | 1:9c5af431a1f1 | 374 | { |
gustavatmel | 1:9c5af431a1f1 | 375 | uint32_t u32Count, u32delayno; |
gustavatmel | 1:9c5af431a1f1 | 376 | |
gustavatmel | 1:9c5af431a1f1 | 377 | for(u32Count = 0ul; u32Count < u32ReadBytes; u32Count++) { |
gustavatmel | 1:9c5af431a1f1 | 378 | u32delayno = 0ul; |
gustavatmel | 1:9c5af431a1f1 | 379 | |
gustavatmel | 1:9c5af431a1f1 | 380 | while(uuart->BUFSTS & UUART_BUFSTS_RXEMPTY_Msk) { /* Check RX empty => failed */ |
gustavatmel | 1:9c5af431a1f1 | 381 | u32delayno++; |
gustavatmel | 1:9c5af431a1f1 | 382 | if(u32delayno >= 0x40000000ul) { |
gustavatmel | 1:9c5af431a1f1 | 383 | break; |
gustavatmel | 1:9c5af431a1f1 | 384 | } |
gustavatmel | 1:9c5af431a1f1 | 385 | } |
gustavatmel | 1:9c5af431a1f1 | 386 | |
gustavatmel | 1:9c5af431a1f1 | 387 | if(u32delayno >= 0x40000000ul) { |
gustavatmel | 1:9c5af431a1f1 | 388 | break; |
gustavatmel | 1:9c5af431a1f1 | 389 | } |
gustavatmel | 1:9c5af431a1f1 | 390 | |
gustavatmel | 1:9c5af431a1f1 | 391 | pu8RxBuf[u32Count] = (uint8_t)uuart->RXDAT; /* Get Data from USCI RX */ |
gustavatmel | 1:9c5af431a1f1 | 392 | } |
gustavatmel | 1:9c5af431a1f1 | 393 | |
gustavatmel | 1:9c5af431a1f1 | 394 | return u32Count; |
gustavatmel | 1:9c5af431a1f1 | 395 | |
gustavatmel | 1:9c5af431a1f1 | 396 | } |
gustavatmel | 1:9c5af431a1f1 | 397 | |
gustavatmel | 1:9c5af431a1f1 | 398 | |
gustavatmel | 1:9c5af431a1f1 | 399 | /** |
gustavatmel | 1:9c5af431a1f1 | 400 | * @brief Set USCI_UART line configuration |
gustavatmel | 1:9c5af431a1f1 | 401 | * |
gustavatmel | 1:9c5af431a1f1 | 402 | * @param[in] uuart The pointer of the specified USCI_UART module. |
gustavatmel | 1:9c5af431a1f1 | 403 | * @param[in] u32baudrate The register value of baud rate of USCI_UART module. |
gustavatmel | 1:9c5af431a1f1 | 404 | * If u32baudrate = 0, USCI_UART baud rate will not change. |
gustavatmel | 1:9c5af431a1f1 | 405 | * @param[in] u32data_width The data length of USCI_UART module. |
gustavatmel | 1:9c5af431a1f1 | 406 | * - \ref UUART_WORD_LEN_6 |
gustavatmel | 1:9c5af431a1f1 | 407 | * - \ref UUART_WORD_LEN_7 |
gustavatmel | 1:9c5af431a1f1 | 408 | * - \ref UUART_WORD_LEN_8 |
gustavatmel | 1:9c5af431a1f1 | 409 | * - \ref UUART_WORD_LEN_9 |
gustavatmel | 1:9c5af431a1f1 | 410 | * @param[in] u32parity The parity setting (none/odd/even) of USCI_UART module. |
gustavatmel | 1:9c5af431a1f1 | 411 | * - \ref UUART_PARITY_NONE |
gustavatmel | 1:9c5af431a1f1 | 412 | * - \ref UUART_PARITY_ODD |
gustavatmel | 1:9c5af431a1f1 | 413 | * - \ref UUART_PARITY_EVEN |
gustavatmel | 1:9c5af431a1f1 | 414 | * @param[in] u32stop_bits The stop bit length (1/2 bit) of USCI_UART module. |
gustavatmel | 1:9c5af431a1f1 | 415 | * - \ref UUART_STOP_BIT_1 |
gustavatmel | 1:9c5af431a1f1 | 416 | * - \ref UUART_STOP_BIT_2 |
gustavatmel | 1:9c5af431a1f1 | 417 | * |
gustavatmel | 1:9c5af431a1f1 | 418 | * @return Real baud rate of USCI_UART module. |
gustavatmel | 1:9c5af431a1f1 | 419 | * |
gustavatmel | 1:9c5af431a1f1 | 420 | * @details This function use to config USCI_UART line setting. |
gustavatmel | 1:9c5af431a1f1 | 421 | */ |
gustavatmel | 1:9c5af431a1f1 | 422 | uint32_t UUART_SetLine_Config(UUART_T* uuart, uint32_t u32baudrate, uint32_t u32data_width, uint32_t u32parity, uint32_t u32stop_bits) |
gustavatmel | 1:9c5af431a1f1 | 423 | { |
gustavatmel | 1:9c5af431a1f1 | 424 | uint32_t u32PCLKFreq, u32PDSClk, u32PDSCnt, u32DSCnt, u32ClkDiv; |
gustavatmel | 1:9c5af431a1f1 | 425 | uint32_t u32Tmp, u32Tmp2, u32Min, u32MinClkDiv, u32MinDSCnt; |
gustavatmel | 1:9c5af431a1f1 | 426 | |
gustavatmel | 1:9c5af431a1f1 | 427 | /* Get PCLK frequency */ |
gustavatmel | 1:9c5af431a1f1 | 428 | if(uuart == UUART0) { |
gustavatmel | 1:9c5af431a1f1 | 429 | u32PDSClk = u32PCLKFreq = CLK_GetPCLK0Freq(); |
gustavatmel | 1:9c5af431a1f1 | 430 | } else { /* UUART1 */ |
gustavatmel | 1:9c5af431a1f1 | 431 | u32PDSClk = u32PCLKFreq = CLK_GetPCLK1Freq(); |
gustavatmel | 1:9c5af431a1f1 | 432 | } |
gustavatmel | 1:9c5af431a1f1 | 433 | |
gustavatmel | 1:9c5af431a1f1 | 434 | if(u32baudrate != 0ul) { |
gustavatmel | 1:9c5af431a1f1 | 435 | for(u32PDSCnt = 1ul; u32PDSCnt <= 0x04ul; u32PDSCnt++) { /* PDSCNT could be 0~0x3 */ |
gustavatmel | 1:9c5af431a1f1 | 436 | u32PDSClk = u32PCLKFreq / u32PDSCnt; |
gustavatmel | 1:9c5af431a1f1 | 437 | |
gustavatmel | 1:9c5af431a1f1 | 438 | if(u32PDSClk > (80000000ul/4ul)) { /* max. PCLK freq = 80MHz */ |
gustavatmel | 1:9c5af431a1f1 | 439 | } else { |
gustavatmel | 1:9c5af431a1f1 | 440 | break; |
gustavatmel | 1:9c5af431a1f1 | 441 | } |
gustavatmel | 1:9c5af431a1f1 | 442 | } |
gustavatmel | 1:9c5af431a1f1 | 443 | |
gustavatmel | 1:9c5af431a1f1 | 444 | /* Find best solution */ |
gustavatmel | 1:9c5af431a1f1 | 445 | u32Min = (uint32_t) - 1; |
gustavatmel | 1:9c5af431a1f1 | 446 | u32MinDSCnt = 0ul; |
gustavatmel | 1:9c5af431a1f1 | 447 | u32MinClkDiv = 0ul; |
gustavatmel | 1:9c5af431a1f1 | 448 | for(u32DSCnt = 6ul; u32DSCnt <= 0x10ul; u32DSCnt++) { /* DSCNT could be 0x5~0xF */ |
gustavatmel | 1:9c5af431a1f1 | 449 | for(u32ClkDiv = 1ul; u32ClkDiv <= 0x400ul; u32ClkDiv++) { /* CLKDIV could be 0~0x3FF */ |
gustavatmel | 1:9c5af431a1f1 | 450 | u32Tmp = u32PDSClk / u32DSCnt / u32ClkDiv; |
gustavatmel | 1:9c5af431a1f1 | 451 | |
gustavatmel | 1:9c5af431a1f1 | 452 | u32Tmp2 = (u32Tmp > u32baudrate) ? u32Tmp - u32baudrate : u32baudrate - u32Tmp; |
gustavatmel | 1:9c5af431a1f1 | 453 | |
gustavatmel | 1:9c5af431a1f1 | 454 | if(u32Tmp2 < u32Min) { |
gustavatmel | 1:9c5af431a1f1 | 455 | u32Min = u32Tmp2; |
gustavatmel | 1:9c5af431a1f1 | 456 | u32MinDSCnt = u32DSCnt; |
gustavatmel | 1:9c5af431a1f1 | 457 | u32MinClkDiv = u32ClkDiv; |
gustavatmel | 1:9c5af431a1f1 | 458 | |
gustavatmel | 1:9c5af431a1f1 | 459 | /* Break when get good results */ |
gustavatmel | 1:9c5af431a1f1 | 460 | if(u32Min == 0ul) { |
gustavatmel | 1:9c5af431a1f1 | 461 | break; |
gustavatmel | 1:9c5af431a1f1 | 462 | } |
gustavatmel | 1:9c5af431a1f1 | 463 | } |
gustavatmel | 1:9c5af431a1f1 | 464 | } |
gustavatmel | 1:9c5af431a1f1 | 465 | } |
gustavatmel | 1:9c5af431a1f1 | 466 | |
gustavatmel | 1:9c5af431a1f1 | 467 | /* Set USCI_UART baud rate */ |
gustavatmel | 1:9c5af431a1f1 | 468 | uuart->BRGEN = ((u32MinClkDiv-1ul) << UUART_BRGEN_CLKDIV_Pos) | |
gustavatmel | 1:9c5af431a1f1 | 469 | ((u32MinDSCnt-1ul) << UUART_BRGEN_DSCNT_Pos) | |
gustavatmel | 1:9c5af431a1f1 | 470 | ((u32PDSCnt-1ul) << UUART_BRGEN_PDSCNT_Pos); |
gustavatmel | 1:9c5af431a1f1 | 471 | } else { |
gustavatmel | 1:9c5af431a1f1 | 472 | u32PDSCnt = ((uuart->BRGEN & UUART_BRGEN_PDSCNT_Msk) >> UUART_BRGEN_PDSCNT_Pos) + 1ul; |
gustavatmel | 1:9c5af431a1f1 | 473 | u32MinDSCnt = ((uuart->BRGEN & UUART_BRGEN_DSCNT_Msk) >> UUART_BRGEN_DSCNT_Pos) + 1ul; |
gustavatmel | 1:9c5af431a1f1 | 474 | u32MinClkDiv = ((uuart->BRGEN & UUART_BRGEN_CLKDIV_Msk) >> UUART_BRGEN_CLKDIV_Pos) + 1ul; |
gustavatmel | 1:9c5af431a1f1 | 475 | } |
gustavatmel | 1:9c5af431a1f1 | 476 | |
gustavatmel | 1:9c5af431a1f1 | 477 | /* Set USCI_UART line configuration */ |
gustavatmel | 1:9c5af431a1f1 | 478 | uuart->LINECTL = (uuart->LINECTL & ~UUART_LINECTL_DWIDTH_Msk) | u32data_width; |
gustavatmel | 1:9c5af431a1f1 | 479 | uuart->PROTCTL = (uuart->PROTCTL & ~(UUART_PROTCTL_STICKEN_Msk | UUART_PROTCTL_EVENPARITY_Msk | |
gustavatmel | 1:9c5af431a1f1 | 480 | UUART_PROTCTL_PARITYEN_Msk)) | u32parity; |
gustavatmel | 1:9c5af431a1f1 | 481 | uuart->PROTCTL = (uuart->PROTCTL & ~UUART_PROTCTL_STOPB_Msk ) | u32stop_bits; |
gustavatmel | 1:9c5af431a1f1 | 482 | |
gustavatmel | 1:9c5af431a1f1 | 483 | return (u32PCLKFreq/u32PDSCnt/u32MinDSCnt/u32MinClkDiv); |
gustavatmel | 1:9c5af431a1f1 | 484 | } |
gustavatmel | 1:9c5af431a1f1 | 485 | |
gustavatmel | 1:9c5af431a1f1 | 486 | |
gustavatmel | 1:9c5af431a1f1 | 487 | /** |
gustavatmel | 1:9c5af431a1f1 | 488 | * @brief Write USCI_UART data |
gustavatmel | 1:9c5af431a1f1 | 489 | * |
gustavatmel | 1:9c5af431a1f1 | 490 | * @param[in] uuart The pointer of the specified USCI_UART module. |
gustavatmel | 1:9c5af431a1f1 | 491 | * @param[in] pu8TxBuf The buffer to send the data to USCI transmission buffer. |
gustavatmel | 1:9c5af431a1f1 | 492 | * @param[out] u32WriteBytes The byte number of data. |
gustavatmel | 1:9c5af431a1f1 | 493 | * |
gustavatmel | 1:9c5af431a1f1 | 494 | * @return Transfer byte count |
gustavatmel | 1:9c5af431a1f1 | 495 | * |
gustavatmel | 1:9c5af431a1f1 | 496 | * @details The function is to write data into TX buffer to transmit data by USCI_UART. |
gustavatmel | 1:9c5af431a1f1 | 497 | */ |
gustavatmel | 1:9c5af431a1f1 | 498 | uint32_t UUART_Write(UUART_T* uuart, uint8_t pu8TxBuf[], uint32_t u32WriteBytes) |
gustavatmel | 1:9c5af431a1f1 | 499 | { |
gustavatmel | 1:9c5af431a1f1 | 500 | uint32_t u32Count, u32delayno; |
gustavatmel | 1:9c5af431a1f1 | 501 | |
gustavatmel | 1:9c5af431a1f1 | 502 | for(u32Count = 0ul; u32Count != u32WriteBytes; u32Count++) { |
gustavatmel | 1:9c5af431a1f1 | 503 | u32delayno = 0ul; |
gustavatmel | 1:9c5af431a1f1 | 504 | while((uuart->BUFSTS & UUART_BUFSTS_TXEMPTY_Msk) == 0ul) { /* Wait Tx empty */ |
gustavatmel | 1:9c5af431a1f1 | 505 | u32delayno++; |
gustavatmel | 1:9c5af431a1f1 | 506 | if(u32delayno >= 0x40000000ul) { |
gustavatmel | 1:9c5af431a1f1 | 507 | break; |
gustavatmel | 1:9c5af431a1f1 | 508 | } |
gustavatmel | 1:9c5af431a1f1 | 509 | } |
gustavatmel | 1:9c5af431a1f1 | 510 | |
gustavatmel | 1:9c5af431a1f1 | 511 | if(u32delayno >= 0x40000000ul) { |
gustavatmel | 1:9c5af431a1f1 | 512 | break; |
gustavatmel | 1:9c5af431a1f1 | 513 | } |
gustavatmel | 1:9c5af431a1f1 | 514 | |
gustavatmel | 1:9c5af431a1f1 | 515 | uuart->TXDAT = (uint8_t)pu8TxBuf[u32Count]; /* Send USCI_UART Data to buffer */ |
gustavatmel | 1:9c5af431a1f1 | 516 | } |
gustavatmel | 1:9c5af431a1f1 | 517 | |
gustavatmel | 1:9c5af431a1f1 | 518 | return u32Count; |
gustavatmel | 1:9c5af431a1f1 | 519 | |
gustavatmel | 1:9c5af431a1f1 | 520 | } |
gustavatmel | 1:9c5af431a1f1 | 521 | |
gustavatmel | 1:9c5af431a1f1 | 522 | |
gustavatmel | 1:9c5af431a1f1 | 523 | /** |
gustavatmel | 1:9c5af431a1f1 | 524 | * @brief Enable USCI_UART Wake-up Function |
gustavatmel | 1:9c5af431a1f1 | 525 | * |
gustavatmel | 1:9c5af431a1f1 | 526 | * @param[in] uuart The pointer of the specified USCI_UART module. |
gustavatmel | 1:9c5af431a1f1 | 527 | * @param[in] u32WakeupMode The wakeup mode of USCI_UART module. |
gustavatmel | 1:9c5af431a1f1 | 528 | * - \ref UUART_PROTCTL_DATWKEN_Msk : Data wake-up Mode |
gustavatmel | 1:9c5af431a1f1 | 529 | * - \ref UUART_PROTCTL_CTSWKEN_Msk : nCTS wake-up Mode |
gustavatmel | 1:9c5af431a1f1 | 530 | * |
gustavatmel | 1:9c5af431a1f1 | 531 | * @return None |
gustavatmel | 1:9c5af431a1f1 | 532 | * |
gustavatmel | 1:9c5af431a1f1 | 533 | * @details The function is used to enable Wake-up function of USCI_UART. |
gustavatmel | 1:9c5af431a1f1 | 534 | */ |
gustavatmel | 1:9c5af431a1f1 | 535 | void UUART_EnableWakeup(UUART_T* uuart, uint32_t u32WakeupMode) |
gustavatmel | 1:9c5af431a1f1 | 536 | { |
gustavatmel | 1:9c5af431a1f1 | 537 | uuart->PROTCTL |= u32WakeupMode; |
gustavatmel | 1:9c5af431a1f1 | 538 | uuart->WKCTL |= UUART_WKCTL_WKEN_Msk; |
gustavatmel | 1:9c5af431a1f1 | 539 | } |
gustavatmel | 1:9c5af431a1f1 | 540 | |
gustavatmel | 1:9c5af431a1f1 | 541 | |
gustavatmel | 1:9c5af431a1f1 | 542 | /** |
gustavatmel | 1:9c5af431a1f1 | 543 | * @brief Disable USCI_UART Wake-up Function |
gustavatmel | 1:9c5af431a1f1 | 544 | * |
gustavatmel | 1:9c5af431a1f1 | 545 | * @param[in] uuart The pointer of the specified USCI_UART module. |
gustavatmel | 1:9c5af431a1f1 | 546 | * |
gustavatmel | 1:9c5af431a1f1 | 547 | * @return None |
gustavatmel | 1:9c5af431a1f1 | 548 | * |
gustavatmel | 1:9c5af431a1f1 | 549 | * @details The function is used to disable Wake-up function of USCI_UART. |
gustavatmel | 1:9c5af431a1f1 | 550 | */ |
gustavatmel | 1:9c5af431a1f1 | 551 | void UUART_DisableWakeup(UUART_T* uuart) |
gustavatmel | 1:9c5af431a1f1 | 552 | { |
gustavatmel | 1:9c5af431a1f1 | 553 | uuart->PROTCTL &= ~(UUART_PROTCTL_DATWKEN_Msk|UUART_PROTCTL_CTSWKEN_Msk); |
gustavatmel | 1:9c5af431a1f1 | 554 | uuart->WKCTL &= ~UUART_WKCTL_WKEN_Msk; |
gustavatmel | 1:9c5af431a1f1 | 555 | } |
gustavatmel | 1:9c5af431a1f1 | 556 | |
gustavatmel | 1:9c5af431a1f1 | 557 | /** |
gustavatmel | 1:9c5af431a1f1 | 558 | * @brief Enable USCI_UART auto flow control |
gustavatmel | 1:9c5af431a1f1 | 559 | * |
gustavatmel | 1:9c5af431a1f1 | 560 | * @param[in] uuart The pointer of the specified USCI_UART module. |
gustavatmel | 1:9c5af431a1f1 | 561 | * |
gustavatmel | 1:9c5af431a1f1 | 562 | * @return None |
gustavatmel | 1:9c5af431a1f1 | 563 | * |
gustavatmel | 1:9c5af431a1f1 | 564 | * @details The function is used to enable USCI_UART auto flow control. |
gustavatmel | 1:9c5af431a1f1 | 565 | */ |
gustavatmel | 1:9c5af431a1f1 | 566 | void UUART_EnableFlowCtrl(UUART_T* uuart) |
gustavatmel | 1:9c5af431a1f1 | 567 | { |
gustavatmel | 1:9c5af431a1f1 | 568 | /* Set RTS signal is low level active */ |
gustavatmel | 1:9c5af431a1f1 | 569 | uuart->LINECTL &= ~UUART_LINECTL_CTLOINV_Msk; |
gustavatmel | 1:9c5af431a1f1 | 570 | |
gustavatmel | 1:9c5af431a1f1 | 571 | /* Set CTS signal is low level active */ |
gustavatmel | 1:9c5af431a1f1 | 572 | uuart->CTLIN0 &= ~UUART_CTLIN0_ININV_Msk; |
gustavatmel | 1:9c5af431a1f1 | 573 | |
gustavatmel | 1:9c5af431a1f1 | 574 | /* Enable CTS and RTS auto flow control function */ |
gustavatmel | 1:9c5af431a1f1 | 575 | uuart->PROTCTL |= UUART_PROTCTL_RTSAUTOEN_Msk|UUART_PROTCTL_CTSAUTOEN_Msk; |
gustavatmel | 1:9c5af431a1f1 | 576 | } |
gustavatmel | 1:9c5af431a1f1 | 577 | |
gustavatmel | 1:9c5af431a1f1 | 578 | /** |
gustavatmel | 1:9c5af431a1f1 | 579 | * @brief Disable USCI_UART auto flow control |
gustavatmel | 1:9c5af431a1f1 | 580 | * |
gustavatmel | 1:9c5af431a1f1 | 581 | * @param[in] uuart The pointer of the specified USCI_UART module. |
gustavatmel | 1:9c5af431a1f1 | 582 | * |
gustavatmel | 1:9c5af431a1f1 | 583 | * @return None |
gustavatmel | 1:9c5af431a1f1 | 584 | * |
gustavatmel | 1:9c5af431a1f1 | 585 | * @details The function is used to disable USCI_UART auto flow control. |
gustavatmel | 1:9c5af431a1f1 | 586 | */ |
gustavatmel | 1:9c5af431a1f1 | 587 | void UUART_DisableFlowCtrl(UUART_T* uuart) |
gustavatmel | 1:9c5af431a1f1 | 588 | { |
gustavatmel | 1:9c5af431a1f1 | 589 | /* Disable CTS and RTS auto flow control function */ |
gustavatmel | 1:9c5af431a1f1 | 590 | uuart->PROTCTL &= ~(UUART_PROTCTL_RTSAUTOEN_Msk|UUART_PROTCTL_CTSAUTOEN_Msk); |
gustavatmel | 1:9c5af431a1f1 | 591 | } |
gustavatmel | 1:9c5af431a1f1 | 592 | |
gustavatmel | 1:9c5af431a1f1 | 593 | |
gustavatmel | 1:9c5af431a1f1 | 594 | |
gustavatmel | 1:9c5af431a1f1 | 595 | |
gustavatmel | 1:9c5af431a1f1 | 596 | /*@}*/ /* end of group M480_USCI_UART_EXPORTED_FUNCTIONS */ |
gustavatmel | 1:9c5af431a1f1 | 597 | |
gustavatmel | 1:9c5af431a1f1 | 598 | /*@}*/ /* end of group M480_USCI_UART_Driver */ |
gustavatmel | 1:9c5af431a1f1 | 599 | |
gustavatmel | 1:9c5af431a1f1 | 600 | /*@}*/ /* end of group M480_Device_Driver */ |
gustavatmel | 1:9c5af431a1f1 | 601 | |
gustavatmel | 1:9c5af431a1f1 | 602 | /*** (C) COPYRIGHT 2016 Nuvoton Technology Corp. ***/ |
gustavatmel | 1:9c5af431a1f1 | 603 |