mirror of https://github.com/ARMmbed/mbed-os.git
[NUCLEO_F4x1RE] test MBED_A7 InterruptIn failed
The test failed because it was not possible to switch off an already active edge detection. The reason was the GPIO HAL module driver function HAL_GPIO_Init. The function changes only interrupt or event flags when the EXTI_MODE flag in GPIO_Init->Mode is set. gpio_irq_set changed the event mode to EDGE_NONE in gpio_irq_t structure but that doesn't changed the interrupt and event flags in the CMSIS function because of the missing EXTI_MODE. Now gpio_irq_set is able to switch off a specific or both edge detections. The MBED_A7 test was extended by another test to check if switch off edge detection is OK.pull/495/head
parent
da170514ab
commit
c59657a6d9
|
@ -53,6 +53,7 @@ extern "C" {
|
||||||
#define STM_MODE_EVT_RISING (9)
|
#define STM_MODE_EVT_RISING (9)
|
||||||
#define STM_MODE_EVT_FALLING (10)
|
#define STM_MODE_EVT_FALLING (10)
|
||||||
#define STM_MODE_EVT_RISING_FALLING (11)
|
#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)
|
// High nibble = port number (0=A, 1=B, 2=C, 3=D, 4=E, 5=F, 6=G, 7=H)
|
||||||
// Low nibble = pin number
|
// Low nibble = pin number
|
||||||
|
|
|
@ -222,7 +222,29 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable) {
|
||||||
} else {
|
} else {
|
||||||
mode = STM_MODE_INPUT;
|
mode = STM_MODE_INPUT;
|
||||||
pull = GPIO_NOPULL;
|
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));
|
pin_function(obj->pin, STM_PIN_DATA(mode, pull, 0));
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
#include "mbed_error.h"
|
#include "mbed_error.h"
|
||||||
|
|
||||||
// GPIO mode look-up table
|
// GPIO mode look-up table
|
||||||
static const uint32_t gpio_mode[12] = {
|
static const uint32_t gpio_mode[13] = {
|
||||||
0x00000000, // 0 = GPIO_MODE_INPUT
|
0x00000000, // 0 = GPIO_MODE_INPUT
|
||||||
0x00000001, // 1 = GPIO_MODE_OUTPUT_PP
|
0x00000001, // 1 = GPIO_MODE_OUTPUT_PP
|
||||||
0x00000011, // 2 = GPIO_MODE_OUTPUT_OD
|
0x00000011, // 2 = GPIO_MODE_OUTPUT_OD
|
||||||
|
@ -45,7 +45,8 @@ static const uint32_t gpio_mode[12] = {
|
||||||
0x10310000, // 8 = GPIO_MODE_IT_RISING_FALLING
|
0x10310000, // 8 = GPIO_MODE_IT_RISING_FALLING
|
||||||
0x10120000, // 9 = GPIO_MODE_EVT_RISING
|
0x10120000, // 9 = GPIO_MODE_EVT_RISING
|
||||||
0x10220000, // 10 = GPIO_MODE_EVT_FALLING
|
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
|
// Enable GPIO clock and return GPIO base address
|
||||||
|
|
|
@ -53,6 +53,7 @@ extern "C" {
|
||||||
#define STM_MODE_EVT_RISING (9)
|
#define STM_MODE_EVT_RISING (9)
|
||||||
#define STM_MODE_EVT_FALLING (10)
|
#define STM_MODE_EVT_FALLING (10)
|
||||||
#define STM_MODE_EVT_RISING_FALLING (11)
|
#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)
|
// High nibble = port number (0=A, 1=B, 2=C, 3=D, 4=E, 5=F, 6=G, 7=H)
|
||||||
// Low nibble = pin number
|
// Low nibble = pin number
|
||||||
|
|
|
@ -233,8 +233,28 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
|
||||||
} else {
|
} else {
|
||||||
mode = STM_MODE_INPUT;
|
mode = STM_MODE_INPUT;
|
||||||
pull = GPIO_NOPULL;
|
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));
|
pin_function(obj->pin, STM_PIN_DATA(mode, pull, 0));
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
#include "mbed_error.h"
|
#include "mbed_error.h"
|
||||||
|
|
||||||
// GPIO mode look-up table
|
// GPIO mode look-up table
|
||||||
static const uint32_t gpio_mode[12] = {
|
static const uint32_t gpio_mode[13] = {
|
||||||
0x00000000, // 0 = GPIO_MODE_INPUT
|
0x00000000, // 0 = GPIO_MODE_INPUT
|
||||||
0x00000001, // 1 = GPIO_MODE_OUTPUT_PP
|
0x00000001, // 1 = GPIO_MODE_OUTPUT_PP
|
||||||
0x00000011, // 2 = GPIO_MODE_OUTPUT_OD
|
0x00000011, // 2 = GPIO_MODE_OUTPUT_OD
|
||||||
|
@ -45,7 +45,8 @@ static const uint32_t gpio_mode[12] = {
|
||||||
0x10310000, // 8 = GPIO_MODE_IT_RISING_FALLING
|
0x10310000, // 8 = GPIO_MODE_IT_RISING_FALLING
|
||||||
0x10120000, // 9 = GPIO_MODE_EVT_RISING
|
0x10120000, // 9 = GPIO_MODE_EVT_RISING
|
||||||
0x10220000, // 10 = GPIO_MODE_EVT_FALLING
|
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
|
// Enable GPIO clock and return GPIO base address
|
||||||
|
|
|
@ -90,13 +90,23 @@ int main() {
|
||||||
notify_completion(false);
|
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
|
//Finally test both
|
||||||
in.rise(in_handler);
|
in.rise(in_handler);
|
||||||
in.fall(in_handler);
|
in.fall(in_handler);
|
||||||
flipper();
|
flipper();
|
||||||
|
|
||||||
if (checks != 20) {
|
if (checks != 20) {
|
||||||
printf("Simultaneous rising and falling edges failed\n");
|
printf("Simultaneous rising and falling edges failed: %d\n",checks);
|
||||||
notify_completion(false);
|
notify_completion(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue