mbed SDK library sources

Fork of mbed-src by mbed official

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Mon Jan 27 15:30:04 2014 +0000
Revision:
77:b5886236e6f0
Child:
84:f54042cbc282
Synchronized with git revision 84a8f2bcd4fff802c20a78cc2edf304135d243d2

Full URL: https://github.com/mbedmicro/mbed/commit/84a8f2bcd4fff802c20a78cc2edf304135d243d2/

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 77:b5886236e6f0 1 /* mbed Microcontroller Library
mbed_official 77:b5886236e6f0 2 *******************************************************************************
mbed_official 77:b5886236e6f0 3 * Copyright (c) 2014, STMicroelectronics
mbed_official 77:b5886236e6f0 4 * All rights reserved.
mbed_official 77:b5886236e6f0 5 *
mbed_official 77:b5886236e6f0 6 * Redistribution and use in source and binary forms, with or without
mbed_official 77:b5886236e6f0 7 * modification, are permitted provided that the following conditions are met:
mbed_official 77:b5886236e6f0 8 *
mbed_official 77:b5886236e6f0 9 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 77:b5886236e6f0 10 * this list of conditions and the following disclaimer.
mbed_official 77:b5886236e6f0 11 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 77:b5886236e6f0 12 * this list of conditions and the following disclaimer in the documentation
mbed_official 77:b5886236e6f0 13 * and/or other materials provided with the distribution.
mbed_official 77:b5886236e6f0 14 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 77:b5886236e6f0 15 * may be used to endorse or promote products derived from this software
mbed_official 77:b5886236e6f0 16 * without specific prior written permission.
mbed_official 77:b5886236e6f0 17 *
mbed_official 77:b5886236e6f0 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 77:b5886236e6f0 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 77:b5886236e6f0 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 77:b5886236e6f0 21 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 77:b5886236e6f0 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 77:b5886236e6f0 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 77:b5886236e6f0 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 77:b5886236e6f0 25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 77:b5886236e6f0 26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 77:b5886236e6f0 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 77:b5886236e6f0 28 *******************************************************************************
mbed_official 77:b5886236e6f0 29 */
mbed_official 77:b5886236e6f0 30 #include <stddef.h>
mbed_official 77:b5886236e6f0 31 #include "cmsis.h"
mbed_official 77:b5886236e6f0 32
mbed_official 77:b5886236e6f0 33 #include "gpio_irq_api.h"
mbed_official 77:b5886236e6f0 34 #include "pinmap.h"
mbed_official 77:b5886236e6f0 35 #include "error.h"
mbed_official 77:b5886236e6f0 36
mbed_official 77:b5886236e6f0 37 #define EDGE_NONE (0)
mbed_official 77:b5886236e6f0 38 #define EDGE_RISE (1)
mbed_official 77:b5886236e6f0 39 #define EDGE_FALL (2)
mbed_official 77:b5886236e6f0 40 #define EDGE_BOTH (3)
mbed_official 77:b5886236e6f0 41
mbed_official 77:b5886236e6f0 42 #define CHANNEL_NUM (3)
mbed_official 77:b5886236e6f0 43
mbed_official 77:b5886236e6f0 44 static uint32_t channel_ids[CHANNEL_NUM] = {0, 0, 0};
mbed_official 77:b5886236e6f0 45 static uint32_t channel_gpio[CHANNEL_NUM] = {0, 0, 0};
mbed_official 77:b5886236e6f0 46 static uint32_t channel_pin[CHANNEL_NUM] = {0, 0, 0};
mbed_official 77:b5886236e6f0 47
mbed_official 77:b5886236e6f0 48 static gpio_irq_handler irq_handler;
mbed_official 77:b5886236e6f0 49
mbed_official 77:b5886236e6f0 50 static void handle_interrupt_in(uint32_t irq_index) {
mbed_official 77:b5886236e6f0 51
mbed_official 77:b5886236e6f0 52 // Retrieve the gpio and pin that generate the irq
mbed_official 77:b5886236e6f0 53 GPIO_TypeDef *gpio = (GPIO_TypeDef *)(channel_gpio[irq_index]);
mbed_official 77:b5886236e6f0 54 uint32_t pin = (uint32_t)(1 << channel_pin[irq_index]);
mbed_official 77:b5886236e6f0 55
mbed_official 77:b5886236e6f0 56 // Clear interrupt flag
mbed_official 77:b5886236e6f0 57 if (EXTI_GetITStatus(pin) != RESET)
mbed_official 77:b5886236e6f0 58 {
mbed_official 77:b5886236e6f0 59 EXTI_ClearITPendingBit(pin);
mbed_official 77:b5886236e6f0 60 }
mbed_official 77:b5886236e6f0 61
mbed_official 77:b5886236e6f0 62 if (channel_ids[irq_index] == 0) return;
mbed_official 77:b5886236e6f0 63
mbed_official 77:b5886236e6f0 64 // Check which edge has generated the irq
mbed_official 77:b5886236e6f0 65 if ((gpio->IDR & pin) == 0) {
mbed_official 77:b5886236e6f0 66 irq_handler(channel_ids[irq_index], IRQ_FALL);
mbed_official 77:b5886236e6f0 67 }
mbed_official 77:b5886236e6f0 68 else {
mbed_official 77:b5886236e6f0 69 irq_handler(channel_ids[irq_index], IRQ_RISE);
mbed_official 77:b5886236e6f0 70 }
mbed_official 77:b5886236e6f0 71 }
mbed_official 77:b5886236e6f0 72
mbed_official 77:b5886236e6f0 73 // The irq_index is passed to the function
mbed_official 77:b5886236e6f0 74 static void gpio_irq0(void) {handle_interrupt_in(0);}
mbed_official 77:b5886236e6f0 75 static void gpio_irq1(void) {handle_interrupt_in(1);}
mbed_official 77:b5886236e6f0 76 static void gpio_irq2(void) {handle_interrupt_in(2);}
mbed_official 77:b5886236e6f0 77
mbed_official 77:b5886236e6f0 78 extern uint32_t Set_GPIO_Clock(uint32_t port_idx);
mbed_official 77:b5886236e6f0 79
mbed_official 77:b5886236e6f0 80 int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32_t id) {
mbed_official 77:b5886236e6f0 81 IRQn_Type irq_n = (IRQn_Type)0;
mbed_official 77:b5886236e6f0 82 uint32_t vector = 0;
mbed_official 77:b5886236e6f0 83 uint32_t irq_index;
mbed_official 77:b5886236e6f0 84
mbed_official 77:b5886236e6f0 85 if (pin == NC) return -1;
mbed_official 77:b5886236e6f0 86
mbed_official 77:b5886236e6f0 87 uint32_t port_index = STM_PORT(pin);
mbed_official 77:b5886236e6f0 88 uint32_t pin_index = STM_PIN(pin);
mbed_official 77:b5886236e6f0 89
mbed_official 77:b5886236e6f0 90 // Select irq number and interrupt routine
mbed_official 77:b5886236e6f0 91 switch (pin) {
mbed_official 77:b5886236e6f0 92 case PC_13: // User button
mbed_official 77:b5886236e6f0 93 irq_n = EXTI4_15_IRQn;
mbed_official 77:b5886236e6f0 94 vector = (uint32_t)&gpio_irq0;
mbed_official 77:b5886236e6f0 95 irq_index = 0;
mbed_official 77:b5886236e6f0 96 break;
mbed_official 77:b5886236e6f0 97 case PA_0:
mbed_official 77:b5886236e6f0 98 irq_n = EXTI0_1_IRQn;
mbed_official 77:b5886236e6f0 99 vector = (uint32_t)&gpio_irq1;
mbed_official 77:b5886236e6f0 100 irq_index = 1;
mbed_official 77:b5886236e6f0 101 break;
mbed_official 77:b5886236e6f0 102 case PB_3:
mbed_official 77:b5886236e6f0 103 irq_n = EXTI2_3_IRQn;
mbed_official 77:b5886236e6f0 104 vector = (uint32_t)&gpio_irq2;
mbed_official 77:b5886236e6f0 105 irq_index = 2;
mbed_official 77:b5886236e6f0 106 break;
mbed_official 77:b5886236e6f0 107 default:
mbed_official 77:b5886236e6f0 108 error("This pin is not supported\n");
mbed_official 77:b5886236e6f0 109 return -1;
mbed_official 77:b5886236e6f0 110 }
mbed_official 77:b5886236e6f0 111
mbed_official 77:b5886236e6f0 112 // Enable GPIO clock
mbed_official 77:b5886236e6f0 113 uint32_t gpio_add = Set_GPIO_Clock(port_index);
mbed_official 77:b5886236e6f0 114
mbed_official 77:b5886236e6f0 115 // Enable SYSCFG clock
mbed_official 77:b5886236e6f0 116 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
mbed_official 77:b5886236e6f0 117
mbed_official 77:b5886236e6f0 118 // Connect EXTI line to pin
mbed_official 77:b5886236e6f0 119 SYSCFG_EXTILineConfig(port_index, pin_index);
mbed_official 77:b5886236e6f0 120
mbed_official 77:b5886236e6f0 121 // Configure EXTI line
mbed_official 77:b5886236e6f0 122 EXTI_InitTypeDef EXTI_InitStructure;
mbed_official 77:b5886236e6f0 123 EXTI_InitStructure.EXTI_Line = (uint32_t)(1 << pin_index);
mbed_official 77:b5886236e6f0 124 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
mbed_official 77:b5886236e6f0 125 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
mbed_official 77:b5886236e6f0 126 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
mbed_official 77:b5886236e6f0 127 EXTI_Init(&EXTI_InitStructure);
mbed_official 77:b5886236e6f0 128
mbed_official 77:b5886236e6f0 129 // Enable and set EXTI interrupt to the lowest priority
mbed_official 77:b5886236e6f0 130 NVIC_InitTypeDef NVIC_InitStructure;
mbed_official 77:b5886236e6f0 131 NVIC_InitStructure.NVIC_IRQChannel = irq_n;
mbed_official 77:b5886236e6f0 132 NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
mbed_official 77:b5886236e6f0 133 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
mbed_official 77:b5886236e6f0 134 NVIC_Init(&NVIC_InitStructure);
mbed_official 77:b5886236e6f0 135
mbed_official 77:b5886236e6f0 136 NVIC_SetVector(irq_n, vector);
mbed_official 77:b5886236e6f0 137 NVIC_EnableIRQ(irq_n);
mbed_official 77:b5886236e6f0 138
mbed_official 77:b5886236e6f0 139 // Save informations for future use
mbed_official 77:b5886236e6f0 140 obj->irq_n = irq_n;
mbed_official 77:b5886236e6f0 141 obj->irq_index = irq_index;
mbed_official 77:b5886236e6f0 142 obj->event = EDGE_NONE;
mbed_official 77:b5886236e6f0 143 channel_ids[irq_index] = id;
mbed_official 77:b5886236e6f0 144 channel_gpio[irq_index] = gpio_add;
mbed_official 77:b5886236e6f0 145 channel_pin[irq_index] = pin_index;
mbed_official 77:b5886236e6f0 146
mbed_official 77:b5886236e6f0 147 irq_handler = handler;
mbed_official 77:b5886236e6f0 148
mbed_official 77:b5886236e6f0 149 return 0;
mbed_official 77:b5886236e6f0 150 }
mbed_official 77:b5886236e6f0 151
mbed_official 77:b5886236e6f0 152 void gpio_irq_free(gpio_irq_t *obj) {
mbed_official 77:b5886236e6f0 153 channel_ids[obj->irq_index] = 0;
mbed_official 77:b5886236e6f0 154 channel_gpio[obj->irq_index] = 0;
mbed_official 77:b5886236e6f0 155 channel_pin[obj->irq_index] = 0;
mbed_official 77:b5886236e6f0 156 // Disable EXTI line
mbed_official 77:b5886236e6f0 157 EXTI_InitTypeDef EXTI_InitStructure;
mbed_official 77:b5886236e6f0 158 EXTI_StructInit(&EXTI_InitStructure);
mbed_official 77:b5886236e6f0 159 EXTI_Init(&EXTI_InitStructure);
mbed_official 77:b5886236e6f0 160 obj->event = EDGE_NONE;
mbed_official 77:b5886236e6f0 161 }
mbed_official 77:b5886236e6f0 162
mbed_official 77:b5886236e6f0 163 void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable) {
mbed_official 77:b5886236e6f0 164 EXTI_InitTypeDef EXTI_InitStructure;
mbed_official 77:b5886236e6f0 165
mbed_official 77:b5886236e6f0 166 uint32_t pin_index = channel_pin[obj->irq_index];
mbed_official 77:b5886236e6f0 167
mbed_official 77:b5886236e6f0 168 EXTI_InitStructure.EXTI_Line = (uint32_t)(1 << pin_index);
mbed_official 77:b5886236e6f0 169 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
mbed_official 77:b5886236e6f0 170
mbed_official 77:b5886236e6f0 171 if (event == IRQ_RISE) {
mbed_official 77:b5886236e6f0 172 if ((obj->event == EDGE_FALL) || (obj->event == EDGE_BOTH)) {
mbed_official 77:b5886236e6f0 173 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
mbed_official 77:b5886236e6f0 174 obj->event = EDGE_BOTH;
mbed_official 77:b5886236e6f0 175 }
mbed_official 77:b5886236e6f0 176 else { // NONE or RISE
mbed_official 77:b5886236e6f0 177 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
mbed_official 77:b5886236e6f0 178 obj->event = EDGE_RISE;
mbed_official 77:b5886236e6f0 179 }
mbed_official 77:b5886236e6f0 180 }
mbed_official 77:b5886236e6f0 181
mbed_official 77:b5886236e6f0 182 if (event == IRQ_FALL) {
mbed_official 77:b5886236e6f0 183 if ((obj->event == EDGE_RISE) || (obj->event == EDGE_BOTH)) {
mbed_official 77:b5886236e6f0 184 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
mbed_official 77:b5886236e6f0 185 obj->event = EDGE_BOTH;
mbed_official 77:b5886236e6f0 186 }
mbed_official 77:b5886236e6f0 187 else { // NONE or FALL
mbed_official 77:b5886236e6f0 188 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
mbed_official 77:b5886236e6f0 189 obj->event = EDGE_FALL;
mbed_official 77:b5886236e6f0 190 }
mbed_official 77:b5886236e6f0 191 }
mbed_official 77:b5886236e6f0 192
mbed_official 77:b5886236e6f0 193 if (enable) {
mbed_official 77:b5886236e6f0 194 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
mbed_official 77:b5886236e6f0 195 }
mbed_official 77:b5886236e6f0 196 else {
mbed_official 77:b5886236e6f0 197 EXTI_InitStructure.EXTI_LineCmd = DISABLE;
mbed_official 77:b5886236e6f0 198 }
mbed_official 77:b5886236e6f0 199
mbed_official 77:b5886236e6f0 200 EXTI_Init(&EXTI_InitStructure);
mbed_official 77:b5886236e6f0 201 }
mbed_official 77:b5886236e6f0 202
mbed_official 77:b5886236e6f0 203 void gpio_irq_enable(gpio_irq_t *obj) {
mbed_official 77:b5886236e6f0 204 NVIC_EnableIRQ(obj->irq_n);
mbed_official 77:b5886236e6f0 205 }
mbed_official 77:b5886236e6f0 206
mbed_official 77:b5886236e6f0 207 void gpio_irq_disable(gpio_irq_t *obj) {
mbed_official 77:b5886236e6f0 208 NVIC_DisableIRQ(obj->irq_n);
mbed_official 77:b5886236e6f0 209 obj->event = EDGE_NONE;
mbed_official 77:b5886236e6f0 210 }