Frederick Huang / mbed-STM32L452

Dependents:   STM32L452_Nucleo_ticker

Fork of mbed-dev by mbed official

Committer:
<>
Date:
Thu Dec 15 11:48:27 2016 +0000
Revision:
152:9a67f0b066fc
Parent:
150:02e0a0aed4ec
This updates the lib to the mbed lib v131

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 121:7f86b4238bec 1 /* mbed Microcontroller Library
mbed_official 121:7f86b4238bec 2 * Copyright (c) 2006-2013 ARM Limited
mbed_official 121:7f86b4238bec 3 *
mbed_official 121:7f86b4238bec 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 121:7f86b4238bec 5 * you may not use this file except in compliance with the License.
mbed_official 121:7f86b4238bec 6 * You may obtain a copy of the License at
mbed_official 121:7f86b4238bec 7 *
mbed_official 121:7f86b4238bec 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 121:7f86b4238bec 9 *
mbed_official 121:7f86b4238bec 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 121:7f86b4238bec 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 121:7f86b4238bec 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 121:7f86b4238bec 13 * See the License for the specific language governing permissions and
mbed_official 121:7f86b4238bec 14 * limitations under the License.
mbed_official 121:7f86b4238bec 15 */
mbed_official 121:7f86b4238bec 16 #include "serial_api.h"
mbed_official 121:7f86b4238bec 17
mbed_official 121:7f86b4238bec 18 #if DEVICE_SERIAL
mbed_official 121:7f86b4238bec 19
mbed_official 121:7f86b4238bec 20 // math.h required for floating point operations for baud rate calculation
mbed_official 121:7f86b4238bec 21 #include <math.h>
mbed_official 121:7f86b4238bec 22 #include "mbed_assert.h"
mbed_official 121:7f86b4238bec 23
mbed_official 121:7f86b4238bec 24 #include <string.h>
mbed_official 121:7f86b4238bec 25
mbed_official 121:7f86b4238bec 26 #include "cmsis.h"
mbed_official 121:7f86b4238bec 27 #include "pinmap.h"
mbed_official 121:7f86b4238bec 28 #include "fsl_lpuart.h"
mbed_official 121:7f86b4238bec 29 #include "peripheral_clock_defines.h"
mbed_official 121:7f86b4238bec 30 #include "PeripheralPins.h"
mbed_official 121:7f86b4238bec 31 #include "fsl_clock_config.h"
mbed_official 121:7f86b4238bec 32
mbed_official 121:7f86b4238bec 33 static uint32_t serial_irq_ids[FSL_FEATURE_SOC_LPUART_COUNT] = {0};
mbed_official 121:7f86b4238bec 34 static uart_irq_handler irq_handler;
mbed_official 121:7f86b4238bec 35 /* Array of UART peripheral base address. */
mbed_official 121:7f86b4238bec 36 static LPUART_Type *const uart_addrs[] = LPUART_BASE_PTRS;
mbed_official 121:7f86b4238bec 37 /* Array of LPUART bus clock frequencies */
mbed_official 121:7f86b4238bec 38 static clock_name_t const uart_clocks[] = LPUART_CLOCK_FREQS;
mbed_official 121:7f86b4238bec 39
mbed_official 121:7f86b4238bec 40 int stdio_uart_inited = 0;
mbed_official 121:7f86b4238bec 41 serial_t stdio_uart;
mbed_official 121:7f86b4238bec 42
<> 152:9a67f0b066fc 43 void serial_init(serial_t *obj, PinName tx, PinName rx)
<> 152:9a67f0b066fc 44 {
mbed_official 121:7f86b4238bec 45 uint32_t uart_tx = pinmap_peripheral(tx, PinMap_UART_TX);
mbed_official 121:7f86b4238bec 46 uint32_t uart_rx = pinmap_peripheral(rx, PinMap_UART_RX);
mbed_official 121:7f86b4238bec 47 obj->index = pinmap_merge(uart_tx, uart_rx);
mbed_official 121:7f86b4238bec 48 MBED_ASSERT((int)obj->index != NC);
mbed_official 121:7f86b4238bec 49
mbed_official 121:7f86b4238bec 50 /* Set the LPUART clock source */
mbed_official 121:7f86b4238bec 51 if (obj->index == LPUART_0) {
mbed_official 121:7f86b4238bec 52 CLOCK_SetLpuart0Clock(1U);
mbed_official 121:7f86b4238bec 53 } else {
mbed_official 121:7f86b4238bec 54 CLOCK_SetLpuart1Clock(1U);
mbed_official 121:7f86b4238bec 55 }
mbed_official 121:7f86b4238bec 56
mbed_official 121:7f86b4238bec 57 lpuart_config_t config;
mbed_official 121:7f86b4238bec 58 LPUART_GetDefaultConfig(&config);
mbed_official 121:7f86b4238bec 59 config.baudRate_Bps = 9600;
mbed_official 121:7f86b4238bec 60 config.enableTx = false;
mbed_official 121:7f86b4238bec 61 config.enableRx = false;
mbed_official 121:7f86b4238bec 62
mbed_official 121:7f86b4238bec 63 LPUART_Init(uart_addrs[obj->index], &config, CLOCK_GetFreq(uart_clocks[obj->index]));
mbed_official 121:7f86b4238bec 64
mbed_official 121:7f86b4238bec 65 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 121:7f86b4238bec 66 pinmap_pinout(rx, PinMap_UART_RX);
mbed_official 121:7f86b4238bec 67
mbed_official 121:7f86b4238bec 68 if (tx != NC) {
mbed_official 121:7f86b4238bec 69 LPUART_EnableTx(uart_addrs[obj->index], true);
mbed_official 121:7f86b4238bec 70 pin_mode(tx, PullUp);
mbed_official 121:7f86b4238bec 71 }
mbed_official 121:7f86b4238bec 72 if (rx != NC) {
mbed_official 121:7f86b4238bec 73 LPUART_EnableRx(uart_addrs[obj->index], true);
mbed_official 121:7f86b4238bec 74 pin_mode(rx, PullUp);
mbed_official 121:7f86b4238bec 75 }
mbed_official 121:7f86b4238bec 76
mbed_official 121:7f86b4238bec 77 if (obj->index == STDIO_UART) {
mbed_official 121:7f86b4238bec 78 stdio_uart_inited = 1;
mbed_official 121:7f86b4238bec 79 memcpy(&stdio_uart, obj, sizeof(serial_t));
mbed_official 121:7f86b4238bec 80 }
mbed_official 121:7f86b4238bec 81 }
mbed_official 121:7f86b4238bec 82
<> 152:9a67f0b066fc 83 void serial_free(serial_t *obj)
<> 152:9a67f0b066fc 84 {
mbed_official 121:7f86b4238bec 85 LPUART_Deinit(uart_addrs[obj->index]);
mbed_official 121:7f86b4238bec 86 serial_irq_ids[obj->index] = 0;
mbed_official 121:7f86b4238bec 87 }
mbed_official 121:7f86b4238bec 88
<> 152:9a67f0b066fc 89 void serial_baud(serial_t *obj, int baudrate)
<> 152:9a67f0b066fc 90 {
mbed_official 121:7f86b4238bec 91 LPUART_SetBaudRate(uart_addrs[obj->index], (uint32_t)baudrate, CLOCK_GetFreq(uart_clocks[obj->index]));
mbed_official 121:7f86b4238bec 92 }
mbed_official 121:7f86b4238bec 93
<> 152:9a67f0b066fc 94 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
<> 152:9a67f0b066fc 95 {
mbed_official 121:7f86b4238bec 96 LPUART_Type *base = uart_addrs[obj->index];
mbed_official 121:7f86b4238bec 97 uint8_t temp;
mbed_official 121:7f86b4238bec 98 /* Set bit count and parity mode. */
mbed_official 121:7f86b4238bec 99 temp = base->CTRL & ~(LPUART_CTRL_PE_MASK | LPUART_CTRL_PT_MASK | LPUART_CTRL_M_MASK);
mbed_official 121:7f86b4238bec 100 if (parity != ParityNone)
mbed_official 121:7f86b4238bec 101 {
mbed_official 121:7f86b4238bec 102 /* Enable Parity */
mbed_official 121:7f86b4238bec 103 temp |= (LPUART_CTRL_PE_MASK | LPUART_CTRL_M_MASK);
mbed_official 121:7f86b4238bec 104 if (parity == ParityOdd) {
mbed_official 121:7f86b4238bec 105 temp |= LPUART_CTRL_PT_MASK;
<> 148:21d94c44109e 106 } else if (parity == ParityEven) {
<> 148:21d94c44109e 107 // PT=0 so nothing more to do
mbed_official 121:7f86b4238bec 108 } else {
mbed_official 121:7f86b4238bec 109 // Hardware does not support forced parity
mbed_official 121:7f86b4238bec 110 MBED_ASSERT(0);
mbed_official 121:7f86b4238bec 111 }
mbed_official 121:7f86b4238bec 112 }
mbed_official 121:7f86b4238bec 113 base->CTRL = temp;
mbed_official 121:7f86b4238bec 114
mbed_official 121:7f86b4238bec 115 #if defined(FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT) && FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT
mbed_official 121:7f86b4238bec 116 /* set stop bit per char */
mbed_official 121:7f86b4238bec 117 temp = base->BAUD & ~LPUART_BAUD_SBNS_MASK;
mbed_official 121:7f86b4238bec 118 base->BAUD = temp | LPUART_BAUD_SBNS((uint8_t)--stop_bits);
mbed_official 121:7f86b4238bec 119 #endif
mbed_official 121:7f86b4238bec 120 }
mbed_official 121:7f86b4238bec 121
mbed_official 121:7f86b4238bec 122 /******************************************************************************
mbed_official 121:7f86b4238bec 123 * INTERRUPTS HANDLING
mbed_official 121:7f86b4238bec 124 ******************************************************************************/
<> 152:9a67f0b066fc 125 static inline void uart_irq(uint32_t transmit_empty, uint32_t receive_full, uint32_t index)
<> 152:9a67f0b066fc 126 {
mbed_official 121:7f86b4238bec 127 LPUART_Type *base = uart_addrs[index];
mbed_official 121:7f86b4238bec 128
mbed_official 121:7f86b4238bec 129 /* If RX overrun. */
mbed_official 121:7f86b4238bec 130 if (LPUART_STAT_OR_MASK & base->STAT)
mbed_official 121:7f86b4238bec 131 {
mbed_official 121:7f86b4238bec 132 /* Read base->D, otherwise the RX does not work. */
mbed_official 121:7f86b4238bec 133 (void)base->DATA;
mbed_official 121:7f86b4238bec 134 LPUART_ClearStatusFlags(base, kLPUART_RxOverrunFlag);
mbed_official 121:7f86b4238bec 135 }
mbed_official 121:7f86b4238bec 136
mbed_official 121:7f86b4238bec 137 if (serial_irq_ids[index] != 0) {
mbed_official 121:7f86b4238bec 138 if (transmit_empty)
mbed_official 121:7f86b4238bec 139 irq_handler(serial_irq_ids[index], TxIrq);
mbed_official 121:7f86b4238bec 140
mbed_official 121:7f86b4238bec 141 if (receive_full)
mbed_official 121:7f86b4238bec 142 irq_handler(serial_irq_ids[index], RxIrq);
mbed_official 121:7f86b4238bec 143 }
mbed_official 121:7f86b4238bec 144 }
mbed_official 121:7f86b4238bec 145
<> 152:9a67f0b066fc 146 void uart0_irq()
<> 152:9a67f0b066fc 147 {
mbed_official 121:7f86b4238bec 148 uint32_t status_flags = LPUART0->STAT;
mbed_official 121:7f86b4238bec 149 uart_irq((status_flags & kLPUART_TxDataRegEmptyFlag), (status_flags & kLPUART_RxDataRegFullFlag), 0);
mbed_official 121:7f86b4238bec 150 }
mbed_official 121:7f86b4238bec 151
<> 152:9a67f0b066fc 152 void uart1_irq()
<> 152:9a67f0b066fc 153 {
mbed_official 121:7f86b4238bec 154 uint32_t status_flags = LPUART1->STAT;
mbed_official 121:7f86b4238bec 155 uart_irq((status_flags & kLPUART_TxDataRegEmptyFlag), (status_flags & kLPUART_RxDataRegFullFlag), 1);
mbed_official 121:7f86b4238bec 156 }
mbed_official 121:7f86b4238bec 157
<> 152:9a67f0b066fc 158 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
<> 152:9a67f0b066fc 159 {
mbed_official 121:7f86b4238bec 160 irq_handler = handler;
mbed_official 121:7f86b4238bec 161 serial_irq_ids[obj->index] = id;
mbed_official 121:7f86b4238bec 162 }
mbed_official 121:7f86b4238bec 163
<> 152:9a67f0b066fc 164 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
<> 152:9a67f0b066fc 165 {
mbed_official 121:7f86b4238bec 166 IRQn_Type uart_irqs[] = LPUART_RX_TX_IRQS;
mbed_official 121:7f86b4238bec 167 uint32_t vector = 0;
mbed_official 121:7f86b4238bec 168
mbed_official 121:7f86b4238bec 169 switch (obj->index) {
mbed_official 121:7f86b4238bec 170 case 0:
mbed_official 121:7f86b4238bec 171 vector = (uint32_t)&uart0_irq;
mbed_official 121:7f86b4238bec 172 break;
mbed_official 121:7f86b4238bec 173 case 1:
mbed_official 121:7f86b4238bec 174 vector = (uint32_t)&uart1_irq;
mbed_official 121:7f86b4238bec 175 break;
mbed_official 121:7f86b4238bec 176 default:
mbed_official 121:7f86b4238bec 177 break;
mbed_official 121:7f86b4238bec 178 }
mbed_official 121:7f86b4238bec 179
mbed_official 121:7f86b4238bec 180 if (enable) {
mbed_official 121:7f86b4238bec 181 switch (irq) {
mbed_official 121:7f86b4238bec 182 case RxIrq:
mbed_official 121:7f86b4238bec 183 LPUART_EnableInterrupts(uart_addrs[obj->index], kLPUART_RxDataRegFullInterruptEnable);
mbed_official 121:7f86b4238bec 184 break;
mbed_official 121:7f86b4238bec 185 case TxIrq:
mbed_official 121:7f86b4238bec 186 LPUART_EnableInterrupts(uart_addrs[obj->index], kLPUART_TxDataRegEmptyInterruptEnable);
mbed_official 121:7f86b4238bec 187 break;
mbed_official 121:7f86b4238bec 188 default:
mbed_official 121:7f86b4238bec 189 break;
mbed_official 121:7f86b4238bec 190 }
mbed_official 121:7f86b4238bec 191 NVIC_SetVector(uart_irqs[obj->index], vector);
mbed_official 121:7f86b4238bec 192 NVIC_EnableIRQ(uart_irqs[obj->index]);
mbed_official 121:7f86b4238bec 193
mbed_official 121:7f86b4238bec 194 } else { // disable
mbed_official 121:7f86b4238bec 195 int all_disabled = 0;
mbed_official 121:7f86b4238bec 196 SerialIrq other_irq = (irq == RxIrq) ? (TxIrq) : (RxIrq);
mbed_official 121:7f86b4238bec 197 switch (irq) {
mbed_official 121:7f86b4238bec 198 case RxIrq:
mbed_official 121:7f86b4238bec 199 LPUART_DisableInterrupts(uart_addrs[obj->index], kLPUART_RxDataRegFullInterruptEnable);
mbed_official 121:7f86b4238bec 200 break;
mbed_official 121:7f86b4238bec 201 case TxIrq:
mbed_official 121:7f86b4238bec 202 LPUART_DisableInterrupts(uart_addrs[obj->index], kLPUART_TxDataRegEmptyInterruptEnable);
mbed_official 121:7f86b4238bec 203 break;
mbed_official 121:7f86b4238bec 204 default:
mbed_official 121:7f86b4238bec 205 break;
mbed_official 121:7f86b4238bec 206 }
mbed_official 121:7f86b4238bec 207 switch (other_irq) {
mbed_official 121:7f86b4238bec 208 case RxIrq:
mbed_official 121:7f86b4238bec 209 all_disabled = ((LPUART_GetEnabledInterrupts(uart_addrs[obj->index]) & kLPUART_RxDataRegFullInterruptEnable) == 0);
mbed_official 121:7f86b4238bec 210 break;
mbed_official 121:7f86b4238bec 211 case TxIrq:
mbed_official 121:7f86b4238bec 212 all_disabled = ((LPUART_GetEnabledInterrupts(uart_addrs[obj->index]) & kLPUART_TxDataRegEmptyInterruptEnable) == 0);
mbed_official 121:7f86b4238bec 213 break;
mbed_official 121:7f86b4238bec 214 default:
mbed_official 121:7f86b4238bec 215 break;
mbed_official 121:7f86b4238bec 216 }
mbed_official 121:7f86b4238bec 217 if (all_disabled)
mbed_official 121:7f86b4238bec 218 NVIC_DisableIRQ(uart_irqs[obj->index]);
mbed_official 121:7f86b4238bec 219 }
mbed_official 121:7f86b4238bec 220 }
mbed_official 121:7f86b4238bec 221
<> 152:9a67f0b066fc 222 int serial_getc(serial_t *obj)
<> 152:9a67f0b066fc 223 {
mbed_official 121:7f86b4238bec 224 uint8_t data;
mbed_official 121:7f86b4238bec 225
mbed_official 121:7f86b4238bec 226 LPUART_ReadBlocking(uart_addrs[obj->index], &data, 1);
mbed_official 121:7f86b4238bec 227 return data;
mbed_official 121:7f86b4238bec 228 }
mbed_official 121:7f86b4238bec 229
<> 152:9a67f0b066fc 230 void serial_putc(serial_t *obj, int c)
<> 152:9a67f0b066fc 231 {
mbed_official 121:7f86b4238bec 232 while (!serial_writable(obj));
mbed_official 121:7f86b4238bec 233 LPUART_WriteByte(uart_addrs[obj->index], (uint8_t)c);
mbed_official 121:7f86b4238bec 234 }
mbed_official 121:7f86b4238bec 235
<> 152:9a67f0b066fc 236 int serial_readable(serial_t *obj)
<> 152:9a67f0b066fc 237 {
mbed_official 121:7f86b4238bec 238 uint32_t status_flags = LPUART_GetStatusFlags(uart_addrs[obj->index]);
mbed_official 121:7f86b4238bec 239 if (status_flags & kLPUART_RxOverrunFlag)
mbed_official 121:7f86b4238bec 240 LPUART_ClearStatusFlags(uart_addrs[obj->index], kLPUART_RxOverrunFlag);
mbed_official 121:7f86b4238bec 241 return (status_flags & kLPUART_RxDataRegFullFlag);
mbed_official 121:7f86b4238bec 242 }
mbed_official 121:7f86b4238bec 243
<> 152:9a67f0b066fc 244 int serial_writable(serial_t *obj)
<> 152:9a67f0b066fc 245 {
mbed_official 121:7f86b4238bec 246 uint32_t status_flags = LPUART_GetStatusFlags(uart_addrs[obj->index]);
mbed_official 121:7f86b4238bec 247 if (status_flags & kLPUART_RxOverrunFlag)
mbed_official 121:7f86b4238bec 248 LPUART_ClearStatusFlags(uart_addrs[obj->index], kLPUART_RxOverrunFlag);
mbed_official 121:7f86b4238bec 249 return (status_flags & kLPUART_TxDataRegEmptyFlag);
mbed_official 121:7f86b4238bec 250 }
mbed_official 121:7f86b4238bec 251
<> 152:9a67f0b066fc 252 void serial_clear(serial_t *obj)
<> 152:9a67f0b066fc 253 {
mbed_official 121:7f86b4238bec 254 }
mbed_official 121:7f86b4238bec 255
<> 152:9a67f0b066fc 256 void serial_pinout_tx(PinName tx)
<> 152:9a67f0b066fc 257 {
mbed_official 121:7f86b4238bec 258 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 121:7f86b4238bec 259 }
mbed_official 121:7f86b4238bec 260
<> 152:9a67f0b066fc 261 void serial_break_set(serial_t *obj)
<> 152:9a67f0b066fc 262 {
mbed_official 121:7f86b4238bec 263 uart_addrs[obj->index]->CTRL |= LPUART_CTRL_SBK_MASK;
mbed_official 121:7f86b4238bec 264 }
mbed_official 121:7f86b4238bec 265
<> 152:9a67f0b066fc 266 void serial_break_clear(serial_t *obj)
<> 152:9a67f0b066fc 267 {
mbed_official 121:7f86b4238bec 268 uart_addrs[obj->index]->CTRL &= ~LPUART_CTRL_SBK_MASK;
mbed_official 121:7f86b4238bec 269 }
mbed_official 121:7f86b4238bec 270
mbed_official 121:7f86b4238bec 271 #endif