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:
80:bdf1132a57cf
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 80:bdf1132a57cf 1 /* mbed Microcontroller Library
mbed_official 80:bdf1132a57cf 2 * Copyright (c) 2006-2015 ARM Limited
mbed_official 80:bdf1132a57cf 3 *
mbed_official 80:bdf1132a57cf 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 80:bdf1132a57cf 5 * you may not use this file except in compliance with the License.
mbed_official 80:bdf1132a57cf 6 * You may obtain a copy of the License at
mbed_official 80:bdf1132a57cf 7 *
mbed_official 80:bdf1132a57cf 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 80:bdf1132a57cf 9 *
mbed_official 80:bdf1132a57cf 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 80:bdf1132a57cf 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 80:bdf1132a57cf 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 80:bdf1132a57cf 13 * See the License for the specific language governing permissions and
mbed_official 80:bdf1132a57cf 14 * limitations under the License.
mbed_official 80:bdf1132a57cf 15 */
mbed_official 80:bdf1132a57cf 16 // math.h required for floating point operations for baud rate calculation
mbed_official 80:bdf1132a57cf 17 #include <math.h>
mbed_official 80:bdf1132a57cf 18 #include <stdio.h>
mbed_official 80:bdf1132a57cf 19 #include <string.h>
mbed_official 80:bdf1132a57cf 20 #include <stdlib.h>
mbed_official 80:bdf1132a57cf 21
mbed_official 80:bdf1132a57cf 22 #include "serial_api.h"
mbed_official 80:bdf1132a57cf 23 #include "cmsis.h"
mbed_official 80:bdf1132a57cf 24 #include "pinmap.h"
mbed_official 80:bdf1132a57cf 25 #include "mbed_error.h"
mbed_official 80:bdf1132a57cf 26 #include "gpio_api.h"
mbed_official 80:bdf1132a57cf 27
mbed_official 80:bdf1132a57cf 28 /******************************************************************************
mbed_official 80:bdf1132a57cf 29 * INITIALIZATION
mbed_official 80:bdf1132a57cf 30 ******************************************************************************/
mbed_official 80:bdf1132a57cf 31
mbed_official 80:bdf1132a57cf 32 static const PinMap PinMap_UART_TX[] = {
mbed_official 80:bdf1132a57cf 33 {USBTX , UART_0, 0},
mbed_official 80:bdf1132a57cf 34 {XB_TX , UART_1, 0},
mbed_official 80:bdf1132a57cf 35 {SH0_TX , UART_2, 0},
mbed_official 80:bdf1132a57cf 36 {SH1_TX , UART_3, 0},
mbed_official 80:bdf1132a57cf 37 {NC , NC , 0}
mbed_official 80:bdf1132a57cf 38 };
mbed_official 80:bdf1132a57cf 39
mbed_official 80:bdf1132a57cf 40 static const PinMap PinMap_UART_RX[] = {
mbed_official 80:bdf1132a57cf 41 {USBRX , UART_0, 0},
mbed_official 80:bdf1132a57cf 42 {XB_RX , UART_1, 0},
mbed_official 80:bdf1132a57cf 43 {SH0_RX , UART_2, 0},
mbed_official 80:bdf1132a57cf 44 {SH1_RX , UART_3, 0},
mbed_official 80:bdf1132a57cf 45 {NC , NC , 0}
mbed_official 80:bdf1132a57cf 46 };
mbed_official 80:bdf1132a57cf 47
mbed_official 80:bdf1132a57cf 48 #define UART_NUM 4
mbed_official 80:bdf1132a57cf 49
mbed_official 80:bdf1132a57cf 50 static uart_irq_handler irq_handler;
mbed_official 80:bdf1132a57cf 51
mbed_official 80:bdf1132a57cf 52 int stdio_uart_inited = 0;
mbed_official 80:bdf1132a57cf 53 serial_t stdio_uart;
mbed_official 80:bdf1132a57cf 54
mbed_official 80:bdf1132a57cf 55 struct serial_global_data_s {
mbed_official 80:bdf1132a57cf 56 uint32_t serial_irq_id;
mbed_official 80:bdf1132a57cf 57 gpio_t sw_rts, sw_cts;
mbed_official 80:bdf1132a57cf 58 uint8_t count, rx_irq_set_flow, rx_irq_set_api;
mbed_official 80:bdf1132a57cf 59 };
mbed_official 80:bdf1132a57cf 60
mbed_official 80:bdf1132a57cf 61 static struct serial_global_data_s uart_data[UART_NUM];
mbed_official 80:bdf1132a57cf 62
mbed_official 80:bdf1132a57cf 63 void serial_init(serial_t *obj, PinName tx, PinName rx) {
mbed_official 80:bdf1132a57cf 64 int is_stdio_uart = 0;
mbed_official 80:bdf1132a57cf 65
mbed_official 80:bdf1132a57cf 66 // determine the UART to use
mbed_official 80:bdf1132a57cf 67 UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX);
mbed_official 80:bdf1132a57cf 68 UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX);
mbed_official 80:bdf1132a57cf 69 UARTName uart = (UARTName)pinmap_merge(uart_tx, uart_rx);
mbed_official 80:bdf1132a57cf 70 if ((int)uart == NC) {
mbed_official 80:bdf1132a57cf 71 error("Serial pinout mapping failed");
mbed_official 80:bdf1132a57cf 72 }
mbed_official 80:bdf1132a57cf 73
mbed_official 80:bdf1132a57cf 74 obj->uart = (CMSDK_UART_TypeDef *)uart;
mbed_official 80:bdf1132a57cf 75 //set baud rate and enable Uart in normarl mode (RX and TX enabled)
mbed_official 80:bdf1132a57cf 76 switch (uart)
mbed_official 80:bdf1132a57cf 77 {
mbed_official 80:bdf1132a57cf 78 case UART_0: //UART HEADER
mbed_official 80:bdf1132a57cf 79 {
mbed_official 80:bdf1132a57cf 80 CMSDK_UART1->CTRL = 0x0; // Disable UART when changing configuration
mbed_official 80:bdf1132a57cf 81 if((int)tx != NC)
mbed_official 80:bdf1132a57cf 82 {
mbed_official 80:bdf1132a57cf 83 CMSDK_UART1->CTRL |= 0x01; // TX enable
mbed_official 80:bdf1132a57cf 84 } else {
mbed_official 80:bdf1132a57cf 85 CMSDK_UART1->CTRL &= 0xFFFE; // TX disable
mbed_official 80:bdf1132a57cf 86 }
mbed_official 80:bdf1132a57cf 87 if((int)rx != NC)
mbed_official 80:bdf1132a57cf 88 {
mbed_official 80:bdf1132a57cf 89 CMSDK_UART1->CTRL |= 0x02; // RX enable
mbed_official 80:bdf1132a57cf 90 } else {
mbed_official 80:bdf1132a57cf 91 CMSDK_UART1->CTRL &= 0xFFFD; // RX disable
mbed_official 80:bdf1132a57cf 92 }
mbed_official 80:bdf1132a57cf 93 }
mbed_official 80:bdf1132a57cf 94 break;
mbed_official 80:bdf1132a57cf 95 case UART_1: //XBEE SOCKET UART
mbed_official 80:bdf1132a57cf 96 {
mbed_official 80:bdf1132a57cf 97 CMSDK_UART3->CTRL = 0x00; // Disable UART when changing configuration
mbed_official 80:bdf1132a57cf 98 if((int)tx != NC)
mbed_official 80:bdf1132a57cf 99 {
mbed_official 80:bdf1132a57cf 100 CMSDK_UART3->CTRL = 0x1; // TX enable
mbed_official 80:bdf1132a57cf 101 CMSDK_GPIO4->ALTFUNCSET |= 0x0100;
mbed_official 80:bdf1132a57cf 102 }
mbed_official 80:bdf1132a57cf 103 if((int)rx != NC)
mbed_official 80:bdf1132a57cf 104 {
mbed_official 80:bdf1132a57cf 105 CMSDK_UART3->CTRL |= 0x2; // RX enable
mbed_official 80:bdf1132a57cf 106 CMSDK_GPIO4->ALTFUNCSET |= 0x0080;
mbed_official 80:bdf1132a57cf 107 }
mbed_official 80:bdf1132a57cf 108 }
mbed_official 80:bdf1132a57cf 109 break;
mbed_official 80:bdf1132a57cf 110 case UART_2: //Sheild0 UART
mbed_official 80:bdf1132a57cf 111 {
mbed_official 80:bdf1132a57cf 112 CMSDK_UART0->CTRL = 0x00; // Disable UART when changing configuration
mbed_official 80:bdf1132a57cf 113 if((int)uart_tx != NC)
mbed_official 80:bdf1132a57cf 114 {
mbed_official 80:bdf1132a57cf 115 CMSDK_UART0->CTRL |= 0x01; // TX enable
mbed_official 80:bdf1132a57cf 116 CMSDK_GPIO0->ALTFUNCSET |= 0x0002;
mbed_official 80:bdf1132a57cf 117 }
mbed_official 80:bdf1132a57cf 118
mbed_official 80:bdf1132a57cf 119 if((int)uart_rx != NC)
mbed_official 80:bdf1132a57cf 120 {
mbed_official 80:bdf1132a57cf 121 CMSDK_UART0->CTRL |= 0x02; // RX enable
mbed_official 80:bdf1132a57cf 122 CMSDK_GPIO0->ALTFUNCSET |= 0x0001;
mbed_official 80:bdf1132a57cf 123 }
mbed_official 80:bdf1132a57cf 124 }
mbed_official 80:bdf1132a57cf 125 break;
mbed_official 80:bdf1132a57cf 126 case UART_3: //Sheild1 UART
mbed_official 80:bdf1132a57cf 127 {
mbed_official 80:bdf1132a57cf 128 CMSDK_UART2->CTRL = 0x00; // Disable UART when changing configuration
mbed_official 80:bdf1132a57cf 129 if((int)tx != NC)
mbed_official 80:bdf1132a57cf 130 {
mbed_official 80:bdf1132a57cf 131 CMSDK_UART2->CTRL = 0x1; // TX enable
mbed_official 80:bdf1132a57cf 132 CMSDK_GPIO1->ALTFUNCSET |= 0x0002;
mbed_official 80:bdf1132a57cf 133 }
mbed_official 80:bdf1132a57cf 134 if((int)rx != NC)
mbed_official 80:bdf1132a57cf 135 {
mbed_official 80:bdf1132a57cf 136 CMSDK_UART2->CTRL |= 0x2; // RX enable
mbed_official 80:bdf1132a57cf 137 CMSDK_GPIO1->ALTFUNCSET |= 0x0001;
mbed_official 80:bdf1132a57cf 138 }
mbed_official 80:bdf1132a57cf 139 }
mbed_official 80:bdf1132a57cf 140 break;
mbed_official 80:bdf1132a57cf 141 }
mbed_official 80:bdf1132a57cf 142
mbed_official 80:bdf1132a57cf 143 // set default baud rate and format
mbed_official 80:bdf1132a57cf 144 serial_baud (obj, 9600);
mbed_official 80:bdf1132a57cf 145
mbed_official 80:bdf1132a57cf 146 // pinout the chosen uart
mbed_official 80:bdf1132a57cf 147 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 80:bdf1132a57cf 148 pinmap_pinout(rx, PinMap_UART_RX);
mbed_official 80:bdf1132a57cf 149
mbed_official 80:bdf1132a57cf 150 switch (uart) {
mbed_official 80:bdf1132a57cf 151 case UART_0: obj->index = 0; break;
mbed_official 80:bdf1132a57cf 152 case UART_1: obj->index = 1; break;
mbed_official 80:bdf1132a57cf 153 case UART_2: obj->index = 2; break;
mbed_official 80:bdf1132a57cf 154 case UART_3: obj->index = 3; break;
mbed_official 80:bdf1132a57cf 155 }
mbed_official 80:bdf1132a57cf 156 uart_data[obj->index].sw_rts.pin = NC;
mbed_official 80:bdf1132a57cf 157 uart_data[obj->index].sw_cts.pin = NC;
mbed_official 80:bdf1132a57cf 158 serial_set_flow_control(obj, FlowControlNone, NC, NC);
mbed_official 80:bdf1132a57cf 159
mbed_official 80:bdf1132a57cf 160 is_stdio_uart = (uart == STDIO_UART) ? (1) : (0);
mbed_official 80:bdf1132a57cf 161
mbed_official 80:bdf1132a57cf 162 if (is_stdio_uart) {
mbed_official 80:bdf1132a57cf 163 stdio_uart_inited = 1;
mbed_official 80:bdf1132a57cf 164 memcpy(&stdio_uart, obj, sizeof(serial_t));
mbed_official 80:bdf1132a57cf 165 }
mbed_official 80:bdf1132a57cf 166 }
mbed_official 80:bdf1132a57cf 167
mbed_official 80:bdf1132a57cf 168 void serial_free(serial_t *obj) {
mbed_official 80:bdf1132a57cf 169 uart_data[obj->index].serial_irq_id = 0;
mbed_official 80:bdf1132a57cf 170 }
mbed_official 80:bdf1132a57cf 171
mbed_official 80:bdf1132a57cf 172 // serial_baud
mbed_official 80:bdf1132a57cf 173 // set the baud rate, taking in to account the current SystemFrequency
mbed_official 80:bdf1132a57cf 174 void serial_baud(serial_t *obj, int baudrate) {
mbed_official 80:bdf1132a57cf 175 // The MPS2 has a simple divider to control the baud rate. The formula is:
mbed_official 80:bdf1132a57cf 176 //
mbed_official 80:bdf1132a57cf 177 // Baudrate = PCLK / BAUDDIV
mbed_official 80:bdf1132a57cf 178 //
mbed_official 80:bdf1132a57cf 179 // PCLK = 24 Mhz
mbed_official 80:bdf1132a57cf 180 // so for a desired baud rate of 9600
mbed_official 80:bdf1132a57cf 181 // 24000000 / 9600 = 2500
mbed_official 80:bdf1132a57cf 182 //
mbed_official 80:bdf1132a57cf 183 //check to see if minimum baud value entered
mbed_official 80:bdf1132a57cf 184 int baudrate_div = 0;
mbed_official 80:bdf1132a57cf 185 baudrate_div = SystemCoreClock / baudrate;
mbed_official 80:bdf1132a57cf 186 if(baudrate >= 16){
mbed_official 80:bdf1132a57cf 187 switch ((int)obj->uart) {
mbed_official 80:bdf1132a57cf 188 case UART_0: CMSDK_UART1->BAUDDIV = baudrate_div; break;
mbed_official 80:bdf1132a57cf 189 case UART_1: CMSDK_UART3->BAUDDIV = baudrate_div; break;
mbed_official 80:bdf1132a57cf 190 case UART_2: CMSDK_UART0->BAUDDIV = baudrate_div; break;
mbed_official 80:bdf1132a57cf 191 case UART_3: CMSDK_UART2->BAUDDIV = baudrate_div; break;
mbed_official 80:bdf1132a57cf 192 default: error("serial_baud"); break;
mbed_official 80:bdf1132a57cf 193 }
mbed_official 80:bdf1132a57cf 194 } else {
mbed_official 80:bdf1132a57cf 195 error("serial_baud");
mbed_official 80:bdf1132a57cf 196 }
mbed_official 80:bdf1132a57cf 197
mbed_official 80:bdf1132a57cf 198 }
mbed_official 80:bdf1132a57cf 199
mbed_official 80:bdf1132a57cf 200 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) {
mbed_official 80:bdf1132a57cf 201 }
mbed_official 80:bdf1132a57cf 202
mbed_official 80:bdf1132a57cf 203 /******************************************************************************
mbed_official 80:bdf1132a57cf 204 * INTERRUPTS HANDLING
mbed_official 80:bdf1132a57cf 205 ******************************************************************************/
mbed_official 80:bdf1132a57cf 206 static inline void uart_irq(uint32_t intstatus, uint32_t index, CMSDK_UART_TypeDef *puart) {
mbed_official 80:bdf1132a57cf 207 SerialIrq irq_type;
mbed_official 80:bdf1132a57cf 208 switch (intstatus)
mbed_official 80:bdf1132a57cf 209 {
mbed_official 80:bdf1132a57cf 210 case 1:
mbed_official 80:bdf1132a57cf 211 {
mbed_official 80:bdf1132a57cf 212 irq_type = TxIrq;
mbed_official 80:bdf1132a57cf 213 }
mbed_official 80:bdf1132a57cf 214 break;
mbed_official 80:bdf1132a57cf 215
mbed_official 80:bdf1132a57cf 216 case 2:
mbed_official 80:bdf1132a57cf 217 {
mbed_official 80:bdf1132a57cf 218 irq_type = RxIrq;
mbed_official 80:bdf1132a57cf 219 }
mbed_official 80:bdf1132a57cf 220 break;
mbed_official 80:bdf1132a57cf 221
mbed_official 80:bdf1132a57cf 222 default: return;
mbed_official 80:bdf1132a57cf 223 } /* End of Switch */
mbed_official 80:bdf1132a57cf 224
mbed_official 80:bdf1132a57cf 225 if ((RxIrq == irq_type) && (NC != uart_data[index].sw_rts.pin))
mbed_official 80:bdf1132a57cf 226 {
mbed_official 80:bdf1132a57cf 227 gpio_write(&uart_data[index].sw_rts, 1);
mbed_official 80:bdf1132a57cf 228 // Disable interrupt if it wasn't enabled by other part of the application
mbed_official 80:bdf1132a57cf 229 if (!uart_data[index].rx_irq_set_api)
mbed_official 80:bdf1132a57cf 230 {
mbed_official 80:bdf1132a57cf 231 /* Disable Rx interrupt */
mbed_official 80:bdf1132a57cf 232 puart->CTRL &= ~(CMSDK_UART_CTRL_RXIRQEN_Msk);
mbed_official 80:bdf1132a57cf 233 }
mbed_official 80:bdf1132a57cf 234 }
mbed_official 80:bdf1132a57cf 235
mbed_official 80:bdf1132a57cf 236 if (uart_data[index].serial_irq_id != 0)
mbed_official 80:bdf1132a57cf 237 {
mbed_official 80:bdf1132a57cf 238 if ((irq_type != RxIrq) || (uart_data[index].rx_irq_set_api))
mbed_official 80:bdf1132a57cf 239 {
mbed_official 80:bdf1132a57cf 240 irq_handler(uart_data[index].serial_irq_id, irq_type);
mbed_official 80:bdf1132a57cf 241 }
mbed_official 80:bdf1132a57cf 242 }
mbed_official 80:bdf1132a57cf 243
mbed_official 80:bdf1132a57cf 244 if( irq_type == TxIrq )
mbed_official 80:bdf1132a57cf 245 {
mbed_official 80:bdf1132a57cf 246 /* Clear the TX interrupt Flag */
mbed_official 80:bdf1132a57cf 247 puart->INTCLEAR |= 0x01;
mbed_official 80:bdf1132a57cf 248 }
mbed_official 80:bdf1132a57cf 249 else
mbed_official 80:bdf1132a57cf 250 {
mbed_official 80:bdf1132a57cf 251 /* Clear the Rx interupt Flag */
mbed_official 80:bdf1132a57cf 252 puart->INTCLEAR |= 0x02;
mbed_official 80:bdf1132a57cf 253 }
mbed_official 80:bdf1132a57cf 254 }
mbed_official 80:bdf1132a57cf 255
mbed_official 80:bdf1132a57cf 256 void uart0_irq() {uart_irq(CMSDK_UART1->INTSTATUS & 0x3, 0, (CMSDK_UART_TypeDef*)CMSDK_UART1);}
mbed_official 80:bdf1132a57cf 257 void uart1_irq() {uart_irq(CMSDK_UART3->INTSTATUS & 0x3, 1, (CMSDK_UART_TypeDef*)CMSDK_UART3);}
mbed_official 80:bdf1132a57cf 258 void uart2_irq() {uart_irq(CMSDK_UART0->INTSTATUS & 0x3, 2, (CMSDK_UART_TypeDef*)CMSDK_UART0);}
mbed_official 80:bdf1132a57cf 259 void uart3_irq() {uart_irq(CMSDK_UART2->INTSTATUS & 0x3, 3, (CMSDK_UART_TypeDef*)CMSDK_UART2);}
mbed_official 80:bdf1132a57cf 260
mbed_official 80:bdf1132a57cf 261 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) {
mbed_official 80:bdf1132a57cf 262 irq_handler = handler;
mbed_official 80:bdf1132a57cf 263 uart_data[obj->index].serial_irq_id = id;
mbed_official 80:bdf1132a57cf 264 }
mbed_official 80:bdf1132a57cf 265
mbed_official 80:bdf1132a57cf 266 static void serial_irq_set_internal(serial_t *obj, SerialIrq irq, uint32_t enable) {
mbed_official 80:bdf1132a57cf 267 IRQn_Type irq_n = (IRQn_Type)0;
mbed_official 80:bdf1132a57cf 268 uint32_t vector = 0;
mbed_official 80:bdf1132a57cf 269 switch ((int)obj->uart)
mbed_official 80:bdf1132a57cf 270 {
mbed_official 80:bdf1132a57cf 271 case UART_0:
mbed_official 80:bdf1132a57cf 272 irq_n = UART0_IRQn;
mbed_official 80:bdf1132a57cf 273 vector = (uint32_t)&uart0_irq;
mbed_official 80:bdf1132a57cf 274 break;
mbed_official 80:bdf1132a57cf 275 case UART_1:
mbed_official 80:bdf1132a57cf 276 irq_n = UART1_IRQn;
mbed_official 80:bdf1132a57cf 277 vector = (uint32_t)&uart1_irq;
mbed_official 80:bdf1132a57cf 278 break;
mbed_official 80:bdf1132a57cf 279 case UART_2:
mbed_official 80:bdf1132a57cf 280 {
mbed_official 80:bdf1132a57cf 281 irq_n = UART2_IRQn;
mbed_official 80:bdf1132a57cf 282 vector = (uint32_t)&uart2_irq;
mbed_official 80:bdf1132a57cf 283 }
mbed_official 80:bdf1132a57cf 284 break;
mbed_official 80:bdf1132a57cf 285 case UART_3:
mbed_official 80:bdf1132a57cf 286 {
mbed_official 80:bdf1132a57cf 287 irq_n = UART3_IRQn;
mbed_official 80:bdf1132a57cf 288 vector = (uint32_t)&uart3_irq;
mbed_official 80:bdf1132a57cf 289 }
mbed_official 80:bdf1132a57cf 290 break;
mbed_official 80:bdf1132a57cf 291 }
mbed_official 80:bdf1132a57cf 292
mbed_official 80:bdf1132a57cf 293 if (enable)
mbed_official 80:bdf1132a57cf 294 {
mbed_official 80:bdf1132a57cf 295 if (irq == TxIrq)
mbed_official 80:bdf1132a57cf 296 {
mbed_official 80:bdf1132a57cf 297 /* set TX interrupt enable in CTRL REG */
mbed_official 80:bdf1132a57cf 298 obj->uart->CTRL |= CMSDK_UART_CTRL_TXIRQEN_Msk;
mbed_official 80:bdf1132a57cf 299 }
mbed_official 80:bdf1132a57cf 300 else
mbed_official 80:bdf1132a57cf 301 {
mbed_official 80:bdf1132a57cf 302 /* set Rx interrupt on in CTRL REG */
mbed_official 80:bdf1132a57cf 303 obj->uart->CTRL |= CMSDK_UART_CTRL_RXIRQEN_Msk;
mbed_official 80:bdf1132a57cf 304 }
mbed_official 80:bdf1132a57cf 305 NVIC_SetVector(irq_n, vector);
mbed_official 80:bdf1132a57cf 306 NVIC_EnableIRQ(irq_n);
mbed_official 80:bdf1132a57cf 307 }
mbed_official 80:bdf1132a57cf 308 else if ((irq == TxIrq) || (uart_data[obj->index].rx_irq_set_api + uart_data[obj->index].rx_irq_set_flow == 0))
mbed_official 80:bdf1132a57cf 309 { /* Disable IRQ */
mbed_official 80:bdf1132a57cf 310 int all_disabled = 0;
mbed_official 80:bdf1132a57cf 311 SerialIrq other_irq = (irq == RxIrq) ? (TxIrq) : (RxIrq);
mbed_official 80:bdf1132a57cf 312
mbed_official 80:bdf1132a57cf 313 obj->uart->CTRL &= ~(1 << (irq + 2));
mbed_official 80:bdf1132a57cf 314
mbed_official 80:bdf1132a57cf 315 all_disabled = (obj->uart->CTRL & (1 << (other_irq + 2))) == 0;
mbed_official 80:bdf1132a57cf 316
mbed_official 80:bdf1132a57cf 317 if (all_disabled)
mbed_official 80:bdf1132a57cf 318 {
mbed_official 80:bdf1132a57cf 319 NVIC_DisableIRQ(irq_n);
mbed_official 80:bdf1132a57cf 320 }
mbed_official 80:bdf1132a57cf 321 }
mbed_official 80:bdf1132a57cf 322 }
mbed_official 80:bdf1132a57cf 323
mbed_official 80:bdf1132a57cf 324 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) {
mbed_official 80:bdf1132a57cf 325 if (RxIrq == irq)
mbed_official 80:bdf1132a57cf 326 uart_data[obj->index].rx_irq_set_api = enable;
mbed_official 80:bdf1132a57cf 327 serial_irq_set_internal(obj, irq, enable);
mbed_official 80:bdf1132a57cf 328 }
mbed_official 80:bdf1132a57cf 329
mbed_official 80:bdf1132a57cf 330 /******************************************************************************
mbed_official 80:bdf1132a57cf 331 * READ/WRITE
mbed_official 80:bdf1132a57cf 332 ******************************************************************************/
mbed_official 80:bdf1132a57cf 333 int serial_getc(serial_t *obj) {
mbed_official 80:bdf1132a57cf 334 while (serial_readable(obj) == 0);
mbed_official 80:bdf1132a57cf 335 int data = obj->uart->DATA;
mbed_official 80:bdf1132a57cf 336 return data;
mbed_official 80:bdf1132a57cf 337 }
mbed_official 80:bdf1132a57cf 338
mbed_official 80:bdf1132a57cf 339 void serial_putc(serial_t *obj, int c) {
mbed_official 80:bdf1132a57cf 340 while (serial_writable(obj));
mbed_official 80:bdf1132a57cf 341 obj->uart->DATA = c;
mbed_official 80:bdf1132a57cf 342 }
mbed_official 80:bdf1132a57cf 343
mbed_official 80:bdf1132a57cf 344 int serial_readable(serial_t *obj) {
mbed_official 80:bdf1132a57cf 345 return obj->uart->STATE & 0x2;
mbed_official 80:bdf1132a57cf 346 }
mbed_official 80:bdf1132a57cf 347
mbed_official 80:bdf1132a57cf 348 int serial_writable(serial_t *obj) {
mbed_official 80:bdf1132a57cf 349 return obj->uart->STATE & 0x1;
mbed_official 80:bdf1132a57cf 350 }
mbed_official 80:bdf1132a57cf 351
mbed_official 80:bdf1132a57cf 352 void serial_clear(serial_t *obj) {
mbed_official 80:bdf1132a57cf 353 obj->uart->DATA = 0x00;
mbed_official 80:bdf1132a57cf 354 }
mbed_official 80:bdf1132a57cf 355
mbed_official 80:bdf1132a57cf 356 void serial_pinout_tx(PinName tx) {
mbed_official 80:bdf1132a57cf 357 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 80:bdf1132a57cf 358 }
mbed_official 80:bdf1132a57cf 359
mbed_official 80:bdf1132a57cf 360 void serial_break_set(serial_t *obj) {
mbed_official 80:bdf1132a57cf 361 }
mbed_official 80:bdf1132a57cf 362
mbed_official 80:bdf1132a57cf 363 void serial_break_clear(serial_t *obj) {
mbed_official 80:bdf1132a57cf 364 }
mbed_official 80:bdf1132a57cf 365 void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow) {
mbed_official 80:bdf1132a57cf 366 }
mbed_official 80:bdf1132a57cf 367