Craig Evans
/
ELEC2645_EventTriggeredInterrupt_2021
InterruptIn example for LPC1768 board
main.cpp@0:11b9454d32eb, 2020-12-09 (annotated)
- Committer:
- eencae
- Date:
- Wed Dec 09 13:25:08 2020 +0000
- Revision:
- 0:11b9454d32eb
Initial Commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
eencae | 0:11b9454d32eb | 1 | /* |
eencae | 0:11b9454d32eb | 2 | |
eencae | 0:11b9454d32eb | 3 | 2645_InterruptIn |
eencae | 0:11b9454d32eb | 4 | |
eencae | 0:11b9454d32eb | 5 | Sample code from ELEC2645 |
eencae | 0:11b9454d32eb | 6 | |
eencae | 0:11b9454d32eb | 7 | Demonstrates how to use InterruptIn to generate an event-triggered interrupt |
eencae | 0:11b9454d32eb | 8 | |
eencae | 0:11b9454d32eb | 9 | (c) Craig A. Evans, University of Leeds, Dec 2020 |
eencae | 0:11b9454d32eb | 10 | |
eencae | 0:11b9454d32eb | 11 | */ |
eencae | 0:11b9454d32eb | 12 | |
eencae | 0:11b9454d32eb | 13 | #include "mbed.h" |
eencae | 0:11b9454d32eb | 14 | |
eencae | 0:11b9454d32eb | 15 | // Create objects for button A and LED1 |
eencae | 0:11b9454d32eb | 16 | InterruptIn buttonA(p29); |
eencae | 0:11b9454d32eb | 17 | DigitalOut led(LED1); |
eencae | 0:11b9454d32eb | 18 | |
eencae | 0:11b9454d32eb | 19 | // flag - must be volatile as changes within ISR |
eencae | 0:11b9454d32eb | 20 | // g_ prefix makes it easier to distinguish it as global |
eencae | 0:11b9454d32eb | 21 | volatile int g_buttonA_flag = 0; |
eencae | 0:11b9454d32eb | 22 | |
eencae | 0:11b9454d32eb | 23 | // function prototypes |
eencae | 0:11b9454d32eb | 24 | void buttonA_isr(); |
eencae | 0:11b9454d32eb | 25 | |
eencae | 0:11b9454d32eb | 26 | int main() |
eencae | 0:11b9454d32eb | 27 | { |
eencae | 0:11b9454d32eb | 28 | // Button A has a pull-down resistor, so the pin will be at 0 V by default |
eencae | 0:11b9454d32eb | 29 | // and rise to 3.3 V when pressed. We therefore need to look for a rising edge |
eencae | 0:11b9454d32eb | 30 | // on the pin to fire the interrupt |
eencae | 0:11b9454d32eb | 31 | buttonA.rise(&buttonA_isr); |
eencae | 0:11b9454d32eb | 32 | // since Button A has an external pull-down, we should disable to internal pull-down |
eencae | 0:11b9454d32eb | 33 | // resistor that is enabled by default using InterruptIn |
eencae | 0:11b9454d32eb | 34 | buttonA.mode(PullNone); |
eencae | 0:11b9454d32eb | 35 | |
eencae | 0:11b9454d32eb | 36 | while (1) { |
eencae | 0:11b9454d32eb | 37 | |
eencae | 0:11b9454d32eb | 38 | // check if flag i.e. interrupt has occured |
eencae | 0:11b9454d32eb | 39 | if (g_buttonA_flag) { |
eencae | 0:11b9454d32eb | 40 | g_buttonA_flag = 0; // if it has, clear the flag |
eencae | 0:11b9454d32eb | 41 | |
eencae | 0:11b9454d32eb | 42 | // send message over serial port - can observe in CoolTerm etc. |
eencae | 0:11b9454d32eb | 43 | printf("Execute task \n"); |
eencae | 0:11b9454d32eb | 44 | // DO TASK HERE |
eencae | 0:11b9454d32eb | 45 | } |
eencae | 0:11b9454d32eb | 46 | |
eencae | 0:11b9454d32eb | 47 | // put the MCU to sleep until an interrupt wakes it up |
eencae | 0:11b9454d32eb | 48 | sleep(); |
eencae | 0:11b9454d32eb | 49 | |
eencae | 0:11b9454d32eb | 50 | } |
eencae | 0:11b9454d32eb | 51 | } |
eencae | 0:11b9454d32eb | 52 | |
eencae | 0:11b9454d32eb | 53 | // Button A event-triggered interrupt |
eencae | 0:11b9454d32eb | 54 | void buttonA_isr() |
eencae | 0:11b9454d32eb | 55 | { |
eencae | 0:11b9454d32eb | 56 | g_buttonA_flag = 1; // set flag in ISR |
eencae | 0:11b9454d32eb | 57 | } |