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 <stddef.h>
mbed_official 121:7f86b4238bec 17 #include "cmsis.h"
mbed_official 121:7f86b4238bec 18
mbed_official 121:7f86b4238bec 19 #include "gpio_irq_api.h"
mbed_official 121:7f86b4238bec 20
mbed_official 121:7f86b4238bec 21 #if DEVICE_INTERRUPTIN
mbed_official 121:7f86b4238bec 22
mbed_official 121:7f86b4238bec 23 #include "gpio_api.h"
mbed_official 121:7f86b4238bec 24 #include "fsl_gpio.h"
mbed_official 121:7f86b4238bec 25 #include "fsl_port.h"
mbed_official 121:7f86b4238bec 26 #include "mbed_error.h"
mbed_official 121:7f86b4238bec 27
mbed_official 121:7f86b4238bec 28 #define CHANNEL_NUM 160
mbed_official 121:7f86b4238bec 29
mbed_official 121:7f86b4238bec 30 static uint32_t channel_ids[CHANNEL_NUM] = {0};
mbed_official 121:7f86b4238bec 31 static gpio_irq_handler irq_handler;
mbed_official 121:7f86b4238bec 32 /* Array of PORT peripheral base address. */
mbed_official 121:7f86b4238bec 33 static PORT_Type *const port_addrs[] = PORT_BASE_PTRS;
mbed_official 121:7f86b4238bec 34 /* Array of PORT IRQ number. */
mbed_official 121:7f86b4238bec 35 static const IRQn_Type port_irqs[] = PORT_IRQS;
mbed_official 121:7f86b4238bec 36
mbed_official 121:7f86b4238bec 37
mbed_official 121:7f86b4238bec 38 #define IRQ_DISABLED (0)
mbed_official 121:7f86b4238bec 39 #define IRQ_RAISING_EDGE (9)
mbed_official 121:7f86b4238bec 40 #define IRQ_FALLING_EDGE (10)
mbed_official 121:7f86b4238bec 41 #define IRQ_EITHER_EDGE (11)
mbed_official 121:7f86b4238bec 42
mbed_official 121:7f86b4238bec 43 static void handle_interrupt_in(PortName port, int ch_base) {
mbed_official 121:7f86b4238bec 44 uint32_t i;
mbed_official 121:7f86b4238bec 45 uint32_t interrupt_flags;
mbed_official 121:7f86b4238bec 46 PORT_Type *port_base = port_addrs[port];
mbed_official 121:7f86b4238bec 47
mbed_official 121:7f86b4238bec 48 interrupt_flags = PORT_GetPinsInterruptFlags(port_base);
mbed_official 121:7f86b4238bec 49
mbed_official 121:7f86b4238bec 50 for (i = 0; i < 32; i++) {
mbed_official 121:7f86b4238bec 51 if (interrupt_flags & (1 << i)) {
mbed_official 121:7f86b4238bec 52 uint32_t id = channel_ids[ch_base + i];
mbed_official 121:7f86b4238bec 53 if (id == 0) {
mbed_official 121:7f86b4238bec 54 continue;
mbed_official 121:7f86b4238bec 55 }
mbed_official 121:7f86b4238bec 56
mbed_official 121:7f86b4238bec 57 gpio_irq_event event = IRQ_NONE;
mbed_official 121:7f86b4238bec 58 GPIO_Type *gpio_addrs[] = GPIO_BASE_PTRS;
mbed_official 121:7f86b4238bec 59 GPIO_Type *gpio_base = gpio_addrs[port];
mbed_official 121:7f86b4238bec 60
mbed_official 121:7f86b4238bec 61 switch ((port_base->PCR[i] & PORT_PCR_IRQC_MASK) >> PORT_PCR_IRQC_SHIFT) {
mbed_official 121:7f86b4238bec 62 case IRQ_RAISING_EDGE:
mbed_official 121:7f86b4238bec 63 event = IRQ_RISE;
mbed_official 121:7f86b4238bec 64 break;
mbed_official 121:7f86b4238bec 65
mbed_official 121:7f86b4238bec 66 case IRQ_FALLING_EDGE:
mbed_official 121:7f86b4238bec 67 event = IRQ_FALL;
mbed_official 121:7f86b4238bec 68 break;
mbed_official 121:7f86b4238bec 69
mbed_official 121:7f86b4238bec 70 case IRQ_EITHER_EDGE:
mbed_official 121:7f86b4238bec 71 event = (GPIO_ReadPinInput(gpio_base, i)) ? (IRQ_RISE) : (IRQ_FALL);
mbed_official 121:7f86b4238bec 72 break;
mbed_official 121:7f86b4238bec 73 }
mbed_official 121:7f86b4238bec 74 if (event != IRQ_NONE) {
mbed_official 121:7f86b4238bec 75 irq_handler(id, event);
mbed_official 121:7f86b4238bec 76 }
mbed_official 121:7f86b4238bec 77 }
mbed_official 121:7f86b4238bec 78 }
mbed_official 121:7f86b4238bec 79 PORT_ClearPinsInterruptFlags(port_base, interrupt_flags);
mbed_official 121:7f86b4238bec 80 }
mbed_official 121:7f86b4238bec 81
mbed_official 121:7f86b4238bec 82 void gpio_irqA(void) {handle_interrupt_in(PortA, 0);}
mbed_official 121:7f86b4238bec 83 void gpio_irqB(void) {handle_interrupt_in(PortB, 32);}
mbed_official 121:7f86b4238bec 84 void gpio_irqC(void) {handle_interrupt_in(PortC, 64);}
mbed_official 121:7f86b4238bec 85 void gpio_irqD(void) {handle_interrupt_in(PortD, 96);}
mbed_official 121:7f86b4238bec 86 void gpio_irqE(void) {handle_interrupt_in(PortE, 128);}
mbed_official 121:7f86b4238bec 87
mbed_official 121:7f86b4238bec 88 int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32_t id) {
mbed_official 121:7f86b4238bec 89 if (pin == NC) {
mbed_official 121:7f86b4238bec 90 return -1;
mbed_official 121:7f86b4238bec 91 }
mbed_official 121:7f86b4238bec 92
mbed_official 121:7f86b4238bec 93 irq_handler = handler;
mbed_official 121:7f86b4238bec 94 obj->port = pin >> GPIO_PORT_SHIFT;
mbed_official 121:7f86b4238bec 95 obj->pin = pin & 0x7F;
mbed_official 121:7f86b4238bec 96
mbed_official 121:7f86b4238bec 97 uint32_t ch_base = 0;
mbed_official 121:7f86b4238bec 98 uint32_t vector = (uint32_t)gpio_irqA;
mbed_official 121:7f86b4238bec 99
mbed_official 121:7f86b4238bec 100 switch (obj->port) {
mbed_official 121:7f86b4238bec 101 case PortA:
mbed_official 121:7f86b4238bec 102 ch_base = 0;
mbed_official 121:7f86b4238bec 103 vector = (uint32_t)gpio_irqA;
mbed_official 121:7f86b4238bec 104 break;
mbed_official 121:7f86b4238bec 105 case PortB:
mbed_official 121:7f86b4238bec 106 ch_base = 32;
mbed_official 121:7f86b4238bec 107 vector = (uint32_t)gpio_irqB;
mbed_official 121:7f86b4238bec 108 break;
mbed_official 121:7f86b4238bec 109 case PortC:
mbed_official 121:7f86b4238bec 110 ch_base = 64;
mbed_official 121:7f86b4238bec 111 vector = (uint32_t)gpio_irqC;
mbed_official 121:7f86b4238bec 112 break;
mbed_official 121:7f86b4238bec 113 case PortD:
mbed_official 121:7f86b4238bec 114 ch_base = 96;
mbed_official 121:7f86b4238bec 115 vector = (uint32_t)gpio_irqD;
mbed_official 121:7f86b4238bec 116 break;
mbed_official 121:7f86b4238bec 117 case PortE:
mbed_official 121:7f86b4238bec 118 ch_base = 128;
mbed_official 121:7f86b4238bec 119 vector = (uint32_t)gpio_irqE;
mbed_official 121:7f86b4238bec 120 break;
mbed_official 121:7f86b4238bec 121 default:
mbed_official 121:7f86b4238bec 122 error("gpio_irq only supported on port A-E.");
mbed_official 121:7f86b4238bec 123 break;
mbed_official 121:7f86b4238bec 124 }
mbed_official 121:7f86b4238bec 125 NVIC_SetVector(port_irqs[obj->port], vector);
mbed_official 121:7f86b4238bec 126 NVIC_EnableIRQ(port_irqs[obj->port]);
mbed_official 121:7f86b4238bec 127
mbed_official 121:7f86b4238bec 128 obj->ch = ch_base + obj->pin;
mbed_official 121:7f86b4238bec 129 channel_ids[obj->ch] = id;
mbed_official 121:7f86b4238bec 130
mbed_official 121:7f86b4238bec 131 return 0;
mbed_official 121:7f86b4238bec 132 }
mbed_official 121:7f86b4238bec 133
mbed_official 121:7f86b4238bec 134 void gpio_irq_free(gpio_irq_t *obj) {
mbed_official 121:7f86b4238bec 135 channel_ids[obj->ch] = 0;
mbed_official 121:7f86b4238bec 136 }
mbed_official 121:7f86b4238bec 137
mbed_official 121:7f86b4238bec 138 void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable) {
mbed_official 121:7f86b4238bec 139 PORT_Type *base = port_addrs[obj->port];
mbed_official 121:7f86b4238bec 140 port_interrupt_t irq_settings = kPORT_InterruptOrDMADisabled;
mbed_official 121:7f86b4238bec 141
mbed_official 121:7f86b4238bec 142 switch ((base->PCR[obj->pin] & PORT_PCR_IRQC_MASK) >> PORT_PCR_IRQC_SHIFT) {
mbed_official 121:7f86b4238bec 143 case IRQ_DISABLED:
mbed_official 121:7f86b4238bec 144 if (enable)
mbed_official 121:7f86b4238bec 145 irq_settings = (event == IRQ_RISE) ? (kPORT_InterruptRisingEdge) : (kPORT_InterruptFallingEdge);
mbed_official 121:7f86b4238bec 146 break;
mbed_official 121:7f86b4238bec 147
mbed_official 121:7f86b4238bec 148 case IRQ_RAISING_EDGE:
mbed_official 121:7f86b4238bec 149 if (enable) {
mbed_official 121:7f86b4238bec 150 irq_settings = (event == IRQ_RISE) ? (kPORT_InterruptRisingEdge) : (kPORT_InterruptEitherEdge);
mbed_official 121:7f86b4238bec 151 } else {
mbed_official 121:7f86b4238bec 152 if (event == IRQ_FALL)
mbed_official 121:7f86b4238bec 153 irq_settings = kPORT_InterruptRisingEdge;
mbed_official 121:7f86b4238bec 154 }
mbed_official 121:7f86b4238bec 155 break;
mbed_official 121:7f86b4238bec 156
mbed_official 121:7f86b4238bec 157 case IRQ_FALLING_EDGE:
mbed_official 121:7f86b4238bec 158 if (enable) {
mbed_official 121:7f86b4238bec 159 irq_settings = (event == IRQ_FALL) ? (kPORT_InterruptFallingEdge) : (kPORT_InterruptEitherEdge);
mbed_official 121:7f86b4238bec 160 } else {
mbed_official 121:7f86b4238bec 161 if (event == IRQ_RISE)
mbed_official 121:7f86b4238bec 162 irq_settings = kPORT_InterruptFallingEdge;
mbed_official 121:7f86b4238bec 163 }
mbed_official 121:7f86b4238bec 164 break;
mbed_official 121:7f86b4238bec 165
mbed_official 121:7f86b4238bec 166 case IRQ_EITHER_EDGE:
mbed_official 121:7f86b4238bec 167 if (enable) {
mbed_official 121:7f86b4238bec 168 irq_settings = kPORT_InterruptEitherEdge;
mbed_official 121:7f86b4238bec 169 } else {
mbed_official 121:7f86b4238bec 170 irq_settings = (event == IRQ_RISE) ? (kPORT_InterruptFallingEdge) : (kPORT_InterruptRisingEdge);
mbed_official 121:7f86b4238bec 171 }
mbed_official 121:7f86b4238bec 172 break;
mbed_official 121:7f86b4238bec 173 }
mbed_official 121:7f86b4238bec 174
mbed_official 121:7f86b4238bec 175 PORT_SetPinInterruptConfig(base, obj->pin, irq_settings);
mbed_official 121:7f86b4238bec 176 base->PCR[obj->pin] |= PORT_PCR_ISF_MASK;
mbed_official 121:7f86b4238bec 177 }
mbed_official 121:7f86b4238bec 178
mbed_official 121:7f86b4238bec 179 void gpio_irq_enable(gpio_irq_t *obj) {
mbed_official 121:7f86b4238bec 180 NVIC_EnableIRQ(port_irqs[obj->port]);
mbed_official 121:7f86b4238bec 181 }
mbed_official 121:7f86b4238bec 182
mbed_official 121:7f86b4238bec 183 void gpio_irq_disable(gpio_irq_t *obj) {
mbed_official 121:7f86b4238bec 184 NVIC_DisableIRQ(port_irqs[obj->port]);
mbed_official 121:7f86b4238bec 185 }
mbed_official 121:7f86b4238bec 186
mbed_official 121:7f86b4238bec 187 #endif