Rigado / mbed-src-bmd-200

Dependents:   mbed_blinky-bmd-200 bmd-200_accel_demo firstRig

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Tue Jan 27 07:15:07 2015 +0000
Revision:
457:a07e52520545
Parent:
403:09075a3b15e3
Child:
492:119543c9f674
Synchronized with git revision 8c14c0600dbcc802b3320eed4291ce569e93c103

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

Targets - Gpio irq hal with max num of irq for Nucleo 103RB

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 60:142c6c6f5949 1 /* mbed Microcontroller Library
mbed_official 70:c1fbde68b492 2 *******************************************************************************
mbed_official 70:c1fbde68b492 3 * Copyright (c) 2014, STMicroelectronics
mbed_official 70:c1fbde68b492 4 * All rights reserved.
mbed_official 60:142c6c6f5949 5 *
mbed_official 70:c1fbde68b492 6 * Redistribution and use in source and binary forms, with or without
mbed_official 70:c1fbde68b492 7 * modification, are permitted provided that the following conditions are met:
mbed_official 60:142c6c6f5949 8 *
mbed_official 70:c1fbde68b492 9 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 70:c1fbde68b492 10 * this list of conditions and the following disclaimer.
mbed_official 70:c1fbde68b492 11 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 70:c1fbde68b492 12 * this list of conditions and the following disclaimer in the documentation
mbed_official 70:c1fbde68b492 13 * and/or other materials provided with the distribution.
mbed_official 70:c1fbde68b492 14 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 70:c1fbde68b492 15 * may be used to endorse or promote products derived from this software
mbed_official 70:c1fbde68b492 16 * without specific prior written permission.
mbed_official 60:142c6c6f5949 17 *
mbed_official 70:c1fbde68b492 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 70:c1fbde68b492 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 70:c1fbde68b492 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 70:c1fbde68b492 21 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 70:c1fbde68b492 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 70:c1fbde68b492 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 70:c1fbde68b492 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 70:c1fbde68b492 25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 70:c1fbde68b492 26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 70:c1fbde68b492 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 70:c1fbde68b492 28 *******************************************************************************
mbed_official 60:142c6c6f5949 29 */
mbed_official 60:142c6c6f5949 30 #include <stddef.h>
mbed_official 60:142c6c6f5949 31 #include "cmsis.h"
mbed_official 60:142c6c6f5949 32 #include "gpio_irq_api.h"
mbed_official 76:aeb1df146756 33 #include "pinmap.h"
mbed_official 285:31249416b6f9 34 #include "mbed_error.h"
mbed_official 60:142c6c6f5949 35
mbed_official 60:142c6c6f5949 36 #define EDGE_NONE (0)
mbed_official 60:142c6c6f5949 37 #define EDGE_RISE (1)
mbed_official 60:142c6c6f5949 38 #define EDGE_FALL (2)
mbed_official 60:142c6c6f5949 39 #define EDGE_BOTH (3)
mbed_official 60:142c6c6f5949 40
mbed_official 156:38b9eb24e1d1 41 #define CHANNEL_NUM (7)
mbed_official 457:a07e52520545 42 // Max pins for one line (max with EXTI10_15)
mbed_official 457:a07e52520545 43 #define MAX_PIN_LINE (6)
mbed_official 60:142c6c6f5949 44
mbed_official 457:a07e52520545 45 typedef struct gpio_channel {
mbed_official 457:a07e52520545 46 uint32_t pin_mask; // bitmask representing which pins are configured for receiving interrupts
mbed_official 457:a07e52520545 47 uint32_t channel_ids[MAX_PIN_LINE]; // mbed "gpio_irq_t gpio_irq" field of instance
mbed_official 457:a07e52520545 48 uint32_t channel_gpio[MAX_PIN_LINE]; // base address of gpio port group
mbed_official 457:a07e52520545 49 uint32_t channel_pin[MAX_PIN_LINE]; // pin number in port group
mbed_official 457:a07e52520545 50 } gpio_channel_t;
mbed_official 457:a07e52520545 51
mbed_official 457:a07e52520545 52 static gpio_channel_t channels[CHANNEL_NUM] = {
mbed_official 457:a07e52520545 53 {.pin_mask = 0},
mbed_official 457:a07e52520545 54 {.pin_mask = 0},
mbed_official 457:a07e52520545 55 {.pin_mask = 0},
mbed_official 457:a07e52520545 56 {.pin_mask = 0},
mbed_official 457:a07e52520545 57 {.pin_mask = 0},
mbed_official 457:a07e52520545 58 {.pin_mask = 0},
mbed_official 457:a07e52520545 59 {.pin_mask = 0}
mbed_official 457:a07e52520545 60 };
mbed_official 457:a07e52520545 61
mbed_official 457:a07e52520545 62 // Used to return the index for channels array.
mbed_official 457:a07e52520545 63 static uint32_t pin_base_nr[16] = {
mbed_official 457:a07e52520545 64 // EXTI0
mbed_official 457:a07e52520545 65 0, // pin 0
mbed_official 457:a07e52520545 66 // EXTI1
mbed_official 457:a07e52520545 67 0, // pin 1
mbed_official 457:a07e52520545 68 // EXTI2
mbed_official 457:a07e52520545 69 0, // pin 2
mbed_official 457:a07e52520545 70 // EXTI3
mbed_official 457:a07e52520545 71 0, // pin 3
mbed_official 457:a07e52520545 72 // EXTI4
mbed_official 457:a07e52520545 73 0, // pin 4
mbed_official 457:a07e52520545 74 // EXTI5_9
mbed_official 457:a07e52520545 75 0, // pin 5
mbed_official 457:a07e52520545 76 1, // pin 6
mbed_official 457:a07e52520545 77 2, // pin 7
mbed_official 457:a07e52520545 78 3, // pin 8
mbed_official 457:a07e52520545 79 4, // pin 9
mbed_official 457:a07e52520545 80 // EXTI10_15
mbed_official 457:a07e52520545 81 0, // pin 10
mbed_official 457:a07e52520545 82 1, // pin 11
mbed_official 457:a07e52520545 83 2, // pin 12
mbed_official 457:a07e52520545 84 3, // pin 13
mbed_official 457:a07e52520545 85 4, // pin 14
mbed_official 457:a07e52520545 86 5 // pin 15
mbed_official 457:a07e52520545 87 };
mbed_official 60:142c6c6f5949 88
mbed_official 60:142c6c6f5949 89 static gpio_irq_handler irq_handler;
mbed_official 60:142c6c6f5949 90
mbed_official 457:a07e52520545 91 static void handle_interrupt_in(uint32_t irq_index, uint32_t max_num_pin_line)
mbed_official 403:09075a3b15e3 92 {
mbed_official 457:a07e52520545 93 gpio_channel_t *gpio_channel = &channels[irq_index];
mbed_official 457:a07e52520545 94 uint32_t gpio_idx;
mbed_official 457:a07e52520545 95
mbed_official 457:a07e52520545 96 for (gpio_idx = 0; gpio_idx < max_num_pin_line; gpio_idx++) {
mbed_official 457:a07e52520545 97 uint32_t current_mask = (1 << gpio_idx);
mbed_official 457:a07e52520545 98
mbed_official 457:a07e52520545 99 if (gpio_channel->pin_mask & current_mask) {
mbed_official 457:a07e52520545 100 // Retrieve the gpio and pin that generate the irq
mbed_official 457:a07e52520545 101 GPIO_TypeDef *gpio = (GPIO_TypeDef *)(gpio_channel->channel_gpio[gpio_idx]);
mbed_official 457:a07e52520545 102 uint32_t pin = (uint32_t)(1 << (gpio_channel->channel_pin[gpio_idx]));
mbed_official 156:38b9eb24e1d1 103
mbed_official 457:a07e52520545 104 // Clear interrupt flag
mbed_official 457:a07e52520545 105 if (EXTI_GetITStatus(pin) != RESET) {
mbed_official 457:a07e52520545 106 EXTI_ClearITPendingBit(pin);
mbed_official 457:a07e52520545 107
mbed_official 457:a07e52520545 108 if (gpio_channel->channel_ids[gpio_idx] == 0) continue;
mbed_official 174:8bb9f3a33240 109
mbed_official 457:a07e52520545 110 // Check which edge has generated the irq
mbed_official 457:a07e52520545 111 if ((gpio->IDR & pin) == 0) {
mbed_official 457:a07e52520545 112 irq_handler(gpio_channel->channel_ids[gpio_idx], IRQ_FALL);
mbed_official 457:a07e52520545 113 } else {
mbed_official 457:a07e52520545 114 irq_handler(gpio_channel->channel_ids[gpio_idx], IRQ_RISE);
mbed_official 457:a07e52520545 115 }
mbed_official 457:a07e52520545 116 }
mbed_official 457:a07e52520545 117 }
mbed_official 60:142c6c6f5949 118 }
mbed_official 60:142c6c6f5949 119 }
mbed_official 60:142c6c6f5949 120
mbed_official 457:a07e52520545 121 // EXTI line 0
mbed_official 403:09075a3b15e3 122 static void gpio_irq0(void)
mbed_official 403:09075a3b15e3 123 {
mbed_official 457:a07e52520545 124 handle_interrupt_in(0, 1);
mbed_official 174:8bb9f3a33240 125 }
mbed_official 457:a07e52520545 126
mbed_official 457:a07e52520545 127 // EXTI line 1
mbed_official 403:09075a3b15e3 128 static void gpio_irq1(void)
mbed_official 403:09075a3b15e3 129 {
mbed_official 457:a07e52520545 130 handle_interrupt_in(1, 1);
mbed_official 174:8bb9f3a33240 131 }
mbed_official 457:a07e52520545 132
mbed_official 457:a07e52520545 133 // EXTI line 2
mbed_official 403:09075a3b15e3 134 static void gpio_irq2(void)
mbed_official 403:09075a3b15e3 135 {
mbed_official 457:a07e52520545 136 handle_interrupt_in(2, 1);
mbed_official 174:8bb9f3a33240 137 }
mbed_official 457:a07e52520545 138
mbed_official 457:a07e52520545 139 // EXTI line 3
mbed_official 403:09075a3b15e3 140 static void gpio_irq3(void)
mbed_official 403:09075a3b15e3 141 {
mbed_official 457:a07e52520545 142 handle_interrupt_in(3, 1);
mbed_official 174:8bb9f3a33240 143 }
mbed_official 457:a07e52520545 144
mbed_official 457:a07e52520545 145 // EXTI line 4
mbed_official 403:09075a3b15e3 146 static void gpio_irq4(void)
mbed_official 403:09075a3b15e3 147 {
mbed_official 457:a07e52520545 148 handle_interrupt_in(4, 1);
mbed_official 174:8bb9f3a33240 149 }
mbed_official 457:a07e52520545 150
mbed_official 457:a07e52520545 151 // EXTI lines 5 to 9
mbed_official 403:09075a3b15e3 152 static void gpio_irq5(void)
mbed_official 403:09075a3b15e3 153 {
mbed_official 457:a07e52520545 154 handle_interrupt_in(5, 5);
mbed_official 174:8bb9f3a33240 155 }
mbed_official 457:a07e52520545 156
mbed_official 457:a07e52520545 157 // EXTI lines 10 to 15
mbed_official 403:09075a3b15e3 158 static void gpio_irq6(void)
mbed_official 403:09075a3b15e3 159 {
mbed_official 457:a07e52520545 160 handle_interrupt_in(6, 6);
mbed_official 174:8bb9f3a33240 161 }
mbed_official 76:aeb1df146756 162
mbed_official 76:aeb1df146756 163 extern uint32_t Set_GPIO_Clock(uint32_t port_idx);
mbed_official 60:142c6c6f5949 164
mbed_official 403:09075a3b15e3 165 int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32_t id)
mbed_official 403:09075a3b15e3 166 {
mbed_official 76:aeb1df146756 167 IRQn_Type irq_n = (IRQn_Type)0;
mbed_official 60:142c6c6f5949 168 uint32_t vector = 0;
mbed_official 76:aeb1df146756 169 uint32_t irq_index;
mbed_official 457:a07e52520545 170 gpio_channel_t *gpio_channel;
mbed_official 457:a07e52520545 171 uint32_t gpio_idx;
mbed_official 76:aeb1df146756 172
mbed_official 60:142c6c6f5949 173 if (pin == NC) return -1;
mbed_official 60:142c6c6f5949 174
mbed_official 76:aeb1df146756 175 uint32_t port_index = STM_PORT(pin);
mbed_official 76:aeb1df146756 176 uint32_t pin_index = STM_PIN(pin);
mbed_official 76:aeb1df146756 177
mbed_official 76:aeb1df146756 178 // Select irq number and interrupt routine
mbed_official 156:38b9eb24e1d1 179 switch (pin_index) {
mbed_official 156:38b9eb24e1d1 180 case 0:
mbed_official 156:38b9eb24e1d1 181 irq_n = EXTI0_IRQn;
mbed_official 60:142c6c6f5949 182 vector = (uint32_t)&gpio_irq0;
mbed_official 76:aeb1df146756 183 irq_index = 0;
mbed_official 60:142c6c6f5949 184 break;
mbed_official 156:38b9eb24e1d1 185 case 1:
mbed_official 156:38b9eb24e1d1 186 irq_n = EXTI1_IRQn;
mbed_official 76:aeb1df146756 187 vector = (uint32_t)&gpio_irq1;
mbed_official 76:aeb1df146756 188 irq_index = 1;
mbed_official 60:142c6c6f5949 189 break;
mbed_official 156:38b9eb24e1d1 190 case 2:
mbed_official 156:38b9eb24e1d1 191 irq_n = EXTI2_IRQn;
mbed_official 76:aeb1df146756 192 vector = (uint32_t)&gpio_irq2;
mbed_official 76:aeb1df146756 193 irq_index = 2;
mbed_official 76:aeb1df146756 194 break;
mbed_official 156:38b9eb24e1d1 195 case 3:
mbed_official 156:38b9eb24e1d1 196 irq_n = EXTI3_IRQn;
mbed_official 76:aeb1df146756 197 vector = (uint32_t)&gpio_irq3;
mbed_official 76:aeb1df146756 198 irq_index = 3;
mbed_official 60:142c6c6f5949 199 break;
mbed_official 156:38b9eb24e1d1 200 case 4:
mbed_official 156:38b9eb24e1d1 201 irq_n = EXTI4_IRQn;
mbed_official 156:38b9eb24e1d1 202 vector = (uint32_t)&gpio_irq4;
mbed_official 156:38b9eb24e1d1 203 irq_index = 4;
mbed_official 156:38b9eb24e1d1 204 break;
mbed_official 156:38b9eb24e1d1 205 case 5:
mbed_official 156:38b9eb24e1d1 206 case 6:
mbed_official 156:38b9eb24e1d1 207 case 7:
mbed_official 156:38b9eb24e1d1 208 case 8:
mbed_official 156:38b9eb24e1d1 209 case 9:
mbed_official 156:38b9eb24e1d1 210 irq_n = EXTI9_5_IRQn;
mbed_official 156:38b9eb24e1d1 211 vector = (uint32_t)&gpio_irq5;
mbed_official 156:38b9eb24e1d1 212 irq_index = 5;
mbed_official 156:38b9eb24e1d1 213 break;
mbed_official 156:38b9eb24e1d1 214 case 10:
mbed_official 156:38b9eb24e1d1 215 case 11:
mbed_official 156:38b9eb24e1d1 216 case 12:
mbed_official 156:38b9eb24e1d1 217 case 13:
mbed_official 156:38b9eb24e1d1 218 case 14:
mbed_official 156:38b9eb24e1d1 219 case 15:
mbed_official 156:38b9eb24e1d1 220 irq_n = EXTI15_10_IRQn;
mbed_official 156:38b9eb24e1d1 221 vector = (uint32_t)&gpio_irq6;
mbed_official 156:38b9eb24e1d1 222 irq_index = 6;
mbed_official 156:38b9eb24e1d1 223 break;
mbed_official 60:142c6c6f5949 224 default:
mbed_official 156:38b9eb24e1d1 225 error("InterruptIn error: pin not supported.\n");
mbed_official 60:142c6c6f5949 226 return -1;
mbed_official 60:142c6c6f5949 227 }
mbed_official 76:aeb1df146756 228
mbed_official 76:aeb1df146756 229 // Enable GPIO clock
mbed_official 76:aeb1df146756 230 uint32_t gpio_add = Set_GPIO_Clock(port_index);
mbed_official 174:8bb9f3a33240 231
mbed_official 76:aeb1df146756 232 // Enable AFIO clock
mbed_official 60:142c6c6f5949 233 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
mbed_official 76:aeb1df146756 234
mbed_official 60:142c6c6f5949 235 // Connect EXTI line to pin
mbed_official 60:142c6c6f5949 236 GPIO_EXTILineConfig(port_index, pin_index);
mbed_official 60:142c6c6f5949 237
mbed_official 60:142c6c6f5949 238 // Configure EXTI line
mbed_official 174:8bb9f3a33240 239 EXTI_InitTypeDef EXTI_InitStructure;
mbed_official 60:142c6c6f5949 240 EXTI_InitStructure.EXTI_Line = (uint32_t)(1 << pin_index);
mbed_official 60:142c6c6f5949 241 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
mbed_official 60:142c6c6f5949 242 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
mbed_official 60:142c6c6f5949 243 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
mbed_official 60:142c6c6f5949 244 EXTI_Init(&EXTI_InitStructure);
mbed_official 174:8bb9f3a33240 245
mbed_official 60:142c6c6f5949 246 // Enable and set EXTI interrupt to the lowest priority
mbed_official 60:142c6c6f5949 247 NVIC_InitTypeDef NVIC_InitStructure;
mbed_official 60:142c6c6f5949 248 NVIC_InitStructure.NVIC_IRQChannel = irq_n;
mbed_official 60:142c6c6f5949 249 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
mbed_official 60:142c6c6f5949 250 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
mbed_official 60:142c6c6f5949 251 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
mbed_official 60:142c6c6f5949 252 NVIC_Init(&NVIC_InitStructure);
mbed_official 174:8bb9f3a33240 253
mbed_official 60:142c6c6f5949 254 NVIC_SetVector(irq_n, vector);
mbed_official 60:142c6c6f5949 255 NVIC_EnableIRQ(irq_n);
mbed_official 60:142c6c6f5949 256
mbed_official 76:aeb1df146756 257 // Save informations for future use
mbed_official 60:142c6c6f5949 258 obj->irq_n = irq_n;
mbed_official 76:aeb1df146756 259 obj->irq_index = irq_index;
mbed_official 60:142c6c6f5949 260 obj->event = EDGE_NONE;
mbed_official 457:a07e52520545 261 obj->pin = pin;
mbed_official 457:a07e52520545 262
mbed_official 457:a07e52520545 263 gpio_channel = &channels[irq_index];
mbed_official 457:a07e52520545 264 gpio_idx = pin_base_nr[pin_index];
mbed_official 457:a07e52520545 265 gpio_channel->pin_mask |= (1 << gpio_idx);
mbed_official 457:a07e52520545 266 gpio_channel->channel_ids[gpio_idx] = id;
mbed_official 457:a07e52520545 267 gpio_channel->channel_gpio[gpio_idx] = gpio_add;
mbed_official 457:a07e52520545 268 gpio_channel->channel_pin[gpio_idx] = pin_index;
mbed_official 174:8bb9f3a33240 269
mbed_official 174:8bb9f3a33240 270 irq_handler = handler;
mbed_official 174:8bb9f3a33240 271
mbed_official 60:142c6c6f5949 272 return 0;
mbed_official 60:142c6c6f5949 273 }
mbed_official 60:142c6c6f5949 274
mbed_official 403:09075a3b15e3 275 void gpio_irq_free(gpio_irq_t *obj)
mbed_official 403:09075a3b15e3 276 {
mbed_official 457:a07e52520545 277 gpio_channel_t *gpio_channel = &channels[obj->irq_index];
mbed_official 457:a07e52520545 278 uint32_t pin_index = STM_PIN(obj->pin);
mbed_official 457:a07e52520545 279 uint32_t gpio_idx = pin_base_nr[pin_index];
mbed_official 457:a07e52520545 280
mbed_official 457:a07e52520545 281 gpio_channel->pin_mask &= ~(1 << gpio_idx);
mbed_official 457:a07e52520545 282 gpio_channel->channel_ids[gpio_idx] = 0;
mbed_official 457:a07e52520545 283 gpio_channel->channel_gpio[gpio_idx] = 0;
mbed_official 457:a07e52520545 284 gpio_channel->channel_pin[gpio_idx] = 0;
mbed_official 457:a07e52520545 285
mbed_official 60:142c6c6f5949 286 // Disable EXTI line
mbed_official 60:142c6c6f5949 287 EXTI_InitTypeDef EXTI_InitStructure;
mbed_official 60:142c6c6f5949 288 EXTI_StructInit(&EXTI_InitStructure);
mbed_official 174:8bb9f3a33240 289 EXTI_Init(&EXTI_InitStructure);
mbed_official 457:a07e52520545 290
mbed_official 457:a07e52520545 291 pin_function(obj->pin, STM_PIN_DATA(GPIO_Mode_Out_PP, 0));
mbed_official 457:a07e52520545 292 pin_function(obj->pin, STM_PIN_DATA(GPIO_Mode_IN_FLOATING, 0));
mbed_official 60:142c6c6f5949 293 obj->event = EDGE_NONE;
mbed_official 60:142c6c6f5949 294 }
mbed_official 60:142c6c6f5949 295
mbed_official 403:09075a3b15e3 296 void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
mbed_official 403:09075a3b15e3 297 {
mbed_official 60:142c6c6f5949 298 EXTI_InitTypeDef EXTI_InitStructure;
mbed_official 457:a07e52520545 299 uint32_t pin_index = STM_PIN(obj->pin);
mbed_official 76:aeb1df146756 300
mbed_official 76:aeb1df146756 301 EXTI_InitStructure.EXTI_Line = (uint32_t)(1 << pin_index);
mbed_official 60:142c6c6f5949 302 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
mbed_official 331:098575c6d2c8 303 EXTI_InitStructure.EXTI_LineCmd = DISABLE; // Default
mbed_official 174:8bb9f3a33240 304
mbed_official 331:098575c6d2c8 305 if (enable) {
mbed_official 331:098575c6d2c8 306 if (event == IRQ_RISE) {
mbed_official 331:098575c6d2c8 307 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
mbed_official 331:098575c6d2c8 308 if ((obj->event == EDGE_FALL) || (obj->event == EDGE_BOTH)) {
mbed_official 331:098575c6d2c8 309 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
mbed_official 331:098575c6d2c8 310 obj->event = EDGE_BOTH;
mbed_official 331:098575c6d2c8 311 } else { // NONE or RISE
mbed_official 331:098575c6d2c8 312 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
mbed_official 331:098575c6d2c8 313 obj->event = EDGE_RISE;
mbed_official 331:098575c6d2c8 314 }
mbed_official 331:098575c6d2c8 315 }
mbed_official 331:098575c6d2c8 316 if (event == IRQ_FALL) {
mbed_official 331:098575c6d2c8 317 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
mbed_official 331:098575c6d2c8 318 if ((obj->event == EDGE_RISE) || (obj->event == EDGE_BOTH)) {
mbed_official 331:098575c6d2c8 319 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
mbed_official 331:098575c6d2c8 320 obj->event = EDGE_BOTH;
mbed_official 331:098575c6d2c8 321 } else { // NONE or FALL
mbed_official 331:098575c6d2c8 322 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
mbed_official 331:098575c6d2c8 323 obj->event = EDGE_FALL;
mbed_official 331:098575c6d2c8 324 }
mbed_official 60:142c6c6f5949 325 }
mbed_official 403:09075a3b15e3 326 } else { // Disable
mbed_official 331:098575c6d2c8 327 if (event == IRQ_RISE) {
mbed_official 331:098575c6d2c8 328 if ((obj->event == EDGE_FALL) || (obj->event == EDGE_BOTH)) {
mbed_official 331:098575c6d2c8 329 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
mbed_official 331:098575c6d2c8 330 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
mbed_official 331:098575c6d2c8 331 obj->event = EDGE_FALL;
mbed_official 331:098575c6d2c8 332 } else { // NONE or RISE
mbed_official 331:098575c6d2c8 333 EXTI_InitStructure.EXTI_LineCmd = DISABLE;
mbed_official 331:098575c6d2c8 334 obj->event = EDGE_NONE;
mbed_official 331:098575c6d2c8 335 }
mbed_official 60:142c6c6f5949 336 }
mbed_official 331:098575c6d2c8 337 if (event == IRQ_FALL) {
mbed_official 331:098575c6d2c8 338 if ((obj->event == EDGE_RISE) || (obj->event == EDGE_BOTH)) {
mbed_official 331:098575c6d2c8 339 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
mbed_official 331:098575c6d2c8 340 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
mbed_official 331:098575c6d2c8 341 obj->event = EDGE_RISE;
mbed_official 331:098575c6d2c8 342 } else { // NONE or FALL
mbed_official 331:098575c6d2c8 343 EXTI_InitStructure.EXTI_LineCmd = DISABLE;
mbed_official 331:098575c6d2c8 344 obj->event = EDGE_NONE;
mbed_official 331:098575c6d2c8 345 }
mbed_official 403:09075a3b15e3 346 }
mbed_official 60:142c6c6f5949 347 }
mbed_official 174:8bb9f3a33240 348
mbed_official 60:142c6c6f5949 349 EXTI_Init(&EXTI_InitStructure);
mbed_official 60:142c6c6f5949 350 }
mbed_official 60:142c6c6f5949 351
mbed_official 403:09075a3b15e3 352 void gpio_irq_enable(gpio_irq_t *obj)
mbed_official 403:09075a3b15e3 353 {
mbed_official 60:142c6c6f5949 354 NVIC_EnableIRQ(obj->irq_n);
mbed_official 60:142c6c6f5949 355 }
mbed_official 60:142c6c6f5949 356
mbed_official 403:09075a3b15e3 357 void gpio_irq_disable(gpio_irq_t *obj)
mbed_official 403:09075a3b15e3 358 {
mbed_official 60:142c6c6f5949 359 NVIC_DisableIRQ(obj->irq_n);
mbed_official 60:142c6c6f5949 360 obj->event = EDGE_NONE;
mbed_official 60:142c6c6f5949 361 }