diff --git a/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/PinNames.h b/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/PinNames.h index 67def4f980..6c82cf53b7 100644 --- a/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/PinNames.h +++ b/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/PinNames.h @@ -53,6 +53,7 @@ extern "C" { #define STM_MODE_EVT_RISING (9) #define STM_MODE_EVT_FALLING (10) #define STM_MODE_EVT_RISING_FALLING (11) +#define STM_MODE_IT_EVT_RESET (12) // High nibble = port number (0=A, 1=B, 2=C, 3=D, 4=E, 5=F, 6=G, 7=H) // Low nibble = pin number diff --git a/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/gpio_irq_api.c b/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/gpio_irq_api.c index 47f0883692..2db6b33642 100644 --- a/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/gpio_irq_api.c +++ b/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/gpio_irq_api.c @@ -222,7 +222,29 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable) { } else { mode = STM_MODE_INPUT; pull = GPIO_NOPULL; - obj->event = EDGE_NONE; + if (event == IRQ_RISE) { + if ((obj->event == EDGE_FALL) || (obj->event == EDGE_BOTH)) { + mode = STM_MODE_IT_FALLING; + obj->event = EDGE_FALL; + } else if (obj->event == EDGE_RISE) { + mode = STM_MODE_IT_EVT_RESET; + obj->event = EDGE_NONE; + } + } + else if (event == IRQ_FALL) { + if ((obj->event == EDGE_RISE) || (obj->event == EDGE_BOTH)) { + mode = STM_MODE_IT_RISING; + obj->event = EDGE_RISE; + } else if (obj->event == IRQ_FALL) { + mode = STM_MODE_IT_EVT_RESET; + obj->event = EDGE_NONE; + } + } + else { + mode = STM_MODE_IT_EVT_RESET; + obj->event = EDGE_NONE; + } + } pin_function(obj->pin, STM_PIN_DATA(mode, pull, 0)); diff --git a/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/pinmap.c b/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/pinmap.c index 01afd00dab..4036119f21 100644 --- a/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/pinmap.c +++ b/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/pinmap.c @@ -33,7 +33,7 @@ #include "mbed_error.h" // GPIO mode look-up table -static const uint32_t gpio_mode[12] = { +static const uint32_t gpio_mode[13] = { 0x00000000, // 0 = GPIO_MODE_INPUT 0x00000001, // 1 = GPIO_MODE_OUTPUT_PP 0x00000011, // 2 = GPIO_MODE_OUTPUT_OD @@ -45,7 +45,8 @@ static const uint32_t gpio_mode[12] = { 0x10310000, // 8 = GPIO_MODE_IT_RISING_FALLING 0x10120000, // 9 = GPIO_MODE_EVT_RISING 0x10220000, // 10 = GPIO_MODE_EVT_FALLING - 0x10320000 // 11 = GPIO_MODE_EVT_RISING_FALLING + 0x10320000, // 11 = GPIO_MODE_EVT_RISING_FALLING + 0x10000000 // 12 = Reset GPIO_MODE_IT_EVT }; // Enable GPIO clock and return GPIO base address diff --git a/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F411RE/PinNames.h b/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F411RE/PinNames.h index 67def4f980..6c82cf53b7 100644 --- a/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F411RE/PinNames.h +++ b/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F411RE/PinNames.h @@ -53,6 +53,7 @@ extern "C" { #define STM_MODE_EVT_RISING (9) #define STM_MODE_EVT_FALLING (10) #define STM_MODE_EVT_RISING_FALLING (11) +#define STM_MODE_IT_EVT_RESET (12) // High nibble = port number (0=A, 1=B, 2=C, 3=D, 4=E, 5=F, 6=G, 7=H) // Low nibble = pin number diff --git a/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F411RE/gpio_irq_api.c b/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F411RE/gpio_irq_api.c index 42ba48870b..2343b9fa68 100644 --- a/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F411RE/gpio_irq_api.c +++ b/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F411RE/gpio_irq_api.c @@ -233,8 +233,28 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable) } else { mode = STM_MODE_INPUT; pull = GPIO_NOPULL; - obj->event = EDGE_NONE; - } + if (event == IRQ_RISE) { + if ((obj->event == EDGE_FALL) || (obj->event == EDGE_BOTH)) { + mode = STM_MODE_IT_FALLING; + obj->event = EDGE_FALL; + } else if (obj->event == EDGE_RISE) { + mode = STM_MODE_IT_EVT_RESET; + obj->event = EDGE_NONE; + } + } + else if (event == IRQ_FALL) { + if ((obj->event == EDGE_RISE) || (obj->event == EDGE_BOTH)) { + mode = STM_MODE_IT_RISING; + obj->event = EDGE_RISE; + } else if (obj->event == IRQ_FALL) { + mode = STM_MODE_IT_EVT_RESET; + obj->event = EDGE_NONE; + } + } + else { + mode = STM_MODE_IT_EVT_RESET; + obj->event = EDGE_NONE; + } } pin_function(obj->pin, STM_PIN_DATA(mode, pull, 0)); } diff --git a/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F411RE/pinmap.c b/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F411RE/pinmap.c index 524733cdad..a0ea2f2ef7 100644 --- a/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F411RE/pinmap.c +++ b/libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_F411RE/pinmap.c @@ -33,7 +33,7 @@ #include "mbed_error.h" // GPIO mode look-up table -static const uint32_t gpio_mode[12] = { +static const uint32_t gpio_mode[13] = { 0x00000000, // 0 = GPIO_MODE_INPUT 0x00000001, // 1 = GPIO_MODE_OUTPUT_PP 0x00000011, // 2 = GPIO_MODE_OUTPUT_OD @@ -45,7 +45,8 @@ static const uint32_t gpio_mode[12] = { 0x10310000, // 8 = GPIO_MODE_IT_RISING_FALLING 0x10120000, // 9 = GPIO_MODE_EVT_RISING 0x10220000, // 10 = GPIO_MODE_EVT_FALLING - 0x10320000 // 11 = GPIO_MODE_EVT_RISING_FALLING + 0x10320000, // 11 = GPIO_MODE_EVT_RISING_FALLING + 0x10000000 // 12 = Reset GPIO_MODE_IT_EVT }; // Enable GPIO clock and return GPIO base address diff --git a/libraries/tests/mbed/interruptin/main.cpp b/libraries/tests/mbed/interruptin/main.cpp index e35e4ec552..e173fda06e 100644 --- a/libraries/tests/mbed/interruptin/main.cpp +++ b/libraries/tests/mbed/interruptin/main.cpp @@ -90,13 +90,23 @@ int main() { notify_completion(false); } + //Now test switch off edge detection + in.rise(NULL); + in.fall(NULL); + flipper(); + + if (checks != 10) { + printf("edge detection switch off test failed: %d\n",checks); + notify_completion(false); + } + //Finally test both in.rise(in_handler); in.fall(in_handler); flipper(); if (checks != 20) { - printf("Simultaneous rising and falling edges failed\n"); + printf("Simultaneous rising and falling edges failed: %d\n",checks); notify_completion(false); }