InterruptMask library allows masking/unmasking GPIO interrupts (attached to either the rise or falling edges). It also allows clearing pending interrupts which may come handy before unmasking them.

InterruptMask.h

Committer:
nleoni
Date:
2014-02-18
Revision:
3:7b8a744ac27a
Parent:
2:0e3b2bc65131
Child:
4:a34eddd0a2be

File content as of revision 3:7b8a744ac27a:

/* InterruptMask Library */
/* This class enables masking a GPIO interrupt from a specific MBED pin*/
// Note to get the actual pin number in the LPC of an mbed pin in P0
// simply do pN-P0_0, for example p12-P0_0=17, that is pin 12 in the mbed
// corresponds to Port[0].17 or bit 17 of port 0.
//***************************************************************************//
/* Example usage */
/* >#include "InterruptMask.h"
/* >InterruptIn upPressed(p15);
/* >InterruptMask maskUpButtonInt(p15); //Interrupt mask object allows easy access to 
/* >                                    //mask/unmask interrupts from a GPIO source
/* >void ISRup(void){
/*>    myled1=!myled1;
/*>}
/*>int main() {
/*>    upPressed.rise(&ISRup);
/*>    //downPressed.rise(&ISRdown);
/*>    bool disableInterrupt=false;
/*>    int counter=0,tdelay=10;
/*>    
/*>    while (1) {
/*>        //This section of code periodically (every 10 seconds) masks the specified GPIO interrupt
/*>        //showing how to both mask it and unmask it as well as how to clear pending interrupts
/*>        counter++;
/*>        if(counter>=tdelay){
/*>            disableInterrupt=!disableInterrupt;
/*>            if(disableInterrupt) maskUpButtonInt.maskIntR() ;   //mask interrupt
/*>            if(!disableInterrupt){
/*>                 maskUpButtonInt.ClrInt();       //clear any pending interrupt before unmasking
/*>                 maskUpButtonInt.unMaskIntR();   //unmask interrupt 
/*>            }
/*>            counter=0;
/*>        }
/*>    }
/*>}
*/
//
//                  TESTS RUN                                               //
// I print to the LCD three important LPC1768 registers: 
// ISER0..Interrupt set Enable register(address 0xE000E100), 
// contents of ISER0 are accesible via: *(NVIC->ISER)
//
// IntEnR..GPIO interrupt enable on rising, shows which pins are attached to EINT3 
// on their rising edge (these are only for mbed pins mapped to LPC pins on Port 0)
// its contents are available using th macro LPC_GPIOINT->IO0IntEnR
// IntEnF..GPIO interrupt enable on falling, shows which pins are attached to EINT3 
// on their falling edge (these are only for mbed pins mapped to LPC pins on Port 0)
// its contents are available using th macro LPC_GPIOINT->IO0IntEnF
//
// The test program periodically masks/unmasks (every 10 seconds) a specified interrupt
// from a GPIO pin, 
// 
//***********************************************************************************
//   TEST DESCRIPTION                 Resulting Register Values                     ANALYSYS
// 1 ISR attached to rise             ISER0       0x0020 0010                       Works as expected when p15 interrupt on rise edge
//   edge of p15(toggle LED1)         IO0IntEnR   0x0082 0000 (when p15 unmasked)   is masked the proper bit appears masked in IO0IntEnR
//   and p12(toggle LED2)             IO0IntEnR   0x0002 0000 (when p15 masked)     and the up action of the joystick does not toggle the LED
//                                                                                  while the down motion continues to work. Once the interrupt
//                                                                                  from p15 is unmasked the up joysstick action works again.
//   TEST DESCRIPTION                                           STATUS
// 2 check mask functionality for all                           PASS
//   GPIO pins attached to joystick , both
//   for rise and fall attached interrupts
//
// 3 When interrupt is cleared (ClrInt() )                      PASS
//   before unmasking there should be no pending 
//   interrupts
//   
//***********************************************************************************

#include "mbed.h"

#ifndef INTERRUPTMASK
#define INTERRUPTMASK

class InterruptMask{
    
public:

private:
    int mPin;
    int mask;
    int unmask;
    volatile unsigned int* IOIntEnF; // pointer to register with fall enable interrupt for 
                                     // appropriate LPC port depending on the GPIO pin
    volatile unsigned int* IOIntEnR;// pointer to register with rise enable interrupt for 
                                     // appropriate LPC port depending on the GPIO pin
    volatile unsigned int* IOIntClr; //pointer to register to clear interrupt for 
                                     // appropriate LPC port depending on the GPIO pin                                
public:
    //default constructor required, should not be use will yield error
    InterruptMask();
    //Constructor to be used, initialize with any valid mbed pin (p5 thru p30 except pins 19-20)
    //you will need one InterruptMask for every pin you want ot have control over.
    InterruptMask(PinName GPIOpin);
    
    //This method will mask (disable) any rising edge interrupts of the specified pin
    void maskIntR(void);
    
    //This method will mask (disable) any faling edge interrupts of the specified pin
    void maskIntF(void);

    //This method will unmask (enable) any rising edge interrupts of the specified pin
    void unMaskIntR(void);

    //This method will unmask (enable) any falling edge interrupts of the specified pin
    void unMaskIntF(void);
      
    //This method will clear any pending interrupts of the specified pin
    void ClrInt(void);

};

#endif