mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

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:
Tue Jan 07 11:00:05 2014 +0000
Revision:
70:c1fbde68b492
Parent:
60:142c6c6f5949
Child:
76:aeb1df146756
Synchronized with git revision 3f438a307904431f2782db3c8fa49946b9fc1d85

Full URL: https://github.com/mbedmicro/mbed/commit/3f438a307904431f2782db3c8fa49946b9fc1d85/

[NUCLEO_F103RB] license text changed + sleep hal updated

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
mbed_official 60:142c6c6f5949 33 #include "gpio_irq_api.h"
mbed_official 60:142c6c6f5949 34 #include "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 60:142c6c6f5949 41 #define CHANNEL_NUM (16)
mbed_official 60:142c6c6f5949 42
mbed_official 60:142c6c6f5949 43 static uint32_t channel_ids[CHANNEL_NUM] = {0};
mbed_official 60:142c6c6f5949 44
mbed_official 60:142c6c6f5949 45 static gpio_irq_handler irq_handler;
mbed_official 60:142c6c6f5949 46
mbed_official 60:142c6c6f5949 47 static void handle_interrupt_in(uint32_t channel) {
mbed_official 60:142c6c6f5949 48 if (channel_ids[channel] == 0) return;
mbed_official 60:142c6c6f5949 49
mbed_official 60:142c6c6f5949 50 uint32_t exti_line = (uint32_t)(1 << channel);
mbed_official 60:142c6c6f5949 51 if (EXTI_GetITStatus(exti_line) != RESET)
mbed_official 60:142c6c6f5949 52 {
mbed_official 60:142c6c6f5949 53 EXTI_ClearITPendingBit(exti_line);
mbed_official 60:142c6c6f5949 54 }
mbed_official 60:142c6c6f5949 55
mbed_official 60:142c6c6f5949 56 // Warning:
mbed_official 60:142c6c6f5949 57 // On this device we don't know if a rising or falling event occured.
mbed_official 60:142c6c6f5949 58 // In case both rise and fall events are set, only the FALL event will be reported.
mbed_official 60:142c6c6f5949 59 if (EXTI->FTSR & (uint32_t)(1 << channel)) {
mbed_official 60:142c6c6f5949 60 irq_handler(channel_ids[channel], IRQ_FALL);
mbed_official 60:142c6c6f5949 61 }
mbed_official 60:142c6c6f5949 62 else {
mbed_official 60:142c6c6f5949 63 irq_handler(channel_ids[channel], IRQ_RISE);
mbed_official 60:142c6c6f5949 64 }
mbed_official 60:142c6c6f5949 65 }
mbed_official 60:142c6c6f5949 66
mbed_official 60:142c6c6f5949 67 static void gpio_irq0(void) {handle_interrupt_in(0);}
mbed_official 60:142c6c6f5949 68 static void gpio_irq1(void) {handle_interrupt_in(1);}
mbed_official 60:142c6c6f5949 69 static void gpio_irq2(void) {handle_interrupt_in(2);}
mbed_official 60:142c6c6f5949 70 static void gpio_irq3(void) {handle_interrupt_in(3);}
mbed_official 60:142c6c6f5949 71 static void gpio_irq4(void) {handle_interrupt_in(4);}
mbed_official 60:142c6c6f5949 72 static void gpio_irq5(void) {handle_interrupt_in(5);}
mbed_official 60:142c6c6f5949 73 static void gpio_irq6(void) {handle_interrupt_in(6);}
mbed_official 60:142c6c6f5949 74 static void gpio_irq7(void) {handle_interrupt_in(7);}
mbed_official 60:142c6c6f5949 75 static void gpio_irq8(void) {handle_interrupt_in(8);}
mbed_official 60:142c6c6f5949 76 static void gpio_irq9(void) {handle_interrupt_in(9);}
mbed_official 60:142c6c6f5949 77 static void gpio_irq10(void) {handle_interrupt_in(10);}
mbed_official 60:142c6c6f5949 78 static void gpio_irq11(void) {handle_interrupt_in(11);}
mbed_official 60:142c6c6f5949 79 static void gpio_irq12(void) {handle_interrupt_in(12);}
mbed_official 60:142c6c6f5949 80 static void gpio_irq13(void) {handle_interrupt_in(13);}
mbed_official 60:142c6c6f5949 81 static void gpio_irq14(void) {handle_interrupt_in(14);}
mbed_official 60:142c6c6f5949 82 static void gpio_irq15(void) {handle_interrupt_in(15);}
mbed_official 60:142c6c6f5949 83
mbed_official 60:142c6c6f5949 84 int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32_t id) {
mbed_official 60:142c6c6f5949 85 IRQn_Type irq_n = (IRQn_Type)0;
mbed_official 60:142c6c6f5949 86 uint32_t vector = 0;
mbed_official 60:142c6c6f5949 87
mbed_official 60:142c6c6f5949 88 if (pin == NC) return -1;
mbed_official 60:142c6c6f5949 89
mbed_official 60:142c6c6f5949 90 uint32_t pin_number = (uint32_t)pin;
mbed_official 60:142c6c6f5949 91 uint32_t pin_index = (pin_number & 0xF);
mbed_official 60:142c6c6f5949 92 uint32_t port_index = (pin_number >> 4);
mbed_official 60:142c6c6f5949 93
mbed_official 60:142c6c6f5949 94 // Select irq number and vector
mbed_official 60:142c6c6f5949 95 switch (pin_index) {
mbed_official 60:142c6c6f5949 96 case 0:
mbed_official 60:142c6c6f5949 97 irq_n = EXTI0_IRQn;
mbed_official 60:142c6c6f5949 98 vector = (uint32_t)&gpio_irq0;
mbed_official 60:142c6c6f5949 99 break;
mbed_official 60:142c6c6f5949 100 case 1:
mbed_official 60:142c6c6f5949 101 irq_n = EXTI1_IRQn;
mbed_official 60:142c6c6f5949 102 vector = (uint32_t)&gpio_irq1;
mbed_official 60:142c6c6f5949 103 break;
mbed_official 60:142c6c6f5949 104 case 2:
mbed_official 60:142c6c6f5949 105 irq_n = EXTI2_IRQn;
mbed_official 60:142c6c6f5949 106 vector = (uint32_t)&gpio_irq2;
mbed_official 60:142c6c6f5949 107 break;
mbed_official 60:142c6c6f5949 108 case 3:
mbed_official 60:142c6c6f5949 109 irq_n = EXTI3_IRQn;
mbed_official 60:142c6c6f5949 110 vector = (uint32_t)&gpio_irq3;
mbed_official 60:142c6c6f5949 111 break;
mbed_official 60:142c6c6f5949 112 case 4:
mbed_official 60:142c6c6f5949 113 irq_n = EXTI4_IRQn;
mbed_official 60:142c6c6f5949 114 vector = (uint32_t)&gpio_irq4;
mbed_official 60:142c6c6f5949 115 break;
mbed_official 60:142c6c6f5949 116 case 5:
mbed_official 60:142c6c6f5949 117 irq_n = EXTI9_5_IRQn;
mbed_official 60:142c6c6f5949 118 vector = (uint32_t)&gpio_irq5;
mbed_official 60:142c6c6f5949 119 break;
mbed_official 60:142c6c6f5949 120 case 6:
mbed_official 60:142c6c6f5949 121 irq_n = EXTI9_5_IRQn;
mbed_official 60:142c6c6f5949 122 vector = (uint32_t)&gpio_irq6;
mbed_official 60:142c6c6f5949 123 break;
mbed_official 60:142c6c6f5949 124 case 7:
mbed_official 60:142c6c6f5949 125 irq_n = EXTI9_5_IRQn;
mbed_official 60:142c6c6f5949 126 vector = (uint32_t)&gpio_irq7;
mbed_official 60:142c6c6f5949 127 break;
mbed_official 60:142c6c6f5949 128 case 8:
mbed_official 60:142c6c6f5949 129 irq_n = EXTI9_5_IRQn;
mbed_official 60:142c6c6f5949 130 vector = (uint32_t)&gpio_irq8;
mbed_official 60:142c6c6f5949 131 break;
mbed_official 60:142c6c6f5949 132 case 9:
mbed_official 60:142c6c6f5949 133 irq_n = EXTI9_5_IRQn;
mbed_official 60:142c6c6f5949 134 vector = (uint32_t)&gpio_irq9;
mbed_official 60:142c6c6f5949 135 break;
mbed_official 60:142c6c6f5949 136 case 10:
mbed_official 60:142c6c6f5949 137 irq_n = EXTI15_10_IRQn;
mbed_official 60:142c6c6f5949 138 vector = (uint32_t)&gpio_irq10;
mbed_official 60:142c6c6f5949 139 break;
mbed_official 60:142c6c6f5949 140 case 11:
mbed_official 60:142c6c6f5949 141 irq_n = EXTI15_10_IRQn;
mbed_official 60:142c6c6f5949 142 vector = (uint32_t)&gpio_irq11;
mbed_official 60:142c6c6f5949 143 break;
mbed_official 60:142c6c6f5949 144 case 12:
mbed_official 60:142c6c6f5949 145 irq_n = EXTI15_10_IRQn;
mbed_official 60:142c6c6f5949 146 vector = (uint32_t)&gpio_irq12;
mbed_official 60:142c6c6f5949 147 break;
mbed_official 60:142c6c6f5949 148 case 13:
mbed_official 60:142c6c6f5949 149 irq_n = EXTI15_10_IRQn;
mbed_official 60:142c6c6f5949 150 vector = (uint32_t)&gpio_irq13;
mbed_official 60:142c6c6f5949 151 break;
mbed_official 60:142c6c6f5949 152 case 14:
mbed_official 60:142c6c6f5949 153 irq_n = EXTI15_10_IRQn;
mbed_official 60:142c6c6f5949 154 vector = (uint32_t)&gpio_irq14;
mbed_official 60:142c6c6f5949 155 break;
mbed_official 60:142c6c6f5949 156 case 15:
mbed_official 60:142c6c6f5949 157 irq_n = EXTI15_10_IRQn;
mbed_official 60:142c6c6f5949 158 vector = (uint32_t)&gpio_irq15;
mbed_official 60:142c6c6f5949 159 break;
mbed_official 60:142c6c6f5949 160 default:
mbed_official 60:142c6c6f5949 161 return -1;
mbed_official 60:142c6c6f5949 162 }
mbed_official 60:142c6c6f5949 163
mbed_official 60:142c6c6f5949 164 // Enable GPIO and AFIO clocks
mbed_official 60:142c6c6f5949 165 RCC_APB2PeriphClockCmd((uint32_t)(RCC_APB2Periph_GPIOA << port_index), ENABLE);
mbed_official 60:142c6c6f5949 166 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
mbed_official 60:142c6c6f5949 167
mbed_official 60:142c6c6f5949 168 // Connect EXTI line to pin
mbed_official 60:142c6c6f5949 169 GPIO_EXTILineConfig(port_index, pin_index);
mbed_official 60:142c6c6f5949 170
mbed_official 60:142c6c6f5949 171 // Configure EXTI line
mbed_official 60:142c6c6f5949 172 EXTI_InitTypeDef EXTI_InitStructure;
mbed_official 60:142c6c6f5949 173 EXTI_InitStructure.EXTI_Line = (uint32_t)(1 << pin_index);
mbed_official 60:142c6c6f5949 174 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
mbed_official 60:142c6c6f5949 175 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
mbed_official 60:142c6c6f5949 176 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
mbed_official 60:142c6c6f5949 177 EXTI_Init(&EXTI_InitStructure);
mbed_official 60:142c6c6f5949 178
mbed_official 60:142c6c6f5949 179 // Enable and set EXTI interrupt to the lowest priority
mbed_official 60:142c6c6f5949 180 NVIC_InitTypeDef NVIC_InitStructure;
mbed_official 60:142c6c6f5949 181 NVIC_InitStructure.NVIC_IRQChannel = irq_n;
mbed_official 60:142c6c6f5949 182 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
mbed_official 60:142c6c6f5949 183 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
mbed_official 60:142c6c6f5949 184 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
mbed_official 60:142c6c6f5949 185 NVIC_Init(&NVIC_InitStructure);
mbed_official 60:142c6c6f5949 186
mbed_official 60:142c6c6f5949 187 NVIC_SetVector(irq_n, vector);
mbed_official 60:142c6c6f5949 188 NVIC_EnableIRQ(irq_n);
mbed_official 60:142c6c6f5949 189
mbed_official 60:142c6c6f5949 190 // Save for future use
mbed_official 60:142c6c6f5949 191 obj->ch = pin_index;
mbed_official 60:142c6c6f5949 192 obj->irq_n = irq_n;
mbed_official 60:142c6c6f5949 193 obj->event = EDGE_NONE;
mbed_official 60:142c6c6f5949 194
mbed_official 60:142c6c6f5949 195 channel_ids[obj->ch] = id;
mbed_official 60:142c6c6f5949 196
mbed_official 60:142c6c6f5949 197 irq_handler = handler;
mbed_official 60:142c6c6f5949 198
mbed_official 60:142c6c6f5949 199 return 0;
mbed_official 60:142c6c6f5949 200 }
mbed_official 60:142c6c6f5949 201
mbed_official 60:142c6c6f5949 202 void gpio_irq_free(gpio_irq_t *obj) {
mbed_official 60:142c6c6f5949 203 channel_ids[obj->ch] = 0;
mbed_official 60:142c6c6f5949 204 // Disable EXTI line
mbed_official 60:142c6c6f5949 205 EXTI_InitTypeDef EXTI_InitStructure;
mbed_official 60:142c6c6f5949 206 EXTI_StructInit(&EXTI_InitStructure);
mbed_official 60:142c6c6f5949 207 EXTI_Init(&EXTI_InitStructure);
mbed_official 60:142c6c6f5949 208 obj->event = EDGE_NONE;
mbed_official 60:142c6c6f5949 209 }
mbed_official 60:142c6c6f5949 210
mbed_official 60:142c6c6f5949 211 void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable) {
mbed_official 60:142c6c6f5949 212 EXTI_InitTypeDef EXTI_InitStructure;
mbed_official 60:142c6c6f5949 213
mbed_official 60:142c6c6f5949 214 EXTI_InitStructure.EXTI_Line = (uint32_t)(1 << obj->ch);
mbed_official 60:142c6c6f5949 215 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
mbed_official 60:142c6c6f5949 216
mbed_official 60:142c6c6f5949 217 if (event == IRQ_RISE) {
mbed_official 60:142c6c6f5949 218 if ((obj->event == EDGE_FALL) || (obj->event == EDGE_BOTH)) {
mbed_official 60:142c6c6f5949 219 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
mbed_official 60:142c6c6f5949 220 obj->event = EDGE_BOTH;
mbed_official 60:142c6c6f5949 221 }
mbed_official 60:142c6c6f5949 222 else { // NONE or RISE
mbed_official 60:142c6c6f5949 223 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
mbed_official 60:142c6c6f5949 224 obj->event = EDGE_RISE;
mbed_official 60:142c6c6f5949 225 }
mbed_official 60:142c6c6f5949 226 }
mbed_official 60:142c6c6f5949 227
mbed_official 60:142c6c6f5949 228 if (event == IRQ_FALL) {
mbed_official 60:142c6c6f5949 229 if ((obj->event == EDGE_RISE) || (obj->event == EDGE_BOTH)) {
mbed_official 60:142c6c6f5949 230 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
mbed_official 60:142c6c6f5949 231 obj->event = EDGE_BOTH;
mbed_official 60:142c6c6f5949 232 }
mbed_official 60:142c6c6f5949 233 else { // NONE or FALL
mbed_official 60:142c6c6f5949 234 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
mbed_official 60:142c6c6f5949 235 obj->event = EDGE_FALL;
mbed_official 60:142c6c6f5949 236 }
mbed_official 60:142c6c6f5949 237 }
mbed_official 60:142c6c6f5949 238
mbed_official 60:142c6c6f5949 239 if (enable) {
mbed_official 60:142c6c6f5949 240 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
mbed_official 60:142c6c6f5949 241 }
mbed_official 60:142c6c6f5949 242 else {
mbed_official 60:142c6c6f5949 243 EXTI_InitStructure.EXTI_LineCmd = DISABLE;
mbed_official 60:142c6c6f5949 244 }
mbed_official 60:142c6c6f5949 245
mbed_official 60:142c6c6f5949 246 EXTI_Init(&EXTI_InitStructure);
mbed_official 60:142c6c6f5949 247 }
mbed_official 60:142c6c6f5949 248
mbed_official 60:142c6c6f5949 249 void gpio_irq_enable(gpio_irq_t *obj) {
mbed_official 60:142c6c6f5949 250 NVIC_EnableIRQ(obj->irq_n);
mbed_official 60:142c6c6f5949 251 }
mbed_official 60:142c6c6f5949 252
mbed_official 60:142c6c6f5949 253 void gpio_irq_disable(gpio_irq_t *obj) {
mbed_official 60:142c6c6f5949 254 NVIC_DisableIRQ(obj->irq_n);
mbed_official 60:142c6c6f5949 255 obj->event = EDGE_NONE;
mbed_official 60:142c6c6f5949 256 }