SPKT

Dependents:   WAV

Committer:
phungductung
Date:
Tue Jun 04 21:51:46 2019 +0000
Revision:
0:e87aa4c49e95
libray

Who changed what in which revision?

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