added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
JojoS
Date:
Sat Sep 10 15:32:04 2016 +0000
Revision:
147:ba84b7dc41a7
Parent:
107:414e9c822e99
added prescaler for 16 bit timers (solution as in LPC11xx), default prescaler 31 for max 28 ms period time

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 107:414e9c822e99 1 /* mbed Microcontroller Library
mbed_official 107:414e9c822e99 2 * Copyright (c) 2006-2015 ARM Limited
mbed_official 107:414e9c822e99 3 *
mbed_official 107:414e9c822e99 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 107:414e9c822e99 5 * you may not use this file except in compliance with the License.
mbed_official 107:414e9c822e99 6 * You may obtain a copy of the License at
mbed_official 107:414e9c822e99 7 *
mbed_official 107:414e9c822e99 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 107:414e9c822e99 9 *
mbed_official 107:414e9c822e99 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 107:414e9c822e99 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 107:414e9c822e99 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 107:414e9c822e99 13 * See the License for the specific language governing permissions and
mbed_official 107:414e9c822e99 14 * limitations under the License.
mbed_official 107:414e9c822e99 15 */
mbed_official 107:414e9c822e99 16 #include <string.h>
mbed_official 107:414e9c822e99 17 #include "mbed_assert.h"
mbed_official 107:414e9c822e99 18 #include "cmsis.h"
mbed_official 107:414e9c822e99 19 #include "serial_api.h"
mbed_official 107:414e9c822e99 20 #include "sysclk.h"
mbed_official 107:414e9c822e99 21 #include "serial_platform.h"
mbed_official 107:414e9c822e99 22 #include "ioport.h"
mbed_official 107:414e9c822e99 23 #include "pinmap.h"
mbed_official 107:414e9c822e99 24 #include "PeripheralPins.h"
mbed_official 107:414e9c822e99 25 #include "pdc.h"
mbed_official 107:414e9c822e99 26
mbed_official 107:414e9c822e99 27 #if DEVICE_SERIAL_ASYNCH
mbed_official 107:414e9c822e99 28 #define pUSART_S(obj) obj->serial.uart
mbed_official 107:414e9c822e99 29 #define pSERIAL_S(obj) ((struct serial_s*)&(obj->serial))
mbed_official 107:414e9c822e99 30 #else
mbed_official 107:414e9c822e99 31 #define pUSART_S(obj) obj->uart
mbed_official 107:414e9c822e99 32 #define pSERIAL_S(obj) ((struct serial_s*)obj)
mbed_official 107:414e9c822e99 33 #endif
mbed_official 107:414e9c822e99 34 #define _USART(obj) ((Usart*)pUSART_S(obj))
mbed_official 107:414e9c822e99 35 #define USART_NUM 8
mbed_official 107:414e9c822e99 36
mbed_official 107:414e9c822e99 37 static uint8_t serial_get_index(serial_t *obj);
mbed_official 107:414e9c822e99 38 static IRQn_Type get_serial_irq_num (serial_t *obj);
mbed_official 107:414e9c822e99 39 static uint32_t get_serial_vector (serial_t *obj);
mbed_official 107:414e9c822e99 40 static uint32_t serial_irq_ids[USART_NUM] = {0};
mbed_official 107:414e9c822e99 41 static uart_irq_handler irq_handler;
mbed_official 107:414e9c822e99 42 static void uart0_irq(void);
mbed_official 107:414e9c822e99 43 static void uart1_irq(void);
mbed_official 107:414e9c822e99 44 static void uart2_irq(void);
mbed_official 107:414e9c822e99 45 static void uart3_irq(void);
mbed_official 107:414e9c822e99 46 static void uart4_irq(void);
mbed_official 107:414e9c822e99 47 static void uart5_irq(void);
mbed_official 107:414e9c822e99 48 static void uart6_irq(void);
mbed_official 107:414e9c822e99 49 static void uart7_irq(void);
mbed_official 107:414e9c822e99 50
mbed_official 107:414e9c822e99 51
mbed_official 107:414e9c822e99 52 int stdio_uart_inited = 0;
mbed_official 107:414e9c822e99 53 serial_t stdio_uart;
mbed_official 107:414e9c822e99 54
mbed_official 107:414e9c822e99 55 extern uint8_t g_sys_init;
mbed_official 107:414e9c822e99 56
mbed_official 107:414e9c822e99 57 static int get_usart_clock_id(UARTName peripheral)
mbed_official 107:414e9c822e99 58 {
mbed_official 107:414e9c822e99 59 int cid;
mbed_official 107:414e9c822e99 60 switch (peripheral) {
mbed_official 107:414e9c822e99 61 case UART_0:
mbed_official 107:414e9c822e99 62 cid = ID_FLEXCOM0;
mbed_official 107:414e9c822e99 63 break;
mbed_official 107:414e9c822e99 64 case UART_1:
mbed_official 107:414e9c822e99 65 cid = ID_FLEXCOM1;
mbed_official 107:414e9c822e99 66 break;
mbed_official 107:414e9c822e99 67 case UART_2:
mbed_official 107:414e9c822e99 68 cid = ID_FLEXCOM2;
mbed_official 107:414e9c822e99 69 break;
mbed_official 107:414e9c822e99 70 case UART_3:
mbed_official 107:414e9c822e99 71 cid = ID_FLEXCOM3;
mbed_official 107:414e9c822e99 72 break;
mbed_official 107:414e9c822e99 73 case UART_4:
mbed_official 107:414e9c822e99 74 cid = ID_FLEXCOM4;
mbed_official 107:414e9c822e99 75 break;
mbed_official 107:414e9c822e99 76 case UART_5:
mbed_official 107:414e9c822e99 77 cid = ID_FLEXCOM5;
mbed_official 107:414e9c822e99 78 break;
mbed_official 107:414e9c822e99 79 case UART_6:
mbed_official 107:414e9c822e99 80 cid = ID_FLEXCOM6;
mbed_official 107:414e9c822e99 81 break;
mbed_official 107:414e9c822e99 82 case UART_7:
mbed_official 107:414e9c822e99 83 cid = ID_FLEXCOM7;
mbed_official 107:414e9c822e99 84 break;
mbed_official 107:414e9c822e99 85 default :
mbed_official 107:414e9c822e99 86 cid = NC;
mbed_official 107:414e9c822e99 87 break;
mbed_official 107:414e9c822e99 88 }
mbed_official 107:414e9c822e99 89 return cid;
mbed_official 107:414e9c822e99 90 }
mbed_official 107:414e9c822e99 91
mbed_official 107:414e9c822e99 92 static int get_flexcom_id(UARTName peripheral)
mbed_official 107:414e9c822e99 93 {
mbed_official 107:414e9c822e99 94 int fid;
mbed_official 107:414e9c822e99 95 switch (peripheral) {
mbed_official 107:414e9c822e99 96 case UART_0:
mbed_official 107:414e9c822e99 97 fid = (int)FLEXCOM0;
mbed_official 107:414e9c822e99 98 break;
mbed_official 107:414e9c822e99 99 case UART_1:
mbed_official 107:414e9c822e99 100 fid = (int)FLEXCOM1;
mbed_official 107:414e9c822e99 101 break;
mbed_official 107:414e9c822e99 102 case UART_2:
mbed_official 107:414e9c822e99 103 fid = (int)FLEXCOM2;
mbed_official 107:414e9c822e99 104 break;
mbed_official 107:414e9c822e99 105 case UART_3:
mbed_official 107:414e9c822e99 106 fid = (int)FLEXCOM3;
mbed_official 107:414e9c822e99 107 break;
mbed_official 107:414e9c822e99 108 case UART_4:
mbed_official 107:414e9c822e99 109 fid = (int)FLEXCOM4;
mbed_official 107:414e9c822e99 110 break;
mbed_official 107:414e9c822e99 111 case UART_5:
mbed_official 107:414e9c822e99 112 fid = (int)FLEXCOM5;
mbed_official 107:414e9c822e99 113 break;
mbed_official 107:414e9c822e99 114 case UART_6:
mbed_official 107:414e9c822e99 115 fid = (int)FLEXCOM6;
mbed_official 107:414e9c822e99 116 break;
mbed_official 107:414e9c822e99 117 case UART_7:
mbed_official 107:414e9c822e99 118 fid = (int)FLEXCOM7;
mbed_official 107:414e9c822e99 119 break;
mbed_official 107:414e9c822e99 120 default :
mbed_official 107:414e9c822e99 121 fid = NC;
mbed_official 107:414e9c822e99 122 break;
mbed_official 107:414e9c822e99 123 }
mbed_official 107:414e9c822e99 124 return fid;
mbed_official 107:414e9c822e99 125 }
mbed_official 107:414e9c822e99 126
mbed_official 107:414e9c822e99 127 void serial_init(serial_t *obj, PinName tx, PinName rx)
mbed_official 107:414e9c822e99 128 {
mbed_official 107:414e9c822e99 129 /* Sanity check arguments */
mbed_official 107:414e9c822e99 130 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 131 int clockid = NC, flexcom = NC;
mbed_official 107:414e9c822e99 132
mbed_official 107:414e9c822e99 133 /*To determine the uart peripheral associated with pins*/
mbed_official 107:414e9c822e99 134 UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX);
mbed_official 107:414e9c822e99 135 UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX);
mbed_official 107:414e9c822e99 136 UARTName uart = (UARTName)pinmap_merge(uart_tx, uart_rx);
mbed_official 107:414e9c822e99 137
mbed_official 107:414e9c822e99 138 MBED_ASSERT(uart != (UARTName)NC);
mbed_official 107:414e9c822e99 139
mbed_official 107:414e9c822e99 140 if (g_sys_init == 0) {
mbed_official 107:414e9c822e99 141 sysclk_init();
mbed_official 107:414e9c822e99 142 system_board_init();
mbed_official 107:414e9c822e99 143 g_sys_init = 1;
mbed_official 107:414e9c822e99 144 }
mbed_official 107:414e9c822e99 145 pUSART_S(obj) = uart;
mbed_official 107:414e9c822e99 146 pSERIAL_S(obj)->uart_serial_options.baudrate = (9600UL);
mbed_official 107:414e9c822e99 147 pSERIAL_S(obj)->uart_serial_options.charlength = US_MR_CHRL_8_BIT;
mbed_official 107:414e9c822e99 148 pSERIAL_S(obj)->uart_serial_options.paritytype = US_MR_PAR_NO;
mbed_official 107:414e9c822e99 149 pSERIAL_S(obj)->uart_serial_options.stopbits = US_MR_NBSTOP_1_BIT;
mbed_official 107:414e9c822e99 150 pSERIAL_S(obj)->actrec = false;
mbed_official 107:414e9c822e99 151 pSERIAL_S(obj)->acttra = false;
mbed_official 107:414e9c822e99 152
mbed_official 107:414e9c822e99 153 /* Configure UART pins */
mbed_official 107:414e9c822e99 154 if(tx != NC) {
mbed_official 107:414e9c822e99 155 pin_function(tx, pinmap_find_function(tx, PinMap_UART_TX));
mbed_official 107:414e9c822e99 156 ioport_disable_pin(tx);
mbed_official 107:414e9c822e99 157 }
mbed_official 107:414e9c822e99 158 if(rx != NC) {
mbed_official 107:414e9c822e99 159 pin_function(rx, pinmap_find_function(rx, PinMap_UART_RX));
mbed_official 107:414e9c822e99 160 ioport_disable_pin(rx);
mbed_official 107:414e9c822e99 161 }
mbed_official 107:414e9c822e99 162 clockid = get_usart_clock_id(uart);
mbed_official 107:414e9c822e99 163 if (clockid != NC) {
mbed_official 107:414e9c822e99 164 sysclk_enable_peripheral_clock(clockid);
mbed_official 107:414e9c822e99 165 }
mbed_official 107:414e9c822e99 166
mbed_official 107:414e9c822e99 167 flexcom = (int)get_flexcom_id(uart);
mbed_official 107:414e9c822e99 168 #if (!SAM4L)
mbed_official 107:414e9c822e99 169 #if (SAMG55)
mbed_official 107:414e9c822e99 170 /* Configure flexcom for usart */
mbed_official 107:414e9c822e99 171 flexcom_enable((Flexcom* )flexcom);
mbed_official 107:414e9c822e99 172 flexcom_set_opmode((Flexcom* )flexcom, FLEXCOM_USART);
mbed_official 107:414e9c822e99 173 #else
mbed_official 107:414e9c822e99 174 sysclk_enable_peripheral_clock(clockid);
mbed_official 107:414e9c822e99 175 #endif
mbed_official 107:414e9c822e99 176 /* Configure USART */
mbed_official 107:414e9c822e99 177 usart_init_rs232((Usart*)uart, (sam_usart_opt_t*)&(pSERIAL_S(obj)->uart_serial_options),
mbed_official 107:414e9c822e99 178 sysclk_get_peripheral_hz());
mbed_official 107:414e9c822e99 179 #endif
mbed_official 107:414e9c822e99 180 #if (SAM4L)
mbed_official 107:414e9c822e99 181 sysclk_enable_peripheral_clock(clockid);
mbed_official 107:414e9c822e99 182 /* Configure USART */
mbed_official 107:414e9c822e99 183 usart_init_rs232((Usart*)uart, (sam_usart_opt_t*)&(pSERIAL_S(obj)->uart_serial_options, sysclk_get_peripheral_bus_hz((Usart*)uart));
mbed_official 107:414e9c822e99 184 #endif
mbed_official 107:414e9c822e99 185 /* Disable rx and tx in case 1 line only required to be configured for usart */
mbed_official 107:414e9c822e99 186 usart_disable_tx((Usart*)uart);
mbed_official 107:414e9c822e99 187 usart_disable_rx((Usart*)uart);
mbed_official 107:414e9c822e99 188 /* Enable the receiver and transmitter. */
mbed_official 107:414e9c822e99 189 if(tx != NC) {
mbed_official 107:414e9c822e99 190 usart_enable_tx((Usart*)uart);
mbed_official 107:414e9c822e99 191 }
mbed_official 107:414e9c822e99 192 if(rx != NC) {
mbed_official 107:414e9c822e99 193 usart_enable_rx((Usart*)uart);
mbed_official 107:414e9c822e99 194 }
mbed_official 107:414e9c822e99 195
mbed_official 107:414e9c822e99 196 if(uart == STDIO_UART) {
mbed_official 107:414e9c822e99 197 stdio_uart_inited = 1;
mbed_official 107:414e9c822e99 198 memcpy(&stdio_uart, obj, sizeof(serial_t));
mbed_official 107:414e9c822e99 199 }
mbed_official 107:414e9c822e99 200 }
mbed_official 107:414e9c822e99 201
mbed_official 107:414e9c822e99 202 void serial_free(serial_t *obj)
mbed_official 107:414e9c822e99 203 {
mbed_official 107:414e9c822e99 204 /* Sanity check arguments */
mbed_official 107:414e9c822e99 205 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 206 usart_reset(_USART(obj));
mbed_official 107:414e9c822e99 207 }
mbed_official 107:414e9c822e99 208
mbed_official 107:414e9c822e99 209 void serial_baud(serial_t *obj, int baudrate)
mbed_official 107:414e9c822e99 210 {
mbed_official 107:414e9c822e99 211 /* Sanity check arguments */
mbed_official 107:414e9c822e99 212 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 213 MBED_ASSERT((baudrate == 110) || (baudrate == 150) || (baudrate == 300) || (baudrate == 1200) ||
mbed_official 107:414e9c822e99 214 (baudrate == 2400) || (baudrate == 4800) || (baudrate == 9600) || (baudrate == 19200) || (baudrate == 38400) ||
mbed_official 107:414e9c822e99 215 (baudrate == 57600) || (baudrate == 115200) || (baudrate == 230400) || (baudrate == 460800) || (baudrate == 921600) );
mbed_official 107:414e9c822e99 216 uint32_t clockid = 0;
mbed_official 107:414e9c822e99 217 clockid = get_usart_clock_id(pUSART_S(obj));
mbed_official 107:414e9c822e99 218 if (clockid != (uint32_t)NC) {
mbed_official 107:414e9c822e99 219 sysclk_disable_peripheral_clock(clockid);
mbed_official 107:414e9c822e99 220 }
mbed_official 107:414e9c822e99 221 pSERIAL_S(obj)->uart_serial_options.baudrate = baudrate;
mbed_official 107:414e9c822e99 222 usart_serial_init(_USART(obj), &(pSERIAL_S(obj)->uart_serial_options));
mbed_official 107:414e9c822e99 223 sysclk_enable_peripheral_clock(clockid);
mbed_official 107:414e9c822e99 224 }
mbed_official 107:414e9c822e99 225
mbed_official 107:414e9c822e99 226 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
mbed_official 107:414e9c822e99 227 {
mbed_official 107:414e9c822e99 228 /* Sanity check arguments */
mbed_official 107:414e9c822e99 229 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 230 MBED_ASSERT((stop_bits == 1) || (stop_bits == 2));
mbed_official 107:414e9c822e99 231 MBED_ASSERT((parity == ParityNone) || (parity == ParityOdd) || (parity == ParityEven));
mbed_official 107:414e9c822e99 232 MBED_ASSERT((data_bits == 5) || (data_bits == 6) || (data_bits == 7) || (data_bits == 8));
mbed_official 107:414e9c822e99 233
mbed_official 107:414e9c822e99 234 uint32_t clockid = 0;
mbed_official 107:414e9c822e99 235 clockid = get_usart_clock_id(pUSART_S(obj));
mbed_official 107:414e9c822e99 236 if (clockid != (uint32_t)NC) {
mbed_official 107:414e9c822e99 237 sysclk_disable_peripheral_clock(clockid);
mbed_official 107:414e9c822e99 238 }
mbed_official 107:414e9c822e99 239
mbed_official 107:414e9c822e99 240 switch(stop_bits) { /*selecting the stop bits*/
mbed_official 107:414e9c822e99 241 case 1:
mbed_official 107:414e9c822e99 242 pSERIAL_S(obj)->uart_serial_options.stopbits = US_MR_NBSTOP_1_BIT;
mbed_official 107:414e9c822e99 243 break;
mbed_official 107:414e9c822e99 244 case 2:
mbed_official 107:414e9c822e99 245 pSERIAL_S(obj)->uart_serial_options.stopbits = US_MR_NBSTOP_2_BIT;
mbed_official 107:414e9c822e99 246 break;
mbed_official 107:414e9c822e99 247 }
mbed_official 107:414e9c822e99 248
mbed_official 107:414e9c822e99 249 switch(parity) { /*selecting the parity bits*/
mbed_official 107:414e9c822e99 250 case ParityNone:
mbed_official 107:414e9c822e99 251 pSERIAL_S(obj)->uart_serial_options.paritytype = US_MR_PAR_NO;
mbed_official 107:414e9c822e99 252 break;
mbed_official 107:414e9c822e99 253 case ParityOdd:
mbed_official 107:414e9c822e99 254 pSERIAL_S(obj)->uart_serial_options.paritytype = US_MR_PAR_ODD;
mbed_official 107:414e9c822e99 255 break;
mbed_official 107:414e9c822e99 256 case ParityEven:
mbed_official 107:414e9c822e99 257 pSERIAL_S(obj)->uart_serial_options.paritytype = US_MR_PAR_EVEN;
mbed_official 107:414e9c822e99 258 break;
mbed_official 107:414e9c822e99 259 case ParityForced1: /*No Hardware Support*/
mbed_official 107:414e9c822e99 260 MBED_ASSERT(0);
mbed_official 107:414e9c822e99 261 break;
mbed_official 107:414e9c822e99 262 case ParityForced0: /*No Hardware Support*/
mbed_official 107:414e9c822e99 263 MBED_ASSERT(0);
mbed_official 107:414e9c822e99 264 break;
mbed_official 107:414e9c822e99 265 }
mbed_official 107:414e9c822e99 266
mbed_official 107:414e9c822e99 267 switch(data_bits) { /*selecting the data bits*/
mbed_official 107:414e9c822e99 268 case 5:
mbed_official 107:414e9c822e99 269 pSERIAL_S(obj)->uart_serial_options.charlength = US_MR_CHRL_5_BIT;
mbed_official 107:414e9c822e99 270 break;
mbed_official 107:414e9c822e99 271 case 6:
mbed_official 107:414e9c822e99 272 pSERIAL_S(obj)->uart_serial_options.charlength = US_MR_CHRL_6_BIT;
mbed_official 107:414e9c822e99 273 break;
mbed_official 107:414e9c822e99 274 case 7:
mbed_official 107:414e9c822e99 275 pSERIAL_S(obj)->uart_serial_options.charlength = US_MR_CHRL_7_BIT;
mbed_official 107:414e9c822e99 276 break;
mbed_official 107:414e9c822e99 277 case 8:
mbed_official 107:414e9c822e99 278 pSERIAL_S(obj)->uart_serial_options.charlength = US_MR_CHRL_8_BIT;
mbed_official 107:414e9c822e99 279 break;
mbed_official 107:414e9c822e99 280 }
mbed_official 107:414e9c822e99 281
mbed_official 107:414e9c822e99 282 usart_serial_init(_USART(obj), &(pSERIAL_S(obj)->uart_serial_options));
mbed_official 107:414e9c822e99 283 sysclk_enable_peripheral_clock(clockid);
mbed_official 107:414e9c822e99 284 }
mbed_official 107:414e9c822e99 285
mbed_official 107:414e9c822e99 286 #ifdef DEVICE_SERIAL_FC
mbed_official 107:414e9c822e99 287
mbed_official 107:414e9c822e99 288 void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow)
mbed_official 107:414e9c822e99 289 {
mbed_official 107:414e9c822e99 290 /* Sanity check arguments */
mbed_official 107:414e9c822e99 291 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 292
mbed_official 107:414e9c822e99 293 if(FlowControlNone == type) {
mbed_official 107:414e9c822e99 294 /* Disable Hardware Handshaking. */
mbed_official 107:414e9c822e99 295 _USART(obj)->US_MR = (_USART(obj)->US_MR & ~US_MR_USART_MODE_Msk) | US_MR_USART_MODE_NORMAL;
mbed_official 107:414e9c822e99 296 return;
mbed_official 107:414e9c822e99 297 }
mbed_official 107:414e9c822e99 298
mbed_official 107:414e9c822e99 299 /*To determine the uart peripheral associated with pins*/
mbed_official 107:414e9c822e99 300 UARTName uart_cts = (UARTName)pinmap_peripheral(txflow, PinMap_UART_CTS);
mbed_official 107:414e9c822e99 301 UARTName uart_rts = (UARTName)pinmap_peripheral(rxflow, PinMap_UART_RTS);
mbed_official 107:414e9c822e99 302 UARTName uart = (UARTName)pinmap_merge(uart_cts, uart_rts);
mbed_official 107:414e9c822e99 303 MBED_ASSERT(uart != (UARTName)NC);
mbed_official 107:414e9c822e99 304
mbed_official 107:414e9c822e99 305 if((FlowControlCTS == type) || (FlowControlRTSCTS== type)) {
mbed_official 107:414e9c822e99 306 /* Configure CTS pin. */
mbed_official 107:414e9c822e99 307 pin_function(txflow, pinmap_find_function(txflow, PinMap_UART_CTS));
mbed_official 107:414e9c822e99 308 ioport_disable_pin(txflow);
mbed_official 107:414e9c822e99 309 }
mbed_official 107:414e9c822e99 310
mbed_official 107:414e9c822e99 311 if((FlowControlRTS == type) || (FlowControlRTSCTS== type)) {
mbed_official 107:414e9c822e99 312 /* Configure CTS pin. */
mbed_official 107:414e9c822e99 313 pin_function(rxflow, pinmap_find_function(rxflow, PinMap_UART_RTS));
mbed_official 107:414e9c822e99 314 ioport_disable_pin(rxflow);
mbed_official 107:414e9c822e99 315 }
mbed_official 107:414e9c822e99 316
mbed_official 107:414e9c822e99 317 /* Set hardware handshaking mode. */
mbed_official 107:414e9c822e99 318 _USART(obj)->US_MR = (_USART(obj)->US_MR & ~US_MR_USART_MODE_Msk) | US_MR_USART_MODE_HW_HANDSHAKING;
mbed_official 107:414e9c822e99 319 }
mbed_official 107:414e9c822e99 320
mbed_official 107:414e9c822e99 321 #endif //DEVICE_SERIAL_FC
mbed_official 107:414e9c822e99 322
mbed_official 107:414e9c822e99 323 void serial_break_set(serial_t *obj)
mbed_official 107:414e9c822e99 324 {
mbed_official 107:414e9c822e99 325 /* Sanity check arguments */
mbed_official 107:414e9c822e99 326 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 327 _USART(obj)->US_CR = US_CR_STTBRK;
mbed_official 107:414e9c822e99 328
mbed_official 107:414e9c822e99 329 }
mbed_official 107:414e9c822e99 330
mbed_official 107:414e9c822e99 331 void serial_break_clear(serial_t *obj)
mbed_official 107:414e9c822e99 332 {
mbed_official 107:414e9c822e99 333 /* Sanity check arguments */
mbed_official 107:414e9c822e99 334 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 335 _USART(obj)->US_CR = US_CR_STPBRK;
mbed_official 107:414e9c822e99 336
mbed_official 107:414e9c822e99 337 }
mbed_official 107:414e9c822e99 338
mbed_official 107:414e9c822e99 339 void serial_pinout_tx(PinName tx)
mbed_official 107:414e9c822e99 340 {
mbed_official 107:414e9c822e99 341 pin_function(tx, pinmap_find_function(tx, PinMap_UART_TX));
mbed_official 107:414e9c822e99 342 ioport_disable_pin(tx);
mbed_official 107:414e9c822e99 343 }
mbed_official 107:414e9c822e99 344
mbed_official 107:414e9c822e99 345 /******************************************************************************
mbed_official 107:414e9c822e99 346 * INTERRUPTS HANDLING
mbed_official 107:414e9c822e99 347 ******************************************************************************/
mbed_official 107:414e9c822e99 348
mbed_official 107:414e9c822e99 349 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
mbed_official 107:414e9c822e99 350 {
mbed_official 107:414e9c822e99 351 /* Sanity check arguments */
mbed_official 107:414e9c822e99 352 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 353 irq_handler = handler;
mbed_official 107:414e9c822e99 354 serial_irq_ids[serial_get_index(obj)] = id;
mbed_official 107:414e9c822e99 355 }
mbed_official 107:414e9c822e99 356
mbed_official 107:414e9c822e99 357 #warning "Interrupt only available for Serial Receive complete. Transmit complete not supported by Controller"
mbed_official 107:414e9c822e99 358
mbed_official 107:414e9c822e99 359 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
mbed_official 107:414e9c822e99 360 {
mbed_official 107:414e9c822e99 361 /* Sanity check arguments */
mbed_official 107:414e9c822e99 362 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 363 IRQn_Type irq_n = (IRQn_Type)0;
mbed_official 107:414e9c822e99 364 uint32_t vector = 0;
mbed_official 107:414e9c822e99 365
mbed_official 107:414e9c822e99 366 vector = get_serial_vector(obj);
mbed_official 107:414e9c822e99 367 irq_n = get_serial_irq_num(obj);
mbed_official 107:414e9c822e99 368
mbed_official 107:414e9c822e99 369 if (enable) {
mbed_official 107:414e9c822e99 370 switch (irq) {
mbed_official 107:414e9c822e99 371 case RxIrq:
mbed_official 107:414e9c822e99 372 usart_enable_interrupt(_USART(obj), US_IER_RXRDY);
mbed_official 107:414e9c822e99 373 break;
mbed_official 107:414e9c822e99 374 case TxIrq:
mbed_official 107:414e9c822e99 375 break;
mbed_official 107:414e9c822e99 376 }
mbed_official 107:414e9c822e99 377 NVIC_ClearPendingIRQ(irq_n);
mbed_official 107:414e9c822e99 378 NVIC_DisableIRQ(irq_n);
mbed_official 107:414e9c822e99 379 NVIC_SetVector(irq_n, vector);
mbed_official 107:414e9c822e99 380 NVIC_EnableIRQ(irq_n);
mbed_official 107:414e9c822e99 381 } else {
mbed_official 107:414e9c822e99 382 switch (irq) {
mbed_official 107:414e9c822e99 383 case RxIrq:
mbed_official 107:414e9c822e99 384 usart_disable_interrupt(_USART(obj), US_IER_RXRDY);
mbed_official 107:414e9c822e99 385 break;
mbed_official 107:414e9c822e99 386 case TxIrq:
mbed_official 107:414e9c822e99 387 break;
mbed_official 107:414e9c822e99 388 }
mbed_official 107:414e9c822e99 389 NVIC_DisableIRQ(irq_n);
mbed_official 107:414e9c822e99 390 }
mbed_official 107:414e9c822e99 391 }
mbed_official 107:414e9c822e99 392
mbed_official 107:414e9c822e99 393 static inline void uart_irq(Usart *const usart, uint32_t index)
mbed_official 107:414e9c822e99 394 {
mbed_official 107:414e9c822e99 395 MBED_ASSERT(usart != (void*)0);
mbed_official 107:414e9c822e99 396 uint32_t mask, status;
mbed_official 107:414e9c822e99 397 /* Read and clear mask. */
mbed_official 107:414e9c822e99 398 status = usart_get_status(usart);
mbed_official 107:414e9c822e99 399 mask = usart_get_interrupt_mask(usart);
mbed_official 107:414e9c822e99 400 status &= mask;
mbed_official 107:414e9c822e99 401
mbed_official 107:414e9c822e99 402 if (serial_irq_ids[index] != 0) {
mbed_official 107:414e9c822e99 403 if (status & US_IER_RXRDY) { /*For Receive Complete*/
mbed_official 107:414e9c822e99 404 if (irq_handler) {
mbed_official 107:414e9c822e99 405 irq_handler(serial_irq_ids[index], RxIrq);
mbed_official 107:414e9c822e99 406 }
mbed_official 107:414e9c822e99 407 }
mbed_official 107:414e9c822e99 408 }
mbed_official 107:414e9c822e99 409 }
mbed_official 107:414e9c822e99 410
mbed_official 107:414e9c822e99 411 void uart0_irq(void)
mbed_official 107:414e9c822e99 412 {
mbed_official 107:414e9c822e99 413 uart_irq(USART0, 0);
mbed_official 107:414e9c822e99 414 }
mbed_official 107:414e9c822e99 415
mbed_official 107:414e9c822e99 416 void uart1_irq(void)
mbed_official 107:414e9c822e99 417 {
mbed_official 107:414e9c822e99 418 uart_irq(USART1, 1);
mbed_official 107:414e9c822e99 419 }
mbed_official 107:414e9c822e99 420
mbed_official 107:414e9c822e99 421 void uart2_irq(void)
mbed_official 107:414e9c822e99 422 {
mbed_official 107:414e9c822e99 423 uart_irq(USART2, 2);
mbed_official 107:414e9c822e99 424 }
mbed_official 107:414e9c822e99 425
mbed_official 107:414e9c822e99 426 void uart3_irq(void)
mbed_official 107:414e9c822e99 427 {
mbed_official 107:414e9c822e99 428 uart_irq(USART3, 3);
mbed_official 107:414e9c822e99 429 }
mbed_official 107:414e9c822e99 430
mbed_official 107:414e9c822e99 431 void uart4_irq(void)
mbed_official 107:414e9c822e99 432 {
mbed_official 107:414e9c822e99 433 uart_irq(USART4, 4);
mbed_official 107:414e9c822e99 434 }
mbed_official 107:414e9c822e99 435
mbed_official 107:414e9c822e99 436 void uart5_irq(void)
mbed_official 107:414e9c822e99 437 {
mbed_official 107:414e9c822e99 438 uart_irq(USART5, 5);
mbed_official 107:414e9c822e99 439 }
mbed_official 107:414e9c822e99 440
mbed_official 107:414e9c822e99 441 void uart6_irq(void)
mbed_official 107:414e9c822e99 442 {
mbed_official 107:414e9c822e99 443 uart_irq(USART6, 6);
mbed_official 107:414e9c822e99 444 }
mbed_official 107:414e9c822e99 445
mbed_official 107:414e9c822e99 446 void uart7_irq(void)
mbed_official 107:414e9c822e99 447 {
mbed_official 107:414e9c822e99 448 uart_irq(USART7, 7);
mbed_official 107:414e9c822e99 449 }
mbed_official 107:414e9c822e99 450
mbed_official 107:414e9c822e99 451 static uint8_t serial_get_index(serial_t *obj)
mbed_official 107:414e9c822e99 452 {
mbed_official 107:414e9c822e99 453 /* Sanity check arguments */
mbed_official 107:414e9c822e99 454 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 455 switch ((int)pUSART_S(obj)) {
mbed_official 107:414e9c822e99 456 case UART_0:
mbed_official 107:414e9c822e99 457 return 0;
mbed_official 107:414e9c822e99 458 case UART_1:
mbed_official 107:414e9c822e99 459 return 1;
mbed_official 107:414e9c822e99 460 case UART_2:
mbed_official 107:414e9c822e99 461 return 2;
mbed_official 107:414e9c822e99 462 case UART_3:
mbed_official 107:414e9c822e99 463 return 3;
mbed_official 107:414e9c822e99 464 case UART_4:
mbed_official 107:414e9c822e99 465 return 4;
mbed_official 107:414e9c822e99 466 case UART_5:
mbed_official 107:414e9c822e99 467 return 5;
mbed_official 107:414e9c822e99 468 case UART_6:
mbed_official 107:414e9c822e99 469 return 6;
mbed_official 107:414e9c822e99 470 case UART_7:
mbed_official 107:414e9c822e99 471 return 7;
mbed_official 107:414e9c822e99 472 }
mbed_official 107:414e9c822e99 473 return 0;
mbed_official 107:414e9c822e99 474 }
mbed_official 107:414e9c822e99 475
mbed_official 107:414e9c822e99 476 static uint32_t get_serial_vector (serial_t *obj)
mbed_official 107:414e9c822e99 477 {
mbed_official 107:414e9c822e99 478 /* Sanity check arguments */
mbed_official 107:414e9c822e99 479 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 480 uint32_t vector = 0;
mbed_official 107:414e9c822e99 481 switch ((int)pUSART_S(obj)) {
mbed_official 107:414e9c822e99 482 case UART_0:
mbed_official 107:414e9c822e99 483 vector = (uint32_t)uart0_irq;
mbed_official 107:414e9c822e99 484 break;
mbed_official 107:414e9c822e99 485 case UART_1:
mbed_official 107:414e9c822e99 486 vector = (uint32_t)uart1_irq;
mbed_official 107:414e9c822e99 487 break;
mbed_official 107:414e9c822e99 488 case UART_2:
mbed_official 107:414e9c822e99 489 vector = (uint32_t)uart2_irq;
mbed_official 107:414e9c822e99 490 break;
mbed_official 107:414e9c822e99 491 case UART_3:
mbed_official 107:414e9c822e99 492 vector = (uint32_t)uart3_irq;
mbed_official 107:414e9c822e99 493 break;
mbed_official 107:414e9c822e99 494 case UART_4:
mbed_official 107:414e9c822e99 495 vector = (uint32_t)uart4_irq;
mbed_official 107:414e9c822e99 496 break;
mbed_official 107:414e9c822e99 497 case UART_5:
mbed_official 107:414e9c822e99 498 vector = (uint32_t)uart5_irq;
mbed_official 107:414e9c822e99 499 break;
mbed_official 107:414e9c822e99 500 case UART_6:
mbed_official 107:414e9c822e99 501 vector = (uint32_t)uart6_irq;
mbed_official 107:414e9c822e99 502 break;
mbed_official 107:414e9c822e99 503 case UART_7:
mbed_official 107:414e9c822e99 504 vector = (uint32_t)uart7_irq;
mbed_official 107:414e9c822e99 505 break;
mbed_official 107:414e9c822e99 506 }
mbed_official 107:414e9c822e99 507 return vector;
mbed_official 107:414e9c822e99 508 }
mbed_official 107:414e9c822e99 509
mbed_official 107:414e9c822e99 510 IRQn_Type get_serial_irq_num (serial_t *obj)
mbed_official 107:414e9c822e99 511 {
mbed_official 107:414e9c822e99 512 /* Sanity check arguments */
mbed_official 107:414e9c822e99 513 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 514 switch ((int)pUSART_S(obj)) {
mbed_official 107:414e9c822e99 515 case UART_0:
mbed_official 107:414e9c822e99 516 return FLEXCOM0_IRQn;
mbed_official 107:414e9c822e99 517 case UART_1:
mbed_official 107:414e9c822e99 518 return FLEXCOM1_IRQn;
mbed_official 107:414e9c822e99 519 case UART_2:
mbed_official 107:414e9c822e99 520 return FLEXCOM2_IRQn;
mbed_official 107:414e9c822e99 521 case UART_3:
mbed_official 107:414e9c822e99 522 return FLEXCOM3_IRQn;
mbed_official 107:414e9c822e99 523 case UART_4:
mbed_official 107:414e9c822e99 524 return FLEXCOM4_IRQn;
mbed_official 107:414e9c822e99 525 case UART_5:
mbed_official 107:414e9c822e99 526 return FLEXCOM5_IRQn;
mbed_official 107:414e9c822e99 527 case UART_6:
mbed_official 107:414e9c822e99 528 return FLEXCOM6_IRQn;
mbed_official 107:414e9c822e99 529 case UART_7:
mbed_official 107:414e9c822e99 530 return FLEXCOM7_IRQn;
mbed_official 107:414e9c822e99 531 default:
mbed_official 107:414e9c822e99 532 MBED_ASSERT(0);
mbed_official 107:414e9c822e99 533 }
mbed_official 107:414e9c822e99 534 return 0; /*Warning Suppression*/
mbed_official 107:414e9c822e99 535 }
mbed_official 107:414e9c822e99 536
mbed_official 107:414e9c822e99 537 /******************************************************************************
mbed_official 107:414e9c822e99 538 * READ/WRITE
mbed_official 107:414e9c822e99 539 ******************************************************************************/
mbed_official 107:414e9c822e99 540 int serial_getc(serial_t *obj)
mbed_official 107:414e9c822e99 541 {
mbed_official 107:414e9c822e99 542 /* Sanity check arguments */
mbed_official 107:414e9c822e99 543 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 544 while (!serial_readable(obj));
mbed_official 107:414e9c822e99 545 return (int)((_USART(obj)->US_RHR & US_RHR_RXCHR_Msk) & 0xFF);
mbed_official 107:414e9c822e99 546 }
mbed_official 107:414e9c822e99 547
mbed_official 107:414e9c822e99 548 void serial_putc(serial_t *obj, int c)
mbed_official 107:414e9c822e99 549 {
mbed_official 107:414e9c822e99 550 /* Sanity check arguments */
mbed_official 107:414e9c822e99 551 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 552 while (!serial_writable(obj));
mbed_official 107:414e9c822e99 553 _USART(obj)->US_THR = US_THR_TXCHR(c);
mbed_official 107:414e9c822e99 554 }
mbed_official 107:414e9c822e99 555
mbed_official 107:414e9c822e99 556 int serial_readable(serial_t *obj)
mbed_official 107:414e9c822e99 557 {
mbed_official 107:414e9c822e99 558 /* Sanity check arguments */
mbed_official 107:414e9c822e99 559 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 560 uint32_t status = 1;
mbed_official 107:414e9c822e99 561 if (!(_USART(obj)->US_CSR & US_CSR_RXRDY)) {
mbed_official 107:414e9c822e99 562 status = 0;
mbed_official 107:414e9c822e99 563 } else {
mbed_official 107:414e9c822e99 564 status = 1;
mbed_official 107:414e9c822e99 565 }
mbed_official 107:414e9c822e99 566 return status;
mbed_official 107:414e9c822e99 567 }
mbed_official 107:414e9c822e99 568
mbed_official 107:414e9c822e99 569 int serial_writable(serial_t *obj)
mbed_official 107:414e9c822e99 570 {
mbed_official 107:414e9c822e99 571 /* Sanity check arguments */
mbed_official 107:414e9c822e99 572 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 573 uint32_t status = 1;
mbed_official 107:414e9c822e99 574 if (!(_USART(obj)->US_CSR & US_CSR_TXRDY)) {
mbed_official 107:414e9c822e99 575 status = 0;
mbed_official 107:414e9c822e99 576 } else {
mbed_official 107:414e9c822e99 577 status = 1;
mbed_official 107:414e9c822e99 578 }
mbed_official 107:414e9c822e99 579 return status;
mbed_official 107:414e9c822e99 580 }
mbed_official 107:414e9c822e99 581
mbed_official 107:414e9c822e99 582 /************************************************************************************
mbed_official 107:414e9c822e99 583 * ASYNCHRONOUS HAL *
mbed_official 107:414e9c822e99 584 ************************************************************************************/
mbed_official 107:414e9c822e99 585
mbed_official 107:414e9c822e99 586
mbed_official 107:414e9c822e99 587 #if DEVICE_SERIAL_ASYNCH
mbed_official 107:414e9c822e99 588 /************************************
mbed_official 107:414e9c822e99 589 * HELPER FUNCTIONS *
mbed_official 107:414e9c822e99 590 ***********************************/
mbed_official 107:414e9c822e99 591
mbed_official 107:414e9c822e99 592 void serial_set_char_match(serial_t *obj, uint8_t char_match)
mbed_official 107:414e9c822e99 593 {
mbed_official 107:414e9c822e99 594 /* Sanity check arguments */
mbed_official 107:414e9c822e99 595 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 596 if (char_match != SERIAL_RESERVED_CHAR_MATCH) {
mbed_official 107:414e9c822e99 597 obj->char_match = char_match;
mbed_official 107:414e9c822e99 598 _USART(obj)->US_CMPR = (char_match & 0xFF);
mbed_official 107:414e9c822e99 599 usart_enable_interrupt(_USART(obj), US_IER_CMP);
mbed_official 107:414e9c822e99 600 }
mbed_official 107:414e9c822e99 601 }
mbed_official 107:414e9c822e99 602
mbed_official 107:414e9c822e99 603 /************************************
mbed_official 107:414e9c822e99 604 * TRANSFER FUNCTIONS *
mbed_official 107:414e9c822e99 605 ***********************************/
mbed_official 107:414e9c822e99 606 int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx_width, uint32_t handler, uint32_t event, DMAUsage hint)
mbed_official 107:414e9c822e99 607 {
mbed_official 107:414e9c822e99 608 /* Sanity check arguments */
mbed_official 107:414e9c822e99 609 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 610 MBED_ASSERT(tx != (void*)0);
mbed_official 107:414e9c822e99 611 if(tx_length == 0) return 0;
mbed_official 107:414e9c822e99 612 Pdc *pdc_base;
mbed_official 107:414e9c822e99 613 IRQn_Type irq_n = (IRQn_Type)0;
mbed_official 107:414e9c822e99 614 pdc_packet_t packet;
mbed_official 107:414e9c822e99 615
mbed_official 107:414e9c822e99 616 pSERIAL_S(obj)->acttra = true; /* flag for active transmit transfer */
mbed_official 107:414e9c822e99 617
mbed_official 107:414e9c822e99 618 irq_n = get_serial_irq_num(obj);
mbed_official 107:414e9c822e99 619
mbed_official 107:414e9c822e99 620 /* Get board USART PDC base address and enable transmitter. */
mbed_official 107:414e9c822e99 621 pdc_base = usart_get_pdc_base(_USART(obj));
mbed_official 107:414e9c822e99 622 pdc_enable_transfer(pdc_base, PERIPH_PTCR_TXTEN);
mbed_official 107:414e9c822e99 623
mbed_official 107:414e9c822e99 624 packet.ul_addr = (uint32_t)tx;
mbed_official 107:414e9c822e99 625 packet.ul_size = (uint32_t)tx_length;
mbed_official 107:414e9c822e99 626
mbed_official 107:414e9c822e99 627 pdc_tx_init(pdc_base, &packet, NULL);
mbed_official 107:414e9c822e99 628 usart_enable_interrupt(_USART(obj), US_IER_TXBUFE);
mbed_official 107:414e9c822e99 629
mbed_official 107:414e9c822e99 630 NVIC_ClearPendingIRQ(irq_n);
mbed_official 107:414e9c822e99 631 NVIC_DisableIRQ(irq_n);
mbed_official 107:414e9c822e99 632 NVIC_SetVector(irq_n, (uint32_t)handler);
mbed_official 107:414e9c822e99 633 NVIC_EnableIRQ(irq_n);
mbed_official 107:414e9c822e99 634
mbed_official 107:414e9c822e99 635 return 0;
mbed_official 107:414e9c822e99 636 }
mbed_official 107:414e9c822e99 637
mbed_official 107:414e9c822e99 638 void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_width, uint32_t handler, uint32_t event, uint8_t char_match, DMAUsage hint)
mbed_official 107:414e9c822e99 639 {
mbed_official 107:414e9c822e99 640 /* Sanity check arguments */
mbed_official 107:414e9c822e99 641 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 642 MBED_ASSERT(rx != (void*)0);
mbed_official 107:414e9c822e99 643 if(rx_length == 0) return 0;
mbed_official 107:414e9c822e99 644 Pdc *pdc_base;
mbed_official 107:414e9c822e99 645 IRQn_Type irq_n = (IRQn_Type)0;
mbed_official 107:414e9c822e99 646 pdc_packet_t packet;
mbed_official 107:414e9c822e99 647
mbed_official 107:414e9c822e99 648 pSERIAL_S(obj)->actrec = true; /* flag for active receive transfer */
mbed_official 107:414e9c822e99 649 if (event == SERIAL_EVENT_RX_CHARACTER_MATCH) { /* if event is character match alone */
mbed_official 107:414e9c822e99 650 pSERIAL_S(obj)->events = SERIAL_EVENT_RX_CHARACTER_MATCH;
mbed_official 107:414e9c822e99 651 }
mbed_official 107:414e9c822e99 652
mbed_official 107:414e9c822e99 653 irq_n = get_serial_irq_num(obj);
mbed_official 107:414e9c822e99 654
mbed_official 107:414e9c822e99 655 serial_set_char_match(obj, char_match);
mbed_official 107:414e9c822e99 656
mbed_official 107:414e9c822e99 657 /* Get board USART PDC base address and enable transmitter. */
mbed_official 107:414e9c822e99 658 pdc_base = usart_get_pdc_base(_USART(obj));
mbed_official 107:414e9c822e99 659 pdc_enable_transfer(pdc_base, PERIPH_PTCR_RXTEN);
mbed_official 107:414e9c822e99 660 packet.ul_addr = (uint32_t)rx;
mbed_official 107:414e9c822e99 661 packet.ul_size = (uint32_t)rx_length;
mbed_official 107:414e9c822e99 662 pdc_rx_init(pdc_base, &packet, NULL);
mbed_official 107:414e9c822e99 663
mbed_official 107:414e9c822e99 664 usart_enable_interrupt(_USART(obj), (US_IER_RXBUFF | US_IER_OVRE | US_IER_FRAME | US_IER_PARE));
mbed_official 107:414e9c822e99 665
mbed_official 107:414e9c822e99 666 NVIC_ClearPendingIRQ(irq_n);
mbed_official 107:414e9c822e99 667 NVIC_DisableIRQ(irq_n);
mbed_official 107:414e9c822e99 668 NVIC_SetVector(irq_n, (uint32_t)handler);
mbed_official 107:414e9c822e99 669 NVIC_EnableIRQ(irq_n);
mbed_official 107:414e9c822e99 670
mbed_official 107:414e9c822e99 671 }
mbed_official 107:414e9c822e99 672
mbed_official 107:414e9c822e99 673 uint8_t serial_tx_active(serial_t *obj)
mbed_official 107:414e9c822e99 674 {
mbed_official 107:414e9c822e99 675 /* Sanity check arguments */
mbed_official 107:414e9c822e99 676 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 677 return pSERIAL_S(obj)->acttra;
mbed_official 107:414e9c822e99 678 }
mbed_official 107:414e9c822e99 679
mbed_official 107:414e9c822e99 680 uint8_t serial_rx_active(serial_t *obj)
mbed_official 107:414e9c822e99 681 {
mbed_official 107:414e9c822e99 682 /* Sanity check arguments */
mbed_official 107:414e9c822e99 683 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 684 return pSERIAL_S(obj)->actrec;
mbed_official 107:414e9c822e99 685 }
mbed_official 107:414e9c822e99 686
mbed_official 107:414e9c822e99 687 int serial_tx_irq_handler_asynch(serial_t *obj)
mbed_official 107:414e9c822e99 688 {
mbed_official 107:414e9c822e99 689 /* Sanity check arguments */
mbed_official 107:414e9c822e99 690 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 691 serial_tx_abort_asynch(obj);
mbed_official 107:414e9c822e99 692 return SERIAL_EVENT_TX_COMPLETE;
mbed_official 107:414e9c822e99 693 }
mbed_official 107:414e9c822e99 694 int serial_rx_irq_handler_asynch(serial_t *obj)
mbed_official 107:414e9c822e99 695 {
mbed_official 107:414e9c822e99 696 /* Sanity check arguments */
mbed_official 107:414e9c822e99 697 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 698 uint32_t ul_status, ulmask;
mbed_official 107:414e9c822e99 699
mbed_official 107:414e9c822e99 700 /* Read USART Status. */
mbed_official 107:414e9c822e99 701 ul_status = usart_get_status(_USART(obj));
mbed_official 107:414e9c822e99 702 ulmask = usart_get_interrupt_mask(_USART(obj));
mbed_official 107:414e9c822e99 703 ul_status &= ulmask;
mbed_official 107:414e9c822e99 704
mbed_official 107:414e9c822e99 705 if (ul_status & US_CSR_OVRE) { /* Overrun Error */
mbed_official 107:414e9c822e99 706 usart_disable_interrupt(_USART(obj), US_IDR_OVRE);
mbed_official 107:414e9c822e99 707 serial_rx_abort_asynch(obj);
mbed_official 107:414e9c822e99 708 return SERIAL_EVENT_RX_OVERFLOW;
mbed_official 107:414e9c822e99 709 }
mbed_official 107:414e9c822e99 710 if (ul_status & US_CSR_FRAME) { /* Framing Error */
mbed_official 107:414e9c822e99 711 usart_disable_interrupt(_USART(obj), US_IDR_FRAME);
mbed_official 107:414e9c822e99 712 serial_rx_abort_asynch(obj);
mbed_official 107:414e9c822e99 713 return SERIAL_EVENT_RX_FRAMING_ERROR;
mbed_official 107:414e9c822e99 714 }
mbed_official 107:414e9c822e99 715 if (ul_status & US_CSR_PARE) { /* Parity Error */
mbed_official 107:414e9c822e99 716 usart_disable_interrupt(_USART(obj), US_IDR_PARE);
mbed_official 107:414e9c822e99 717 serial_rx_abort_asynch(obj);
mbed_official 107:414e9c822e99 718 return SERIAL_EVENT_RX_PARITY_ERROR;
mbed_official 107:414e9c822e99 719 }
mbed_official 107:414e9c822e99 720 if ((ul_status & (US_IER_RXBUFF | US_IER_CMP)) == (US_IER_RXBUFF | US_IER_CMP)) { /* Character match in last character in transfer*/
mbed_official 107:414e9c822e99 721 usart_disable_interrupt(_USART(obj), US_IDR_CMP);
mbed_official 107:414e9c822e99 722 serial_rx_abort_asynch(obj);
mbed_official 107:414e9c822e99 723 return SERIAL_EVENT_RX_COMPLETE|SERIAL_EVENT_RX_CHARACTER_MATCH;
mbed_official 107:414e9c822e99 724 }
mbed_official 107:414e9c822e99 725 if (ul_status & US_IER_CMP) { /* Character match */
mbed_official 107:414e9c822e99 726 usart_disable_interrupt(_USART(obj), US_IDR_CMP);
mbed_official 107:414e9c822e99 727 if (pSERIAL_S(obj)->events == SERIAL_EVENT_RX_CHARACTER_MATCH) { /*if character match is the only event abort transfer */
mbed_official 107:414e9c822e99 728 serial_rx_abort_asynch(obj);
mbed_official 107:414e9c822e99 729 }
mbed_official 107:414e9c822e99 730 return SERIAL_EVENT_RX_CHARACTER_MATCH;
mbed_official 107:414e9c822e99 731 }
mbed_official 107:414e9c822e99 732 if (ul_status & US_IER_RXBUFF) { /* Reception Complete */
mbed_official 107:414e9c822e99 733 serial_rx_abort_asynch(obj);
mbed_official 107:414e9c822e99 734 return SERIAL_EVENT_RX_COMPLETE;
mbed_official 107:414e9c822e99 735 }
mbed_official 107:414e9c822e99 736 return 0;
mbed_official 107:414e9c822e99 737 }
mbed_official 107:414e9c822e99 738
mbed_official 107:414e9c822e99 739 int serial_irq_handler_asynch(serial_t *obj)
mbed_official 107:414e9c822e99 740 {
mbed_official 107:414e9c822e99 741 /* Sanity check arguments */
mbed_official 107:414e9c822e99 742 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 743 uint32_t ul_status, ulmask;
mbed_official 107:414e9c822e99 744
mbed_official 107:414e9c822e99 745 /* Read USART Status. */
mbed_official 107:414e9c822e99 746 ul_status = usart_get_status(_USART(obj));
mbed_official 107:414e9c822e99 747 ulmask = usart_get_interrupt_mask(_USART(obj));
mbed_official 107:414e9c822e99 748
mbed_official 107:414e9c822e99 749 ul_status &= ulmask;
mbed_official 107:414e9c822e99 750
mbed_official 107:414e9c822e99 751 if (ul_status & (US_CSR_RXBUFF | US_CSR_OVRE | US_CSR_FRAME | US_CSR_PARE | US_IER_CMP)) {
mbed_official 107:414e9c822e99 752 return serial_rx_irq_handler_asynch(obj);
mbed_official 107:414e9c822e99 753 }
mbed_official 107:414e9c822e99 754 if (ul_status & US_CSR_TXBUFE) {
mbed_official 107:414e9c822e99 755 return serial_tx_irq_handler_asynch(obj);
mbed_official 107:414e9c822e99 756 }
mbed_official 107:414e9c822e99 757 return 0;
mbed_official 107:414e9c822e99 758 }
mbed_official 107:414e9c822e99 759
mbed_official 107:414e9c822e99 760 void serial_tx_abort_asynch(serial_t *obj)
mbed_official 107:414e9c822e99 761 {
mbed_official 107:414e9c822e99 762 /* Sanity check arguments */
mbed_official 107:414e9c822e99 763 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 764 Pdc *pdc_base;
mbed_official 107:414e9c822e99 765 usart_disable_interrupt(_USART(obj), US_IER_TXBUFE);
mbed_official 107:414e9c822e99 766 pdc_base = usart_get_pdc_base(_USART(obj));
mbed_official 107:414e9c822e99 767 pdc_disable_transfer(pdc_base, PERIPH_PTCR_TXTEN);
mbed_official 107:414e9c822e99 768 pSERIAL_S(obj)->acttra = false;
mbed_official 107:414e9c822e99 769 }
mbed_official 107:414e9c822e99 770
mbed_official 107:414e9c822e99 771 void serial_rx_abort_asynch(serial_t *obj)
mbed_official 107:414e9c822e99 772 {
mbed_official 107:414e9c822e99 773 IRQn_Type irq_n = (IRQn_Type)0;
mbed_official 107:414e9c822e99 774 /* Sanity check arguments */
mbed_official 107:414e9c822e99 775 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 776 Pdc *pdc_base;
mbed_official 107:414e9c822e99 777 usart_disable_interrupt(_USART(obj), US_IER_RXBUFF);
mbed_official 107:414e9c822e99 778 pdc_base = usart_get_pdc_base(_USART(obj));
mbed_official 107:414e9c822e99 779 pdc_disable_transfer(pdc_base, PERIPH_PTCR_RXTEN);
mbed_official 107:414e9c822e99 780 irq_n = get_serial_irq_num(obj);
mbed_official 107:414e9c822e99 781 NVIC_ClearPendingIRQ(irq_n);
mbed_official 107:414e9c822e99 782 NVIC_DisableIRQ(irq_n);
mbed_official 107:414e9c822e99 783 pSERIAL_S(obj)->actrec = false;
mbed_official 107:414e9c822e99 784 }
mbed_official 107:414e9c822e99 785
mbed_official 107:414e9c822e99 786 #endif