Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: mbed_blinky-bmd-200 bmd-200_accel_demo firstRig
Fork of mbed-src by
targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/gpio_irq_api.c@457:a07e52520545, 2015-01-27 (annotated)
- 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?
| User | Revision | Line number | New 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 | } | 
