mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Mon Nov 10 07:45:06 2014 +0000
Revision:
395:bfce16e86ea4
Parent:
340:28d1f895c6fe
Child:
407:bbbab616ce8f
Synchronized with git revision 8adfd82aa1bf8859ec08537ee7bcd4aaaec1769b

Full URL: https://github.com/mbedmicro/mbed/commit/8adfd82aa1bf8859ec08537ee7bcd4aaaec1769b/

Targets: LPC176X - Add repeater pinmode

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 85:e1a8e879a6a9 1 /* mbed Microcontroller Library
mbed_official 104:a6a92e2e5a92 2 * Copyright (c) 2013 Nordic Semiconductor
mbed_official 85:e1a8e879a6a9 3 *
mbed_official 85:e1a8e879a6a9 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 85:e1a8e879a6a9 5 * you may not use this file except in compliance with the License.
mbed_official 85:e1a8e879a6a9 6 * You may obtain a copy of the License at
mbed_official 85:e1a8e879a6a9 7 *
mbed_official 85:e1a8e879a6a9 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 85:e1a8e879a6a9 9 *
mbed_official 85:e1a8e879a6a9 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 85:e1a8e879a6a9 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 85:e1a8e879a6a9 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 85:e1a8e879a6a9 13 * See the License for the specific language governing permissions and
mbed_official 85:e1a8e879a6a9 14 * limitations under the License.
mbed_official 85:e1a8e879a6a9 15 */
mbed_official 85:e1a8e879a6a9 16 // math.h required for floating point operations for baud rate calculation
mbed_official 85:e1a8e879a6a9 17 //#include <math.h>
mbed_official 85:e1a8e879a6a9 18 #include <string.h>
mbed_official 227:7bd0639b8911 19 #include "mbed_assert.h"
mbed_official 85:e1a8e879a6a9 20
mbed_official 85:e1a8e879a6a9 21 #include "serial_api.h"
mbed_official 85:e1a8e879a6a9 22 #include "cmsis.h"
mbed_official 85:e1a8e879a6a9 23 #include "pinmap.h"
mbed_official 227:7bd0639b8911 24
mbed_official 85:e1a8e879a6a9 25 /******************************************************************************
mbed_official 85:e1a8e879a6a9 26 * INITIALIZATION
mbed_official 85:e1a8e879a6a9 27 ******************************************************************************/
mbed_official 85:e1a8e879a6a9 28 #define UART_NUM 1
mbed_official 85:e1a8e879a6a9 29
mbed_official 85:e1a8e879a6a9 30 static uint32_t serial_irq_ids[UART_NUM] = {0};
mbed_official 85:e1a8e879a6a9 31 static uart_irq_handler irq_handler;
mbed_official 300:55638feb26a4 32 static uint32_t acceptedSpeeds[16][2] = {{1200, UART_BAUDRATE_BAUDRATE_Baud1200},
mbed_official 300:55638feb26a4 33 {2400, UART_BAUDRATE_BAUDRATE_Baud2400},
mbed_official 300:55638feb26a4 34 {4800, UART_BAUDRATE_BAUDRATE_Baud4800},
mbed_official 300:55638feb26a4 35 {9600, UART_BAUDRATE_BAUDRATE_Baud9600},
mbed_official 300:55638feb26a4 36 {14400, UART_BAUDRATE_BAUDRATE_Baud14400},
mbed_official 300:55638feb26a4 37 {19200, UART_BAUDRATE_BAUDRATE_Baud19200},
mbed_official 300:55638feb26a4 38 {28800, UART_BAUDRATE_BAUDRATE_Baud28800},
mbed_official 300:55638feb26a4 39 {38400, UART_BAUDRATE_BAUDRATE_Baud38400},
mbed_official 300:55638feb26a4 40 {57600, UART_BAUDRATE_BAUDRATE_Baud57600},
mbed_official 300:55638feb26a4 41 {76800, UART_BAUDRATE_BAUDRATE_Baud76800},
mbed_official 300:55638feb26a4 42 {115200, UART_BAUDRATE_BAUDRATE_Baud115200},
mbed_official 300:55638feb26a4 43 {230400, UART_BAUDRATE_BAUDRATE_Baud230400},
mbed_official 300:55638feb26a4 44 {250000, UART_BAUDRATE_BAUDRATE_Baud250000},
mbed_official 300:55638feb26a4 45 {460800, UART_BAUDRATE_BAUDRATE_Baud460800},
mbed_official 300:55638feb26a4 46 {921600, UART_BAUDRATE_BAUDRATE_Baud921600},
mbed_official 300:55638feb26a4 47 {1000000, UART_BAUDRATE_BAUDRATE_Baud1M}};
mbed_official 85:e1a8e879a6a9 48
mbed_official 85:e1a8e879a6a9 49 int stdio_uart_inited = 0;
mbed_official 85:e1a8e879a6a9 50 serial_t stdio_uart;
mbed_official 85:e1a8e879a6a9 51
mbed_official 85:e1a8e879a6a9 52
mbed_official 85:e1a8e879a6a9 53 void serial_init(serial_t *obj, PinName tx, PinName rx) {
mbed_official 288:17565898c031 54 UARTName uart = UART_0;
mbed_official 85:e1a8e879a6a9 55 obj->uart = (NRF_UART_Type *)uart;
mbed_official 300:55638feb26a4 56
mbed_official 227:7bd0639b8911 57 //pin configurations --
mbed_official 227:7bd0639b8911 58 //outputs
mbed_official 300:55638feb26a4 59 NRF_GPIO->DIR |= (1 << tx); //TX_PIN_NUMBER);
mbed_official 300:55638feb26a4 60 NRF_GPIO->DIR |= (1 << RTS_PIN_NUMBER);
mbed_official 85:e1a8e879a6a9 61
mbed_official 300:55638feb26a4 62 NRF_GPIO->DIR &= ~(1 << rx); //RX_PIN_NUMBER);
mbed_official 300:55638feb26a4 63 NRF_GPIO->DIR &= ~(1 << CTS_PIN_NUMBER);
mbed_official 300:55638feb26a4 64
mbed_official 85:e1a8e879a6a9 65 obj->uart->PSELRTS = RTS_PIN_NUMBER;
mbed_official 300:55638feb26a4 66 obj->uart->PSELTXD = tx; //TX_PIN_NUMBER;
mbed_official 300:55638feb26a4 67
mbed_official 85:e1a8e879a6a9 68 //inputs
mbed_official 85:e1a8e879a6a9 69 obj->uart->PSELCTS = CTS_PIN_NUMBER;
mbed_official 300:55638feb26a4 70 obj->uart->PSELRXD = rx; //RX_PIN_NUMBER;
mbed_official 300:55638feb26a4 71
mbed_official 300:55638feb26a4 72
mbed_official 85:e1a8e879a6a9 73 // set default baud rate and format
mbed_official 85:e1a8e879a6a9 74 serial_baud (obj, 9600);
mbed_official 85:e1a8e879a6a9 75 serial_format(obj, 8, ParityNone, 1);
mbed_official 300:55638feb26a4 76
mbed_official 300:55638feb26a4 77 obj->uart->ENABLE = (UART_ENABLE_ENABLE_Enabled << UART_ENABLE_ENABLE_Pos);
mbed_official 85:e1a8e879a6a9 78 obj->uart->TASKS_STARTTX = 1;
mbed_official 85:e1a8e879a6a9 79 obj->uart->TASKS_STARTRX = 1;
mbed_official 300:55638feb26a4 80 obj->uart->EVENTS_RXDRDY = 0;
mbed_official 300:55638feb26a4 81
mbed_official 85:e1a8e879a6a9 82 obj->index = 0;
mbed_official 300:55638feb26a4 83
mbed_official 85:e1a8e879a6a9 84 // set rx/tx pins in PullUp mode
mbed_official 339:40bd4701f3e2 85 if (tx != NC) {
mbed_official 339:40bd4701f3e2 86 pin_mode(tx, PullUp);
mbed_official 339:40bd4701f3e2 87 }
mbed_official 339:40bd4701f3e2 88 if (rx != NC) {
mbed_official 339:40bd4701f3e2 89 pin_mode(rx, PullUp);
mbed_official 339:40bd4701f3e2 90 }
mbed_official 300:55638feb26a4 91
mbed_official 85:e1a8e879a6a9 92 if (uart == STDIO_UART) {
mbed_official 85:e1a8e879a6a9 93 stdio_uart_inited = 1;
mbed_official 85:e1a8e879a6a9 94 memcpy(&stdio_uart, obj, sizeof(serial_t));
mbed_official 85:e1a8e879a6a9 95 }
mbed_official 85:e1a8e879a6a9 96 }
mbed_official 85:e1a8e879a6a9 97
mbed_official 300:55638feb26a4 98 void serial_free(serial_t *obj)
mbed_official 300:55638feb26a4 99 {
mbed_official 85:e1a8e879a6a9 100 serial_irq_ids[obj->index] = 0;
mbed_official 85:e1a8e879a6a9 101 }
mbed_official 85:e1a8e879a6a9 102
mbed_official 85:e1a8e879a6a9 103 // serial_baud
mbed_official 85:e1a8e879a6a9 104 // set the baud rate, taking in to account the current SystemFrequency
mbed_official 300:55638feb26a4 105 void serial_baud(serial_t *obj, int baudrate)
mbed_official 300:55638feb26a4 106 {
mbed_official 300:55638feb26a4 107 if (baudrate<=1200) {
mbed_official 85:e1a8e879a6a9 108 obj->uart->BAUDRATE = UART_BAUDRATE_BAUDRATE_Baud1200;
mbed_official 85:e1a8e879a6a9 109 return;
mbed_official 227:7bd0639b8911 110 }
mbed_official 300:55638feb26a4 111
mbed_official 300:55638feb26a4 112 for (int i = 1; i<16; i++) {
mbed_official 300:55638feb26a4 113 if (baudrate<acceptedSpeeds[i][0]) {
mbed_official 300:55638feb26a4 114 obj->uart->BAUDRATE = acceptedSpeeds[i - 1][1];
mbed_official 85:e1a8e879a6a9 115 return;
mbed_official 85:e1a8e879a6a9 116 }
mbed_official 85:e1a8e879a6a9 117 }
mbed_official 85:e1a8e879a6a9 118 obj->uart->BAUDRATE = UART_BAUDRATE_BAUDRATE_Baud1M;
mbed_official 85:e1a8e879a6a9 119 }
mbed_official 85:e1a8e879a6a9 120
mbed_official 300:55638feb26a4 121 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
mbed_official 300:55638feb26a4 122 {
mbed_official 85:e1a8e879a6a9 123 // 0: 1 stop bits, 1: 2 stop bits
mbed_official 300:55638feb26a4 124 // int parity_enable, parity_select;
mbed_official 85:e1a8e879a6a9 125 switch (parity) {
mbed_official 227:7bd0639b8911 126 case ParityNone:
mbed_official 300:55638feb26a4 127 obj->uart->CONFIG = 0;
mbed_official 300:55638feb26a4 128 break;
mbed_official 85:e1a8e879a6a9 129 default:
mbed_official 300:55638feb26a4 130 obj->uart->CONFIG = (UART_CONFIG_PARITY_Included << UART_CONFIG_PARITY_Pos);
mbed_official 85:e1a8e879a6a9 131 return;
mbed_official 85:e1a8e879a6a9 132 }
mbed_official 85:e1a8e879a6a9 133 //no Flow Control
mbed_official 85:e1a8e879a6a9 134 }
mbed_official 85:e1a8e879a6a9 135
mbed_official 85:e1a8e879a6a9 136 //******************************************************************************
mbed_official 85:e1a8e879a6a9 137 // * INTERRUPT HANDLING
mbed_official 85:e1a8e879a6a9 138 //******************************************************************************
mbed_official 300:55638feb26a4 139 static inline void uart_irq(uint32_t iir, uint32_t index)
mbed_official 300:55638feb26a4 140 {
mbed_official 85:e1a8e879a6a9 141 SerialIrq irq_type;
mbed_official 85:e1a8e879a6a9 142 switch (iir) {
mbed_official 227:7bd0639b8911 143 case 1:
mbed_official 227:7bd0639b8911 144 irq_type = TxIrq;
mbed_official 300:55638feb26a4 145 break;
mbed_official 227:7bd0639b8911 146 case 2:
mbed_official 227:7bd0639b8911 147 irq_type = RxIrq;
mbed_official 300:55638feb26a4 148 break;
mbed_official 300:55638feb26a4 149
mbed_official 300:55638feb26a4 150 default:
mbed_official 300:55638feb26a4 151 return;
mbed_official 85:e1a8e879a6a9 152 }
mbed_official 300:55638feb26a4 153
mbed_official 300:55638feb26a4 154 if (serial_irq_ids[index] != 0) {
mbed_official 85:e1a8e879a6a9 155 irq_handler(serial_irq_ids[index], irq_type);
mbed_official 85:e1a8e879a6a9 156 }
mbed_official 85:e1a8e879a6a9 157 }
mbed_official 300:55638feb26a4 158
mbed_official 85:e1a8e879a6a9 159 #ifdef __cplusplus
mbed_official 85:e1a8e879a6a9 160 extern "C" {
mbed_official 227:7bd0639b8911 161 #endif
mbed_official 85:e1a8e879a6a9 162 void UART0_IRQHandler()
mbed_official 85:e1a8e879a6a9 163 {
mbed_official 300:55638feb26a4 164 uint32_t irtype = 0;
mbed_official 300:55638feb26a4 165
mbed_official 340:28d1f895c6fe 166 if((NRF_UART0->INTENSET & 0x80) && NRF_UART0->EVENTS_TXDRDY) {
mbed_official 300:55638feb26a4 167 irtype = 1;
mbed_official 340:28d1f895c6fe 168 } else if((NRF_UART0->INTENSET & 0x04) && NRF_UART0->EVENTS_RXDRDY) {
mbed_official 300:55638feb26a4 169 irtype = 2;
mbed_official 85:e1a8e879a6a9 170 }
mbed_official 85:e1a8e879a6a9 171 uart_irq(irtype, 0);
mbed_official 85:e1a8e879a6a9 172 }
mbed_official 300:55638feb26a4 173
mbed_official 85:e1a8e879a6a9 174 #ifdef __cplusplus
mbed_official 85:e1a8e879a6a9 175 }
mbed_official 227:7bd0639b8911 176 #endif
mbed_official 300:55638feb26a4 177 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
mbed_official 300:55638feb26a4 178 {
mbed_official 300:55638feb26a4 179 irq_handler = handler;
mbed_official 85:e1a8e879a6a9 180 serial_irq_ids[obj->index] = id;
mbed_official 85:e1a8e879a6a9 181 }
mbed_official 85:e1a8e879a6a9 182
mbed_official 300:55638feb26a4 183 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
mbed_official 300:55638feb26a4 184 {
mbed_official 85:e1a8e879a6a9 185 IRQn_Type irq_n = (IRQn_Type)0;
mbed_official 85:e1a8e879a6a9 186
mbed_official 85:e1a8e879a6a9 187 switch ((int)obj->uart) {
mbed_official 300:55638feb26a4 188 case UART_0:
mbed_official 300:55638feb26a4 189 irq_n = UART0_IRQn;
mbed_official 85:e1a8e879a6a9 190 break;
mbed_official 85:e1a8e879a6a9 191 }
mbed_official 300:55638feb26a4 192
mbed_official 85:e1a8e879a6a9 193 if (enable) {
mbed_official 85:e1a8e879a6a9 194 switch (irq) {
mbed_official 300:55638feb26a4 195 case RxIrq:
mbed_official 300:55638feb26a4 196 obj->uart->INTENSET |= (UART_INTENSET_RXDRDY_Msk);
mbed_official 300:55638feb26a4 197 break;
mbed_official 300:55638feb26a4 198 case TxIrq:
mbed_official 300:55638feb26a4 199 obj->uart->INTENSET |= (UART_INTENSET_TXDRDY_Msk);
mbed_official 300:55638feb26a4 200 break;
mbed_official 85:e1a8e879a6a9 201 }
mbed_official 85:e1a8e879a6a9 202 NVIC_SetPriority(irq_n, 3);
mbed_official 85:e1a8e879a6a9 203 NVIC_EnableIRQ(irq_n);
mbed_official 300:55638feb26a4 204 } else { // disable
mbed_official 85:e1a8e879a6a9 205 int all_disabled = 0;
mbed_official 85:e1a8e879a6a9 206 switch (irq) {
mbed_official 300:55638feb26a4 207 case RxIrq:
mbed_official 300:55638feb26a4 208 obj->uart->INTENSET &= ~(UART_INTENSET_RXDRDY_Msk);
mbed_official 300:55638feb26a4 209 all_disabled = (obj->uart->INTENSET & (UART_INTENSET_TXDRDY_Msk))==0;
mbed_official 300:55638feb26a4 210 break;
mbed_official 300:55638feb26a4 211 case TxIrq:
mbed_official 300:55638feb26a4 212 obj->uart->INTENSET &= ~(UART_INTENSET_TXDRDY_Msk);
mbed_official 300:55638feb26a4 213 all_disabled = (obj->uart->INTENSET & (UART_INTENSET_RXDRDY_Msk))==0;
mbed_official 300:55638feb26a4 214 break;
mbed_official 85:e1a8e879a6a9 215 }
mbed_official 300:55638feb26a4 216
mbed_official 300:55638feb26a4 217 if (all_disabled) {
mbed_official 85:e1a8e879a6a9 218 NVIC_DisableIRQ(irq_n);
mbed_official 85:e1a8e879a6a9 219 }
mbed_official 85:e1a8e879a6a9 220 }
mbed_official 85:e1a8e879a6a9 221 }
mbed_official 85:e1a8e879a6a9 222
mbed_official 85:e1a8e879a6a9 223 //******************************************************************************
mbed_official 85:e1a8e879a6a9 224 //* READ/WRITE
mbed_official 85:e1a8e879a6a9 225 //******************************************************************************
mbed_official 300:55638feb26a4 226 int serial_getc(serial_t *obj)
mbed_official 300:55638feb26a4 227 {
mbed_official 300:55638feb26a4 228 while (!serial_readable(obj)) {
mbed_official 300:55638feb26a4 229 }
mbed_official 300:55638feb26a4 230
mbed_official 85:e1a8e879a6a9 231 obj->uart->EVENTS_RXDRDY = 0;
mbed_official 300:55638feb26a4 232
mbed_official 85:e1a8e879a6a9 233 return (uint8_t)obj->uart->RXD;
mbed_official 85:e1a8e879a6a9 234 }
mbed_official 85:e1a8e879a6a9 235
mbed_official 300:55638feb26a4 236 void serial_putc(serial_t *obj, int c)
mbed_official 300:55638feb26a4 237 {
mbed_official 85:e1a8e879a6a9 238 obj->uart->TXD = (uint8_t)c;
mbed_official 300:55638feb26a4 239
mbed_official 300:55638feb26a4 240 while (!serial_writable(obj)) {
mbed_official 300:55638feb26a4 241 }
mbed_official 300:55638feb26a4 242
mbed_official 300:55638feb26a4 243 obj->uart->EVENTS_TXDRDY = 0;
mbed_official 85:e1a8e879a6a9 244 }
mbed_official 85:e1a8e879a6a9 245
mbed_official 300:55638feb26a4 246 int serial_readable(serial_t *obj)
mbed_official 300:55638feb26a4 247 {
mbed_official 85:e1a8e879a6a9 248 return (obj->uart->EVENTS_RXDRDY == 1);
mbed_official 85:e1a8e879a6a9 249 }
mbed_official 85:e1a8e879a6a9 250
mbed_official 300:55638feb26a4 251 int serial_writable(serial_t *obj)
mbed_official 300:55638feb26a4 252 {
mbed_official 85:e1a8e879a6a9 253 return (obj->uart->EVENTS_TXDRDY ==1);
mbed_official 85:e1a8e879a6a9 254 }
mbed_official 85:e1a8e879a6a9 255
mbed_official 300:55638feb26a4 256 void serial_break_set(serial_t *obj)
mbed_official 300:55638feb26a4 257 {
mbed_official 85:e1a8e879a6a9 258 obj->uart->TASKS_SUSPEND = 1;
mbed_official 85:e1a8e879a6a9 259 }
mbed_official 85:e1a8e879a6a9 260
mbed_official 300:55638feb26a4 261 void serial_break_clear(serial_t *obj)
mbed_official 300:55638feb26a4 262 {
mbed_official 85:e1a8e879a6a9 263 obj->uart->TASKS_STARTTX = 1;
mbed_official 85:e1a8e879a6a9 264 obj->uart->TASKS_STARTRX = 1;
mbed_official 85:e1a8e879a6a9 265 }
mbed_official 340:28d1f895c6fe 266
mbed_official 340:28d1f895c6fe 267 void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow)
mbed_official 340:28d1f895c6fe 268 {
mbed_official 340:28d1f895c6fe 269
mbed_official 340:28d1f895c6fe 270 if (type == FlowControlRTSCTS || type == FlowControlRTS) {
mbed_official 340:28d1f895c6fe 271 NRF_GPIO->DIR |= (1<<rxflow);
mbed_official 340:28d1f895c6fe 272 pin_mode(rxflow, PullUp);
mbed_official 340:28d1f895c6fe 273 obj->uart->PSELRTS = rxflow;
mbed_official 340:28d1f895c6fe 274
mbed_official 340:28d1f895c6fe 275 obj->uart->CONFIG |= 0x01; // Enable HWFC
mbed_official 340:28d1f895c6fe 276 }
mbed_official 340:28d1f895c6fe 277
mbed_official 340:28d1f895c6fe 278 if (type == FlowControlRTSCTS || type == FlowControlCTS) {
mbed_official 340:28d1f895c6fe 279 NRF_GPIO->DIR &= ~(1<<txflow);
mbed_official 340:28d1f895c6fe 280 pin_mode(txflow, PullUp);
mbed_official 340:28d1f895c6fe 281 obj->uart->PSELCTS = txflow;
mbed_official 340:28d1f895c6fe 282
mbed_official 340:28d1f895c6fe 283 obj->uart->CONFIG |= 0x01; // Enable HWFC;
mbed_official 340:28d1f895c6fe 284 }
mbed_official 340:28d1f895c6fe 285
mbed_official 340:28d1f895c6fe 286 if (type == FlowControlNone) {
mbed_official 340:28d1f895c6fe 287 obj->uart->PSELRTS = 0xFFFFFFFF; // Disable RTS
mbed_official 340:28d1f895c6fe 288 obj->uart->PSELCTS = 0xFFFFFFFF; // Disable CTS
mbed_official 340:28d1f895c6fe 289
mbed_official 340:28d1f895c6fe 290 obj->uart->CONFIG &= ~0x01; // Enable HWFC;
mbed_official 340:28d1f895c6fe 291 }
mbed_official 340:28d1f895c6fe 292 }
mbed_official 340:28d1f895c6fe 293
mbed_official 340:28d1f895c6fe 294 void serial_clear(serial_t *obj) {
mbed_official 340:28d1f895c6fe 295 }