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:
121:7f86b4238bec
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 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
mbed_official 121:7f86b4238bec 43 void serial_init(serial_t *obj, PinName tx, PinName rx) {
mbed_official 121:7f86b4238bec 44 uint32_t uart_tx = pinmap_peripheral(tx, PinMap_UART_TX);
mbed_official 121:7f86b4238bec 45 uint32_t uart_rx = pinmap_peripheral(rx, PinMap_UART_RX);
mbed_official 121:7f86b4238bec 46 obj->index = pinmap_merge(uart_tx, uart_rx);
mbed_official 121:7f86b4238bec 47 MBED_ASSERT((int)obj->index != NC);
mbed_official 121:7f86b4238bec 48
mbed_official 121:7f86b4238bec 49 // Need to initialize the clocks here as ticker init gets called before mbed_sdk_init
mbed_official 121:7f86b4238bec 50 if (SystemCoreClock == DEFAULT_SYSTEM_CLOCK)
mbed_official 121:7f86b4238bec 51 BOARD_BootClockRUN();
mbed_official 121:7f86b4238bec 52
mbed_official 121:7f86b4238bec 53 /* Set the LPUART clock source */
mbed_official 121:7f86b4238bec 54 if (obj->index == LPUART_0) {
mbed_official 121:7f86b4238bec 55 CLOCK_SetLpuart0Clock(1U);
mbed_official 121:7f86b4238bec 56 } else {
mbed_official 121:7f86b4238bec 57 CLOCK_SetLpuart1Clock(1U);
mbed_official 121:7f86b4238bec 58 }
mbed_official 121:7f86b4238bec 59
mbed_official 121:7f86b4238bec 60 lpuart_config_t config;
mbed_official 121:7f86b4238bec 61 LPUART_GetDefaultConfig(&config);
mbed_official 121:7f86b4238bec 62 config.baudRate_Bps = 9600;
mbed_official 121:7f86b4238bec 63 config.enableTx = false;
mbed_official 121:7f86b4238bec 64 config.enableRx = false;
mbed_official 121:7f86b4238bec 65
mbed_official 121:7f86b4238bec 66 LPUART_Init(uart_addrs[obj->index], &config, CLOCK_GetFreq(uart_clocks[obj->index]));
mbed_official 121:7f86b4238bec 67
mbed_official 121:7f86b4238bec 68 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 121:7f86b4238bec 69 pinmap_pinout(rx, PinMap_UART_RX);
mbed_official 121:7f86b4238bec 70
mbed_official 121:7f86b4238bec 71 if (tx != NC) {
mbed_official 121:7f86b4238bec 72 LPUART_EnableTx(uart_addrs[obj->index], true);
mbed_official 121:7f86b4238bec 73 pin_mode(tx, PullUp);
mbed_official 121:7f86b4238bec 74 }
mbed_official 121:7f86b4238bec 75 if (rx != NC) {
mbed_official 121:7f86b4238bec 76 LPUART_EnableRx(uart_addrs[obj->index], true);
mbed_official 121:7f86b4238bec 77 pin_mode(rx, PullUp);
mbed_official 121:7f86b4238bec 78 }
mbed_official 121:7f86b4238bec 79
mbed_official 121:7f86b4238bec 80 if (obj->index == STDIO_UART) {
mbed_official 121:7f86b4238bec 81 stdio_uart_inited = 1;
mbed_official 121:7f86b4238bec 82 memcpy(&stdio_uart, obj, sizeof(serial_t));
mbed_official 121:7f86b4238bec 83 }
mbed_official 121:7f86b4238bec 84 }
mbed_official 121:7f86b4238bec 85
mbed_official 121:7f86b4238bec 86 void serial_free(serial_t *obj) {
mbed_official 121:7f86b4238bec 87 LPUART_Deinit(uart_addrs[obj->index]);
mbed_official 121:7f86b4238bec 88 serial_irq_ids[obj->index] = 0;
mbed_official 121:7f86b4238bec 89 }
mbed_official 121:7f86b4238bec 90
mbed_official 121:7f86b4238bec 91 void serial_baud(serial_t *obj, int baudrate) {
mbed_official 121:7f86b4238bec 92 LPUART_SetBaudRate(uart_addrs[obj->index], (uint32_t)baudrate, CLOCK_GetFreq(uart_clocks[obj->index]));
mbed_official 121:7f86b4238bec 93 }
mbed_official 121:7f86b4238bec 94
mbed_official 121:7f86b4238bec 95 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) {
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;
mbed_official 121:7f86b4238bec 106 } else {
mbed_official 121:7f86b4238bec 107 // Hardware does not support forced parity
mbed_official 121:7f86b4238bec 108 MBED_ASSERT(0);
mbed_official 121:7f86b4238bec 109 }
mbed_official 121:7f86b4238bec 110 }
mbed_official 121:7f86b4238bec 111 base->CTRL = temp;
mbed_official 121:7f86b4238bec 112
mbed_official 121:7f86b4238bec 113 #if defined(FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT) && FSL_FEATURE_LPUART_HAS_STOP_BIT_CONFIG_SUPPORT
mbed_official 121:7f86b4238bec 114 /* set stop bit per char */
mbed_official 121:7f86b4238bec 115 temp = base->BAUD & ~LPUART_BAUD_SBNS_MASK;
mbed_official 121:7f86b4238bec 116 base->BAUD = temp | LPUART_BAUD_SBNS((uint8_t)--stop_bits);
mbed_official 121:7f86b4238bec 117 #endif
mbed_official 121:7f86b4238bec 118 }
mbed_official 121:7f86b4238bec 119
mbed_official 121:7f86b4238bec 120 /******************************************************************************
mbed_official 121:7f86b4238bec 121 * INTERRUPTS HANDLING
mbed_official 121:7f86b4238bec 122 ******************************************************************************/
mbed_official 121:7f86b4238bec 123 static inline void uart_irq(uint32_t transmit_empty, uint32_t receive_full, uint32_t index) {
mbed_official 121:7f86b4238bec 124 LPUART_Type *base = uart_addrs[index];
mbed_official 121:7f86b4238bec 125
mbed_official 121:7f86b4238bec 126 /* If RX overrun. */
mbed_official 121:7f86b4238bec 127 if (LPUART_STAT_OR_MASK & base->STAT)
mbed_official 121:7f86b4238bec 128 {
mbed_official 121:7f86b4238bec 129 /* Read base->D, otherwise the RX does not work. */
mbed_official 121:7f86b4238bec 130 (void)base->DATA;
mbed_official 121:7f86b4238bec 131 LPUART_ClearStatusFlags(base, kLPUART_RxOverrunFlag);
mbed_official 121:7f86b4238bec 132 }
mbed_official 121:7f86b4238bec 133
mbed_official 121:7f86b4238bec 134 if (serial_irq_ids[index] != 0) {
mbed_official 121:7f86b4238bec 135 if (transmit_empty)
mbed_official 121:7f86b4238bec 136 irq_handler(serial_irq_ids[index], TxIrq);
mbed_official 121:7f86b4238bec 137
mbed_official 121:7f86b4238bec 138 if (receive_full)
mbed_official 121:7f86b4238bec 139 irq_handler(serial_irq_ids[index], RxIrq);
mbed_official 121:7f86b4238bec 140 }
mbed_official 121:7f86b4238bec 141 }
mbed_official 121:7f86b4238bec 142
mbed_official 121:7f86b4238bec 143 void uart0_irq() {
mbed_official 121:7f86b4238bec 144 uint32_t status_flags = LPUART0->STAT;
mbed_official 121:7f86b4238bec 145 uart_irq((status_flags & kLPUART_TxDataRegEmptyFlag), (status_flags & kLPUART_RxDataRegFullFlag), 0);
mbed_official 121:7f86b4238bec 146 }
mbed_official 121:7f86b4238bec 147
mbed_official 121:7f86b4238bec 148 void uart1_irq() {
mbed_official 121:7f86b4238bec 149 uint32_t status_flags = LPUART1->STAT;
mbed_official 121:7f86b4238bec 150 uart_irq((status_flags & kLPUART_TxDataRegEmptyFlag), (status_flags & kLPUART_RxDataRegFullFlag), 1);
mbed_official 121:7f86b4238bec 151 }
mbed_official 121:7f86b4238bec 152
mbed_official 121:7f86b4238bec 153 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) {
mbed_official 121:7f86b4238bec 154 irq_handler = handler;
mbed_official 121:7f86b4238bec 155 serial_irq_ids[obj->index] = id;
mbed_official 121:7f86b4238bec 156 }
mbed_official 121:7f86b4238bec 157
mbed_official 121:7f86b4238bec 158 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) {
mbed_official 121:7f86b4238bec 159 IRQn_Type uart_irqs[] = LPUART_RX_TX_IRQS;
mbed_official 121:7f86b4238bec 160 uint32_t vector = 0;
mbed_official 121:7f86b4238bec 161
mbed_official 121:7f86b4238bec 162 switch (obj->index) {
mbed_official 121:7f86b4238bec 163 case 0:
mbed_official 121:7f86b4238bec 164 vector = (uint32_t)&uart0_irq;
mbed_official 121:7f86b4238bec 165 break;
mbed_official 121:7f86b4238bec 166 case 1:
mbed_official 121:7f86b4238bec 167 vector = (uint32_t)&uart1_irq;
mbed_official 121:7f86b4238bec 168 break;
mbed_official 121:7f86b4238bec 169 default:
mbed_official 121:7f86b4238bec 170 break;
mbed_official 121:7f86b4238bec 171 }
mbed_official 121:7f86b4238bec 172
mbed_official 121:7f86b4238bec 173 if (enable) {
mbed_official 121:7f86b4238bec 174 switch (irq) {
mbed_official 121:7f86b4238bec 175 case RxIrq:
mbed_official 121:7f86b4238bec 176 LPUART_EnableInterrupts(uart_addrs[obj->index], kLPUART_RxDataRegFullInterruptEnable);
mbed_official 121:7f86b4238bec 177 break;
mbed_official 121:7f86b4238bec 178 case TxIrq:
mbed_official 121:7f86b4238bec 179 LPUART_EnableInterrupts(uart_addrs[obj->index], kLPUART_TxDataRegEmptyInterruptEnable);
mbed_official 121:7f86b4238bec 180 break;
mbed_official 121:7f86b4238bec 181 default:
mbed_official 121:7f86b4238bec 182 break;
mbed_official 121:7f86b4238bec 183 }
mbed_official 121:7f86b4238bec 184 NVIC_SetVector(uart_irqs[obj->index], vector);
mbed_official 121:7f86b4238bec 185 NVIC_EnableIRQ(uart_irqs[obj->index]);
mbed_official 121:7f86b4238bec 186
mbed_official 121:7f86b4238bec 187 } else { // disable
mbed_official 121:7f86b4238bec 188 int all_disabled = 0;
mbed_official 121:7f86b4238bec 189 SerialIrq other_irq = (irq == RxIrq) ? (TxIrq) : (RxIrq);
mbed_official 121:7f86b4238bec 190 switch (irq) {
mbed_official 121:7f86b4238bec 191 case RxIrq:
mbed_official 121:7f86b4238bec 192 LPUART_DisableInterrupts(uart_addrs[obj->index], kLPUART_RxDataRegFullInterruptEnable);
mbed_official 121:7f86b4238bec 193 break;
mbed_official 121:7f86b4238bec 194 case TxIrq:
mbed_official 121:7f86b4238bec 195 LPUART_DisableInterrupts(uart_addrs[obj->index], kLPUART_TxDataRegEmptyInterruptEnable);
mbed_official 121:7f86b4238bec 196 break;
mbed_official 121:7f86b4238bec 197 default:
mbed_official 121:7f86b4238bec 198 break;
mbed_official 121:7f86b4238bec 199 }
mbed_official 121:7f86b4238bec 200 switch (other_irq) {
mbed_official 121:7f86b4238bec 201 case RxIrq:
mbed_official 121:7f86b4238bec 202 all_disabled = ((LPUART_GetEnabledInterrupts(uart_addrs[obj->index]) & kLPUART_RxDataRegFullInterruptEnable) == 0);
mbed_official 121:7f86b4238bec 203 break;
mbed_official 121:7f86b4238bec 204 case TxIrq:
mbed_official 121:7f86b4238bec 205 all_disabled = ((LPUART_GetEnabledInterrupts(uart_addrs[obj->index]) & kLPUART_TxDataRegEmptyInterruptEnable) == 0);
mbed_official 121:7f86b4238bec 206 break;
mbed_official 121:7f86b4238bec 207 default:
mbed_official 121:7f86b4238bec 208 break;
mbed_official 121:7f86b4238bec 209 }
mbed_official 121:7f86b4238bec 210 if (all_disabled)
mbed_official 121:7f86b4238bec 211 NVIC_DisableIRQ(uart_irqs[obj->index]);
mbed_official 121:7f86b4238bec 212 }
mbed_official 121:7f86b4238bec 213 }
mbed_official 121:7f86b4238bec 214
mbed_official 121:7f86b4238bec 215 int serial_getc(serial_t *obj) {
mbed_official 121:7f86b4238bec 216 uint8_t data;
mbed_official 121:7f86b4238bec 217
mbed_official 121:7f86b4238bec 218 LPUART_ReadBlocking(uart_addrs[obj->index], &data, 1);
mbed_official 121:7f86b4238bec 219 return data;
mbed_official 121:7f86b4238bec 220 }
mbed_official 121:7f86b4238bec 221
mbed_official 121:7f86b4238bec 222 void serial_putc(serial_t *obj, int c) {
mbed_official 121:7f86b4238bec 223 while (!serial_writable(obj));
mbed_official 121:7f86b4238bec 224 LPUART_WriteByte(uart_addrs[obj->index], (uint8_t)c);
mbed_official 121:7f86b4238bec 225 }
mbed_official 121:7f86b4238bec 226
mbed_official 121:7f86b4238bec 227 int serial_readable(serial_t *obj) {
mbed_official 121:7f86b4238bec 228 uint32_t status_flags = LPUART_GetStatusFlags(uart_addrs[obj->index]);
mbed_official 121:7f86b4238bec 229 if (status_flags & kLPUART_RxOverrunFlag)
mbed_official 121:7f86b4238bec 230 LPUART_ClearStatusFlags(uart_addrs[obj->index], kLPUART_RxOverrunFlag);
mbed_official 121:7f86b4238bec 231 return (status_flags & kLPUART_RxDataRegFullFlag);
mbed_official 121:7f86b4238bec 232 }
mbed_official 121:7f86b4238bec 233
mbed_official 121:7f86b4238bec 234 int serial_writable(serial_t *obj) {
mbed_official 121:7f86b4238bec 235 uint32_t status_flags = LPUART_GetStatusFlags(uart_addrs[obj->index]);
mbed_official 121:7f86b4238bec 236 if (status_flags & kLPUART_RxOverrunFlag)
mbed_official 121:7f86b4238bec 237 LPUART_ClearStatusFlags(uart_addrs[obj->index], kLPUART_RxOverrunFlag);
mbed_official 121:7f86b4238bec 238 return (status_flags & kLPUART_TxDataRegEmptyFlag);
mbed_official 121:7f86b4238bec 239 }
mbed_official 121:7f86b4238bec 240
mbed_official 121:7f86b4238bec 241 void serial_clear(serial_t *obj) {
mbed_official 121:7f86b4238bec 242 }
mbed_official 121:7f86b4238bec 243
mbed_official 121:7f86b4238bec 244 void serial_pinout_tx(PinName tx) {
mbed_official 121:7f86b4238bec 245 pinmap_pinout(tx, PinMap_UART_TX);
mbed_official 121:7f86b4238bec 246 }
mbed_official 121:7f86b4238bec 247
mbed_official 121:7f86b4238bec 248 void serial_break_set(serial_t *obj) {
mbed_official 121:7f86b4238bec 249 uart_addrs[obj->index]->CTRL |= LPUART_CTRL_SBK_MASK;
mbed_official 121:7f86b4238bec 250 }
mbed_official 121:7f86b4238bec 251
mbed_official 121:7f86b4238bec 252 void serial_break_clear(serial_t *obj) {
mbed_official 121:7f86b4238bec 253 uart_addrs[obj->index]->CTRL &= ~LPUART_CTRL_SBK_MASK;
mbed_official 121:7f86b4238bec 254 }
mbed_official 121:7f86b4238bec 255
mbed_official 121:7f86b4238bec 256 #endif