6 years, 2 months ago.

Is there solution for defining of interrupt

I have to processing a lot of interrupts. How can I define current interrupt that happens in this example?

#include "mbed.h"

InterruptIn event1(p16);
InterruptIn event2(p15);
InterruptIn event3(p14);

DigitalOut led(LED1);

void trigger() {
    printf("triggered!\n");
}

int main() {
    event1.rise(&trigger);
    event2.rise(&trigger);
    event3.rise(&trigger);

    while(1) {
        led = !led;
        wait(0.25);
    }
}

1 Answer

6 years, 2 months ago.

Hello Igor,

We can try to use lambda expressions for that. But because the InterruptIn doesn't provide pin name, first we have to derive our own class. For example as below:

#include "mbed.h"
 
class MyInterruptIn : public InterruptIn
{
    PinName _pin;
public:
    MyInterruptIn(PinName pin) : InterruptIn(pin), _pin(pin) {}
    PinName pin() { return _pin; }
};
 
MyInterruptIn myPins[] = {
    MyInterruptIn(p14),
    MyInterruptIn(p15),
    MyInterruptIn(p16)
};
 
DigitalOut led(LED1);
 
int main() {
 
    for (int i = 0; i < (sizeof(myPins) / sizeof(*myPins)); i++)
        myPins[i].rise([i]() { printf("Pin %d triggered!\r\n", myPins[i].pin()); });
    
    while(1) {
        led = !led;
        wait(0.25);
    }
}

If position in array is sufficient for us then:

#include "mbed.h"
 
InterruptIn myPins[] = {
    InterruptIn(p14),
    InterruptIn(p15),
    InterruptIn(p16)
};
 
DigitalOut led(LED1);
 
int main() { 
    for (int i = 0; i < (sizeof(myPins) / sizeof(*myPins)); i++)
        myPins[i].rise([i]() { printf("Pin %d triggered!\r\n", i); });
    
    while(1) {
        led = !led;
        wait(0.25);
    }
}

Accepted Answer

Thanks a lot :)

posted by Igor Chernobylov 02 Oct 2018

Hi, I have tried your last example, but the compiler shows:

Error: Expected an expression in "main.cpp", Line: 13, Col: 25

line:

myPins[i].rise([i]() { printf("Pin %d triggered!\r\n", i); });
posted by Igor Chernobylov 03 Oct 2018

Sorry, I compiled the program offline with the Arm GCC toolchain. The online compiler is using the Keil Arm toolchain and it seems that that one does not support C++11 : (

posted by Zoltan Hudak 03 Oct 2018

oh, it's a bad news I guess... Can you please ansew for another my question, I tried to use 4 fall interrupts, but calls only 2 last added. I have no any idea why, maybe there is online compiler problem?

posted by Igor Chernobylov 03 Oct 2018

The number of available external interrupt lines is usually less than the number of GPIO pins. That's why the GPIO pins are grouped and each group is connected to different interrupt line. If it happens that you select two pins that are in the same group (connected to the same interrupt line) then only the latter will work. I'd recommend to read the user manual of your MCU to see how the GPIO are grouped and connected to the individual interrupt lines.

Have a look also at
https://os.mbed.com/questions/78709/What-are-mbed-files-that-contain-pin-ext
https://os.mbed.com/questions/78961/Interrupts-help/#answer13323

posted by Zoltan Hudak 04 Oct 2018

Thank you very much for so detailed answer, it's very helpful :)

posted by Igor Chernobylov 04 Oct 2018