mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 189:f392fc9709a3 1 /* mbed Microcontroller Library
AnnaBridge 189:f392fc9709a3 2 * Copyright (c) 2018 GigaDevice Semiconductor Inc.
AnnaBridge 189:f392fc9709a3 3 *
AnnaBridge 189:f392fc9709a3 4 * SPDX-License-Identifier: Apache-2.0
AnnaBridge 189:f392fc9709a3 5 *
AnnaBridge 189:f392fc9709a3 6 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 189:f392fc9709a3 7 * you may not use this file except in compliance with the License.
AnnaBridge 189:f392fc9709a3 8 * You may obtain a copy of the License at
AnnaBridge 189:f392fc9709a3 9 *
AnnaBridge 189:f392fc9709a3 10 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 189:f392fc9709a3 11 *
AnnaBridge 189:f392fc9709a3 12 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 189:f392fc9709a3 13 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 189:f392fc9709a3 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 189:f392fc9709a3 15 * See the License for the specific language governing permissions and
AnnaBridge 189:f392fc9709a3 16 * limitations under the License.
AnnaBridge 189:f392fc9709a3 17 */
AnnaBridge 189:f392fc9709a3 18 #include <stddef.h>
AnnaBridge 189:f392fc9709a3 19 #include "cmsis.h"
AnnaBridge 189:f392fc9709a3 20 #include "gpio_irq_api.h"
AnnaBridge 189:f392fc9709a3 21 #include "pinmap.h"
AnnaBridge 189:f392fc9709a3 22 #include "mbed_error.h"
AnnaBridge 189:f392fc9709a3 23
AnnaBridge 189:f392fc9709a3 24 #define EDGE_NONE (0)
AnnaBridge 189:f392fc9709a3 25 #define EDGE_RISE (1)
AnnaBridge 189:f392fc9709a3 26 #define EDGE_FALL (2)
AnnaBridge 189:f392fc9709a3 27
AnnaBridge 189:f392fc9709a3 28 extern uint32_t gpio_clock_enable(uint32_t port_idx);
AnnaBridge 189:f392fc9709a3 29 static gpio_irq_handler irq_handler;
AnnaBridge 189:f392fc9709a3 30
AnnaBridge 189:f392fc9709a3 31 typedef struct {
AnnaBridge 189:f392fc9709a3 32 uint32_t exti_idx;
AnnaBridge 189:f392fc9709a3 33 uint32_t exti_gpiox; /* base address of gpio */
AnnaBridge 189:f392fc9709a3 34 uint32_t exti_pinx; /* pin number */
AnnaBridge 189:f392fc9709a3 35 } gpio_exti_info_struct;
AnnaBridge 189:f392fc9709a3 36
AnnaBridge 189:f392fc9709a3 37 /* EXTI0...EXTI15 */
AnnaBridge 189:f392fc9709a3 38 static gpio_exti_info_struct exti_info_array[16] = {0};
AnnaBridge 189:f392fc9709a3 39
AnnaBridge 189:f392fc9709a3 40 /** handle EXTI interrupt in EXTI0 to EXTI15
AnnaBridge 189:f392fc9709a3 41
AnnaBridge 189:f392fc9709a3 42 * @param irq_index the line of EXTI(0~15)
AnnaBridge 189:f392fc9709a3 43 */
AnnaBridge 189:f392fc9709a3 44 static void exti_handle_interrupt(uint32_t irq_index)
AnnaBridge 189:f392fc9709a3 45 {
AnnaBridge 189:f392fc9709a3 46 gpio_exti_info_struct *gpio_exti = &exti_info_array[irq_index];
AnnaBridge 189:f392fc9709a3 47
AnnaBridge 189:f392fc9709a3 48 /* get the port and pin of EXTI */
AnnaBridge 189:f392fc9709a3 49 uint32_t gpio = (uint32_t)(gpio_exti->exti_gpiox);
AnnaBridge 189:f392fc9709a3 50 uint32_t pin = (uint32_t)(1 << (gpio_exti->exti_pinx));
AnnaBridge 189:f392fc9709a3 51
AnnaBridge 189:f392fc9709a3 52 /* clear interrupt flag */
AnnaBridge 189:f392fc9709a3 53 if (exti_interrupt_flag_get((exti_line_enum)pin) != RESET) {
AnnaBridge 189:f392fc9709a3 54 exti_interrupt_flag_clear((exti_line_enum)pin);
AnnaBridge 189:f392fc9709a3 55 /* check which edge has generated the irq */
AnnaBridge 189:f392fc9709a3 56 if ((GPIO_ISTAT(gpio) & pin) == 0) {
AnnaBridge 189:f392fc9709a3 57 irq_handler(gpio_exti->exti_idx, IRQ_FALL);
AnnaBridge 189:f392fc9709a3 58 } else {
AnnaBridge 189:f392fc9709a3 59 irq_handler(gpio_exti->exti_idx, IRQ_RISE);
AnnaBridge 189:f392fc9709a3 60 }
AnnaBridge 189:f392fc9709a3 61 }
AnnaBridge 189:f392fc9709a3 62
AnnaBridge 189:f392fc9709a3 63 }
AnnaBridge 189:f392fc9709a3 64
AnnaBridge 189:f392fc9709a3 65 /* EXTI0 interrupt handler */
AnnaBridge 189:f392fc9709a3 66 static void gpio_irq_exti0(void)
AnnaBridge 189:f392fc9709a3 67 {
AnnaBridge 189:f392fc9709a3 68 exti_handle_interrupt(0);
AnnaBridge 189:f392fc9709a3 69 }
AnnaBridge 189:f392fc9709a3 70 /* EXTI1 interrupt handler */
AnnaBridge 189:f392fc9709a3 71 static void gpio_irq_exti1(void)
AnnaBridge 189:f392fc9709a3 72 {
AnnaBridge 189:f392fc9709a3 73 exti_handle_interrupt(1);
AnnaBridge 189:f392fc9709a3 74 }
AnnaBridge 189:f392fc9709a3 75 /* EXTI2 interrupt handler */
AnnaBridge 189:f392fc9709a3 76 static void gpio_irq_exti2(void)
AnnaBridge 189:f392fc9709a3 77 {
AnnaBridge 189:f392fc9709a3 78 exti_handle_interrupt(2);
AnnaBridge 189:f392fc9709a3 79 }
AnnaBridge 189:f392fc9709a3 80 /* EXTI3 interrupt handler */
AnnaBridge 189:f392fc9709a3 81 static void gpio_irq_exti3(void)
AnnaBridge 189:f392fc9709a3 82 {
AnnaBridge 189:f392fc9709a3 83 exti_handle_interrupt(3);
AnnaBridge 189:f392fc9709a3 84 }
AnnaBridge 189:f392fc9709a3 85 /* EXTI4 interrupt handler */
AnnaBridge 189:f392fc9709a3 86 static void gpio_irq_exti4(void)
AnnaBridge 189:f392fc9709a3 87 {
AnnaBridge 189:f392fc9709a3 88 exti_handle_interrupt(4);
AnnaBridge 189:f392fc9709a3 89 }
AnnaBridge 189:f392fc9709a3 90 /* EXTI5 interrupt handler */
AnnaBridge 189:f392fc9709a3 91 static void gpio_irq_exti5(void)
AnnaBridge 189:f392fc9709a3 92 {
AnnaBridge 189:f392fc9709a3 93 exti_handle_interrupt(5);
AnnaBridge 189:f392fc9709a3 94 }
AnnaBridge 189:f392fc9709a3 95 /* EXTI6 interrupt handler */
AnnaBridge 189:f392fc9709a3 96 static void gpio_irq_exti6(void)
AnnaBridge 189:f392fc9709a3 97 {
AnnaBridge 189:f392fc9709a3 98 exti_handle_interrupt(6);
AnnaBridge 189:f392fc9709a3 99 }
AnnaBridge 189:f392fc9709a3 100 /* EXTI7 interrupt handler */
AnnaBridge 189:f392fc9709a3 101 static void gpio_irq_exti7(void)
AnnaBridge 189:f392fc9709a3 102 {
AnnaBridge 189:f392fc9709a3 103 exti_handle_interrupt(7);
AnnaBridge 189:f392fc9709a3 104 }
AnnaBridge 189:f392fc9709a3 105 /* EXTI8 interrupt handler */
AnnaBridge 189:f392fc9709a3 106 static void gpio_irq_exti8(void)
AnnaBridge 189:f392fc9709a3 107 {
AnnaBridge 189:f392fc9709a3 108 exti_handle_interrupt(8);
AnnaBridge 189:f392fc9709a3 109 }
AnnaBridge 189:f392fc9709a3 110 /* EXTI9 interrupt handler */
AnnaBridge 189:f392fc9709a3 111 static void gpio_irq_exti9(void)
AnnaBridge 189:f392fc9709a3 112 {
AnnaBridge 189:f392fc9709a3 113 exti_handle_interrupt(9);
AnnaBridge 189:f392fc9709a3 114 }
AnnaBridge 189:f392fc9709a3 115 /* EXTI10 interrupt handler */
AnnaBridge 189:f392fc9709a3 116 static void gpio_irq_exti10(void)
AnnaBridge 189:f392fc9709a3 117 {
AnnaBridge 189:f392fc9709a3 118 exti_handle_interrupt(10);
AnnaBridge 189:f392fc9709a3 119 }
AnnaBridge 189:f392fc9709a3 120 /* EXTI11 interrupt handler */
AnnaBridge 189:f392fc9709a3 121 static void gpio_irq_exti11(void)
AnnaBridge 189:f392fc9709a3 122 {
AnnaBridge 189:f392fc9709a3 123 exti_handle_interrupt(11);
AnnaBridge 189:f392fc9709a3 124 }
AnnaBridge 189:f392fc9709a3 125 /* EXTI12 interrupt handler */
AnnaBridge 189:f392fc9709a3 126 static void gpio_irq_exti12(void)
AnnaBridge 189:f392fc9709a3 127 {
AnnaBridge 189:f392fc9709a3 128 exti_handle_interrupt(12);
AnnaBridge 189:f392fc9709a3 129 }
AnnaBridge 189:f392fc9709a3 130 /* EXTI13 interrupt handler */
AnnaBridge 189:f392fc9709a3 131 static void gpio_irq_exti13(void)
AnnaBridge 189:f392fc9709a3 132 {
AnnaBridge 189:f392fc9709a3 133 exti_handle_interrupt(13);
AnnaBridge 189:f392fc9709a3 134 }
AnnaBridge 189:f392fc9709a3 135 /* EXTI14 interrupt handler */
AnnaBridge 189:f392fc9709a3 136 static void gpio_irq_exti14(void)
AnnaBridge 189:f392fc9709a3 137 {
AnnaBridge 189:f392fc9709a3 138 exti_handle_interrupt(14);
AnnaBridge 189:f392fc9709a3 139 }
AnnaBridge 189:f392fc9709a3 140 /* EXTI15 interrupt handler */
AnnaBridge 189:f392fc9709a3 141 static void gpio_irq_exti15(void)
AnnaBridge 189:f392fc9709a3 142 {
AnnaBridge 189:f392fc9709a3 143 exti_handle_interrupt(15);
AnnaBridge 189:f392fc9709a3 144 }
AnnaBridge 189:f392fc9709a3 145
AnnaBridge 189:f392fc9709a3 146 /** Initialize the GPIO IRQ pin
AnnaBridge 189:f392fc9709a3 147 *
AnnaBridge 189:f392fc9709a3 148 * @param obj The GPIO object to initialize
AnnaBridge 189:f392fc9709a3 149 * @param pin The GPIO pin name
AnnaBridge 189:f392fc9709a3 150 * @param handler The handler to be attached to GPIO IRQ
AnnaBridge 189:f392fc9709a3 151 * @param id The object ID (id != 0, 0 is reserved)
AnnaBridge 189:f392fc9709a3 152 * @return -1 if pin is NC, 0 otherwise
AnnaBridge 189:f392fc9709a3 153 */
AnnaBridge 189:f392fc9709a3 154 int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32_t id)
AnnaBridge 189:f392fc9709a3 155 {
AnnaBridge 189:f392fc9709a3 156 uint32_t vector = 0;
AnnaBridge 189:f392fc9709a3 157 gpio_exti_info_struct *gpio_exti;
AnnaBridge 189:f392fc9709a3 158 if (pin == NC) {
AnnaBridge 189:f392fc9709a3 159 return -1;
AnnaBridge 189:f392fc9709a3 160 }
AnnaBridge 189:f392fc9709a3 161
AnnaBridge 189:f392fc9709a3 162 /* Enable AF Clock */
AnnaBridge 189:f392fc9709a3 163 rcu_periph_clock_enable(RCU_AF);
AnnaBridge 189:f392fc9709a3 164
AnnaBridge 189:f392fc9709a3 165 uint32_t port_index = GD_PORT_GET(pin);
AnnaBridge 189:f392fc9709a3 166 uint32_t pin_index = GD_PIN_GET(pin);
AnnaBridge 189:f392fc9709a3 167 /* Enable GPIO clock */
AnnaBridge 189:f392fc9709a3 168 uint32_t gpio_add = gpio_clock_enable(port_index);
AnnaBridge 189:f392fc9709a3 169
AnnaBridge 189:f392fc9709a3 170 /* fill EXTI information according to pin_index .
AnnaBridge 189:f392fc9709a3 171 eg. use PORTE_9 as EXTI interrupt, the irq type is EXTI5_9_IRQn */
AnnaBridge 189:f392fc9709a3 172 if (pin_index == 0) {
AnnaBridge 189:f392fc9709a3 173 vector = (uint32_t)&gpio_irq_exti0;
AnnaBridge 189:f392fc9709a3 174 obj->irq_index = 0;
AnnaBridge 189:f392fc9709a3 175 obj->irq_n = EXTI0_IRQn;
AnnaBridge 189:f392fc9709a3 176 } else if (pin_index == 1) {
AnnaBridge 189:f392fc9709a3 177 vector = (uint32_t)&gpio_irq_exti1;
AnnaBridge 189:f392fc9709a3 178 obj->irq_index = 1;
AnnaBridge 189:f392fc9709a3 179 obj->irq_n = EXTI1_IRQn;
AnnaBridge 189:f392fc9709a3 180 } else if (pin_index == 2) {
AnnaBridge 189:f392fc9709a3 181 vector = (uint32_t)&gpio_irq_exti2;
AnnaBridge 189:f392fc9709a3 182 obj->irq_index = 2;
AnnaBridge 189:f392fc9709a3 183 obj->irq_n = EXTI2_IRQn;
AnnaBridge 189:f392fc9709a3 184 } else if (pin_index == 3) {
AnnaBridge 189:f392fc9709a3 185 vector = (uint32_t)&gpio_irq_exti3;
AnnaBridge 189:f392fc9709a3 186 obj->irq_index = 3;
AnnaBridge 189:f392fc9709a3 187 obj->irq_n = EXTI3_IRQn;
AnnaBridge 189:f392fc9709a3 188 } else if (pin_index == 4) {
AnnaBridge 189:f392fc9709a3 189 vector = (uint32_t)&gpio_irq_exti4;
AnnaBridge 189:f392fc9709a3 190 obj->irq_index = 4;
AnnaBridge 189:f392fc9709a3 191 obj->irq_n = EXTI4_IRQn;
AnnaBridge 189:f392fc9709a3 192 } else if (pin_index == 5) {
AnnaBridge 189:f392fc9709a3 193 vector = (uint32_t)&gpio_irq_exti5;
AnnaBridge 189:f392fc9709a3 194 obj->irq_index = 5;
AnnaBridge 189:f392fc9709a3 195 obj->irq_n = EXTI5_9_IRQn;
AnnaBridge 189:f392fc9709a3 196 } else if (pin_index == 6) {
AnnaBridge 189:f392fc9709a3 197 vector = (uint32_t)&gpio_irq_exti6;
AnnaBridge 189:f392fc9709a3 198 obj->irq_index = 6;
AnnaBridge 189:f392fc9709a3 199 obj->irq_n = EXTI5_9_IRQn;
AnnaBridge 189:f392fc9709a3 200 } else if (pin_index == 7) {
AnnaBridge 189:f392fc9709a3 201 vector = (uint32_t)&gpio_irq_exti7;
AnnaBridge 189:f392fc9709a3 202 obj->irq_index = 7;
AnnaBridge 189:f392fc9709a3 203 obj->irq_n = EXTI5_9_IRQn;
AnnaBridge 189:f392fc9709a3 204 } else if (pin_index == 8) {
AnnaBridge 189:f392fc9709a3 205 vector = (uint32_t)&gpio_irq_exti8;
AnnaBridge 189:f392fc9709a3 206 obj->irq_index = 8;
AnnaBridge 189:f392fc9709a3 207 obj->irq_n = EXTI5_9_IRQn;
AnnaBridge 189:f392fc9709a3 208 } else if (pin_index == 9) {
AnnaBridge 189:f392fc9709a3 209 vector = (uint32_t)&gpio_irq_exti9;
AnnaBridge 189:f392fc9709a3 210 obj->irq_index = 9;
AnnaBridge 189:f392fc9709a3 211 obj->irq_n = EXTI5_9_IRQn;
AnnaBridge 189:f392fc9709a3 212 } else if (pin_index == 10) {
AnnaBridge 189:f392fc9709a3 213 vector = (uint32_t)&gpio_irq_exti10;
AnnaBridge 189:f392fc9709a3 214 obj->irq_index = 10;
AnnaBridge 189:f392fc9709a3 215 obj->irq_n = EXTI10_15_IRQn;
AnnaBridge 189:f392fc9709a3 216 } else if (pin_index == 11) {
AnnaBridge 189:f392fc9709a3 217 vector = (uint32_t)&gpio_irq_exti11;
AnnaBridge 189:f392fc9709a3 218 obj->irq_index = 11;
AnnaBridge 189:f392fc9709a3 219 obj->irq_n = EXTI10_15_IRQn;
AnnaBridge 189:f392fc9709a3 220 } else if (pin_index == 12) {
AnnaBridge 189:f392fc9709a3 221 vector = (uint32_t)&gpio_irq_exti12;
AnnaBridge 189:f392fc9709a3 222 obj->irq_index = 12;
AnnaBridge 189:f392fc9709a3 223 obj->irq_n = EXTI10_15_IRQn;
AnnaBridge 189:f392fc9709a3 224 } else if (pin_index == 13) {
AnnaBridge 189:f392fc9709a3 225 vector = (uint32_t)&gpio_irq_exti13;
AnnaBridge 189:f392fc9709a3 226 obj->irq_index = 13;
AnnaBridge 189:f392fc9709a3 227 obj->irq_n = EXTI10_15_IRQn;
AnnaBridge 189:f392fc9709a3 228 } else if (pin_index == 14) {
AnnaBridge 189:f392fc9709a3 229 vector = (uint32_t)&gpio_irq_exti14;
AnnaBridge 189:f392fc9709a3 230 obj->irq_index = 14;
AnnaBridge 189:f392fc9709a3 231 obj->irq_n = EXTI10_15_IRQn;
AnnaBridge 189:f392fc9709a3 232 } else if (pin_index == 15) {
AnnaBridge 189:f392fc9709a3 233 vector = (uint32_t)&gpio_irq_exti15;
AnnaBridge 189:f392fc9709a3 234 obj->irq_index = 15;
AnnaBridge 189:f392fc9709a3 235 obj->irq_n = EXTI10_15_IRQn;
AnnaBridge 189:f392fc9709a3 236 } else {
AnnaBridge 189:f392fc9709a3 237 error("pin not supported for interrupt in.\n");
AnnaBridge 189:f392fc9709a3 238 return -1;
AnnaBridge 189:f392fc9709a3 239 }
AnnaBridge 189:f392fc9709a3 240
AnnaBridge 189:f392fc9709a3 241 /* Save informations for future use */
AnnaBridge 189:f392fc9709a3 242 obj->event = EDGE_NONE;
AnnaBridge 189:f392fc9709a3 243 obj->pin = pin;
AnnaBridge 189:f392fc9709a3 244
AnnaBridge 189:f392fc9709a3 245 gpio_exti = &exti_info_array[obj->irq_index];
AnnaBridge 189:f392fc9709a3 246 gpio_exti->exti_idx = id;
AnnaBridge 189:f392fc9709a3 247 gpio_exti->exti_gpiox = gpio_add;
AnnaBridge 189:f392fc9709a3 248 gpio_exti->exti_pinx = pin_index;
AnnaBridge 189:f392fc9709a3 249
AnnaBridge 189:f392fc9709a3 250 irq_handler = handler;
AnnaBridge 189:f392fc9709a3 251
AnnaBridge 189:f392fc9709a3 252 /* Enable EXTI interrupt */
AnnaBridge 189:f392fc9709a3 253 NVIC_SetVector(obj->irq_n, vector);
AnnaBridge 189:f392fc9709a3 254 gpio_irq_enable(obj);
AnnaBridge 189:f392fc9709a3 255
AnnaBridge 189:f392fc9709a3 256 return 0;
AnnaBridge 189:f392fc9709a3 257 }
AnnaBridge 189:f392fc9709a3 258
AnnaBridge 189:f392fc9709a3 259 /** Release the GPIO IRQ PIN
AnnaBridge 189:f392fc9709a3 260 *
AnnaBridge 189:f392fc9709a3 261 * @param obj The gpio object
AnnaBridge 189:f392fc9709a3 262 */
AnnaBridge 189:f392fc9709a3 263 void gpio_irq_free(gpio_irq_t *obj)
AnnaBridge 189:f392fc9709a3 264 {
AnnaBridge 189:f392fc9709a3 265 gpio_exti_info_struct *gpio_exti = &exti_info_array[obj->irq_index];
AnnaBridge 189:f392fc9709a3 266
AnnaBridge 189:f392fc9709a3 267 /* Disable EXTI interrupt */
AnnaBridge 189:f392fc9709a3 268 gpio_irq_disable(obj);
AnnaBridge 189:f392fc9709a3 269 /* Reset struct of exti information */
AnnaBridge 189:f392fc9709a3 270 gpio_exti->exti_idx = 0;
AnnaBridge 189:f392fc9709a3 271 gpio_exti->exti_gpiox = 0;
AnnaBridge 189:f392fc9709a3 272 gpio_exti->exti_pinx = 0;
AnnaBridge 189:f392fc9709a3 273 }
AnnaBridge 189:f392fc9709a3 274
AnnaBridge 189:f392fc9709a3 275 /** Enable/disable pin IRQ event
AnnaBridge 189:f392fc9709a3 276 *
AnnaBridge 189:f392fc9709a3 277 * @param obj The GPIO object
AnnaBridge 189:f392fc9709a3 278 * @param event The GPIO IRQ event
AnnaBridge 189:f392fc9709a3 279 * @param enable The enable flag
AnnaBridge 189:f392fc9709a3 280 */
AnnaBridge 189:f392fc9709a3 281 void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
AnnaBridge 189:f392fc9709a3 282 {
AnnaBridge 189:f392fc9709a3 283 if (event == IRQ_RISE) {
AnnaBridge 189:f392fc9709a3 284 if (enable) {
AnnaBridge 189:f392fc9709a3 285 exti_init((exti_line_enum)(1 << GD_PIN_GET(obj->pin)), EXTI_INTERRUPT, EXTI_TRIG_RISING);
AnnaBridge 189:f392fc9709a3 286 /* Clear interrupt enable bit, rising/falling bit */
AnnaBridge 189:f392fc9709a3 287 } else {
AnnaBridge 189:f392fc9709a3 288 EXTI_INTEN &= ~(uint32_t)(exti_line_enum)(1 << GD_PIN_GET(obj->pin));
AnnaBridge 189:f392fc9709a3 289 EXTI_RTEN &= ~(uint32_t)(exti_line_enum)(1 << GD_PIN_GET(obj->pin));
AnnaBridge 189:f392fc9709a3 290 EXTI_FTEN &= ~(uint32_t)(exti_line_enum)(1 << GD_PIN_GET(obj->pin));
AnnaBridge 189:f392fc9709a3 291 }
AnnaBridge 189:f392fc9709a3 292 }
AnnaBridge 189:f392fc9709a3 293 if (event == IRQ_FALL) {
AnnaBridge 189:f392fc9709a3 294 if (enable) {
AnnaBridge 189:f392fc9709a3 295 exti_init((exti_line_enum)(1 << (GD_PIN_GET(obj->pin))), EXTI_INTERRUPT, EXTI_TRIG_FALLING);
AnnaBridge 189:f392fc9709a3 296 /* Clear interrupt enable bit, rising/falling bit */
AnnaBridge 189:f392fc9709a3 297 } else {
AnnaBridge 189:f392fc9709a3 298 EXTI_INTEN &= ~(uint32_t)(exti_line_enum)(1 << GD_PIN_GET(obj->pin));
AnnaBridge 189:f392fc9709a3 299 EXTI_RTEN &= ~(uint32_t)(exti_line_enum)(1 << GD_PIN_GET(obj->pin));
AnnaBridge 189:f392fc9709a3 300 EXTI_FTEN &= ~(uint32_t)(exti_line_enum)(1 << GD_PIN_GET(obj->pin));
AnnaBridge 189:f392fc9709a3 301 }
AnnaBridge 189:f392fc9709a3 302 }
AnnaBridge 189:f392fc9709a3 303 }
AnnaBridge 189:f392fc9709a3 304
AnnaBridge 189:f392fc9709a3 305 /** Enable GPIO IRQ
AnnaBridge 189:f392fc9709a3 306 *
AnnaBridge 189:f392fc9709a3 307 * This is target dependent, as it might enable the entire port or just a pin
AnnaBridge 189:f392fc9709a3 308 * @param obj The GPIO object
AnnaBridge 189:f392fc9709a3 309 */
AnnaBridge 189:f392fc9709a3 310 void gpio_irq_enable(gpio_irq_t *obj)
AnnaBridge 189:f392fc9709a3 311 {
AnnaBridge 189:f392fc9709a3 312 /* Select EXTI Source */
AnnaBridge 189:f392fc9709a3 313 gpio_exti_source_select(GD_PORT_GET(obj->pin), GD_PIN_GET(obj->pin));
AnnaBridge 189:f392fc9709a3 314 exti_interrupt_enable((exti_line_enum)(1 << GD_PIN_GET(obj->pin)));
AnnaBridge 189:f392fc9709a3 315 NVIC_EnableIRQ(obj->irq_n);
AnnaBridge 189:f392fc9709a3 316 }
AnnaBridge 189:f392fc9709a3 317
AnnaBridge 189:f392fc9709a3 318 /** Disable GPIO IRQ
AnnaBridge 189:f392fc9709a3 319 *
AnnaBridge 189:f392fc9709a3 320 * This is target dependent, as it might disable the entire port or just a pin
AnnaBridge 189:f392fc9709a3 321 * @param obj The GPIO object
AnnaBridge 189:f392fc9709a3 322 */
AnnaBridge 189:f392fc9709a3 323 void gpio_irq_disable(gpio_irq_t *obj)
AnnaBridge 189:f392fc9709a3 324 {
AnnaBridge 189:f392fc9709a3 325 /* Clear EXTI line configuration */
AnnaBridge 189:f392fc9709a3 326 exti_interrupt_disable((exti_line_enum)(1 << GD_PIN_GET(obj->pin)));
AnnaBridge 189:f392fc9709a3 327 NVIC_DisableIRQ(obj->irq_n);
AnnaBridge 189:f392fc9709a3 328 NVIC_ClearPendingIRQ(obj->irq_n);
AnnaBridge 189:f392fc9709a3 329 obj->event = EDGE_NONE;
AnnaBridge 189:f392fc9709a3 330 }