diff options
| author | nucho <javatea@it.willcomlive.jp> | 2012-03-14 21:19:07 +0900 |
|---|---|---|
| committer | nucho <javatea@it.willcomlive.jp> | 2012-03-14 21:19:07 +0900 |
| commit | 29dde24b94a621d53712ae2b01d0609a4951b9f9 (patch) | |
| tree | 77887e601fedf7a84269f5b44c8928c2f27a7daf /src | |
| parent | 00e50e29e28594f0920828f241f9372fe844c445 (diff) | |
added attachInterrupt function
Diffstat (limited to 'src')
| -rwxr-xr-x | src/core/gpio.cpp | 135 | ||||
| -rwxr-xr-x | src/core/gpio.h | 28 | ||||
| -rw-r--r-- | src/core/gpio_int.cpp | 154 |
3 files changed, 314 insertions, 3 deletions
diff --git a/src/core/gpio.cpp b/src/core/gpio.cpp index 1a7b18e..b4e6b76 100755 --- a/src/core/gpio.cpp +++ b/src/core/gpio.cpp @@ -99,4 +99,139 @@ int digitalRead(int pin) return 0; } +/***************************************************************************** + ** Function name: GPIOSetInterrupt + ** + ** Descriptions: Set interrupt sense, event, etc. + ** edge or level, 0 is edge, 1 is level + ** single or double edge, 0 is single, 1 is double + ** active high or low, etc. + ** + ** parameters: pin num, bit position, sense, single/doube, polarity + ** Returned value: None + ** + *****************************************************************************/ +void GPIOSetInterrupt(int pin, int sense, int single, int event) { + if (pin >= 0 && pin < 20) //arduinoPinAssign(0~19) + { + if (sense == 0) { + LPC_GPIO[arduino_pinAssign[pin * 2]]->IS &= ~(arduino_pinAssign[pin + * 2 + 1]); + /* single or double only applies when sense is 0(edge trigger). */ + if (single == 0) + LPC_GPIO[arduino_pinAssign[pin * 2]]->IBE + &= ~(arduino_pinAssign[pin * 2 + 1]); + else + LPC_GPIO[arduino_pinAssign[pin * 2]]->IBE + |= (arduino_pinAssign[pin * 2 + 1]); + } else + LPC_GPIO[arduino_pinAssign[pin * 2]]->IS |= (arduino_pinAssign[pin + * 2 + 1]); + + if (event == 0) + LPC_GPIO[arduino_pinAssign[pin * 2]]->IEV + &= ~(arduino_pinAssign[pin * 2 + 1]); + else + LPC_GPIO[arduino_pinAssign[pin * 2]]->IEV |= (arduino_pinAssign[pin + * 2 + 1]); + } else if (pin >= 20 && pin < 100) { + //(20~99:reserved) + } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) + { + pin = pin - 100; + if (sense == 0) { + LPC_GPIO[mary_pinAssign[pin * 2]]->IS &= ~(mary_pinAssign[pin * 2 + + 1]); + /* single or double only applies when sense is 0(edge trigger). */ + if (single == 0) + LPC_GPIO[mary_pinAssign[pin * 2]]->IBE &= ~(mary_pinAssign[pin + * 2 + 1]); + else + LPC_GPIO[mary_pinAssign[pin * 2]]->IBE |= (mary_pinAssign[pin + * 2 + 1]); + } else + LPC_GPIO[mary_pinAssign[pin * 2]]->IS |= (mary_pinAssign[pin * 2 + + 1]); + + if (event == 0) + LPC_GPIO[mary_pinAssign[pin * 2]]->IEV &= ~(mary_pinAssign[pin * 2 + + 1]); + else + LPC_GPIO[mary_pinAssign[pin * 2]]->IEV |= (mary_pinAssign[pin * 2 + + 1]); + } + + return; +} + +void GPIOIntEnable(int pin) { + if (pin >= 0 && pin < 20) //arduinoPinAssign(0~19) + { + + LPC_GPIO[arduino_pinAssign[pin * 2]]->IE |= arduino_pinAssign[pin * 2 + + 1]; + } else if (pin >= 20 && pin < 100) { //(20~99:reserved) + } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) + { + pin = pin - 100; + LPC_GPIO[mary_pinAssign[pin * 2]]->IE |= mary_pinAssign[pin * 2 + 1]; + } + + return; +} + +void GPIOIntDisable(int pin) { + if (pin >= 0 && pin < 20) //arduinoPinAssign(0~19) + { + + LPC_GPIO[arduino_pinAssign[pin * 2]]->IE &= ~(arduino_pinAssign[pin * 2 + + 1]); + } else if (pin >= 20 && pin < 100) {//(20~99:reserved) + } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) + { + pin = pin - 100; + LPC_GPIO[mary_pinAssign[pin * 2]]->IE &= ~(mary_pinAssign[pin * 2 + 1]); + } + return; +} + +int GPIOIntStatus(int pin) { + int regVal = 0; + + if (pin >= 0 && pin < 20) //arduinoPinAssign(0~19) + { + if (LPC_GPIO[arduino_pinAssign[pin * 2]]->MIS + & arduino_pinAssign[pin * 2 + 1]) { + regVal = 1; + } + } else if (pin >= 20 && pin < 100) { //(20~99:reserved) + } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) + { + pin = pin - 100; + + if (LPC_GPIO[mary_pinAssign[pin * 2]]->MIS + & mary_pinAssign[pin * 2 + 1]) { + regVal = 1; + } + } + + return regVal; +} + +void GPIOIntClear(int pin) { + if (pin >= 0 && pin < 20) //arduinoPinAssign(0~19) + { + + LPC_GPIO[arduino_pinAssign[pin * 2]]->IC |= arduino_pinAssign[pin * 2 + + 1]; + } else if (pin >= 20 && pin < 100) { //(20~99:reserved) + + } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) + { + pin = pin - 100; + LPC_GPIO[mary_pinAssign[pin * 2]]->IC |= mary_pinAssign[pin * 2 + 1]; + } + + return; +} diff --git a/src/core/gpio.h b/src/core/gpio.h index 5b7c05c..56b8adb 100755 --- a/src/core/gpio.h +++ b/src/core/gpio.h @@ -9,6 +9,11 @@ //#if defined (__USE_CMSIS) #include "LPC11xx.h" + +#ifdef __cplusplus + extern "C" { +#endif + //#endif //======================================= // Define LPC_GPIO[4] (each top address) @@ -182,13 +187,30 @@ const unsigned int arduino_pinAssign[] = typedef enum {INPUT, OUTPUT}pinModeState; -typedef enum {LOW, HIGH}digitalWriteState; +typedef enum {LOW, HIGH,CHANGE, RISING, FALLING}digitalWriteState; void pinMode(int pin,pinModeState state); void digitalWrite(int pin,digitalWriteState state); int digitalRead(int pin); - - +void GPIOSetInterrupt(int pin, int sense, int single, int event); +void GPIOIntEnable(int pin); +void GPIOIntDisable(int pin); +void GPIOIntClear(int pin); +int GPIOIntStatus(int pin); + +void PIOINT0_IRQHandler (void); +void PIOINT1_IRQHandler (void); +void PIOINT2_IRQHandler (void); +void PIOINT3_IRQHandler (void); +void GPIO_IRQHandler(void); + +typedef void (* USER_GPIO_FUNC)(void); +void attachInterrupt(int pin,USER_GPIO_FUNC func, digitalWriteState mode) ; +void detachInterrupt(int pin); + +#ifdef __cplusplus + } +#endif #endif /* GPIO_H_ */ diff --git a/src/core/gpio_int.cpp b/src/core/gpio_int.cpp new file mode 100644 index 0000000..9b46a4f --- /dev/null +++ b/src/core/gpio_int.cpp @@ -0,0 +1,154 @@ +#include "gpio.h" +#include "uart.h" + +#define EXTERNAL_NUM_INTERRUPTS 20 +volatile static USER_GPIO_FUNC intFunc[EXTERNAL_NUM_INTERRUPTS]; + +void attachInterrupt(int pin, USER_GPIO_FUNC func, digitalWriteState mode) { + pinMode(pin, INPUT); + + switch (mode) { + case LOW: + GPIOSetInterrupt(pin, 1, 0, 0); + break; + case HIGH: + GPIOSetInterrupt(pin, 1, 0, 1); + break; + case CHANGE: + GPIOSetInterrupt(pin, 0, 1, 0); + break; + case RISING: + GPIOSetInterrupt(pin, 0, 0, 1); + break; + case FALLING: + GPIOSetInterrupt(pin, 0, 0, 0); + break; + default: + break; + } + + + if (pin >= 0 && pin < 20) //arduinoPinAssign(0~19) + { + intFunc[pin] = func; + + switch (arduino_pinAssign[pin * 2]) { + case 0: + NVIC_EnableIRQ(EINT0_IRQn); + break; + case 1: + NVIC_EnableIRQ(EINT1_IRQn); + break; + case 2: + NVIC_EnableIRQ(EINT2_IRQn); + break; + case 3: + NVIC_EnableIRQ(EINT3_IRQn); + break; + } + } else if (pin >= 20 && pin < 100) { + //(20~99:reserved) + } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) + { + pin = pin - 100; + intFunc[pin] = func; + + switch (mary_pinAssign[pin * 2]) { + case 0: + NVIC_EnableIRQ(EINT0_IRQn); + break; + case 1: + NVIC_EnableIRQ(EINT1_IRQn); + break; + case 2: + NVIC_EnableIRQ(EINT2_IRQn); + break; + case 3: + NVIC_EnableIRQ(EINT3_IRQn); + break; + } + } + + GPIOIntEnable(pin); + + return; +} + +void detachInterrupt(int pin) { + GPIOIntDisable(pin); + + if (pin >= 0 && pin < 20) //arduinoPinAssign(0~19) + { + intFunc[pin] = 0; + if (LPC_GPIO[arduino_pinAssign[pin * 2]]->IE == 0) { + switch (arduino_pinAssign[pin * 2]) { + case 0: + NVIC_DisableIRQ(EINT0_IRQn); + break; + case 1: + NVIC_DisableIRQ(EINT1_IRQn); + break; + case 2: + NVIC_DisableIRQ(EINT2_IRQn); + break; + case 3: + NVIC_DisableIRQ(EINT3_IRQn); + break; + } + } + } + else if (pin >= 20 && pin < 100) {//(20~99:reserved) + } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) + { + pin = pin - 100; + intFunc[pin] = 0; + if (LPC_GPIO[mary_pinAssign[pin * 2]]->IE == 0) { + switch (mary_pinAssign[pin * 2]) { + case 0: + NVIC_DisableIRQ(EINT0_IRQn); + break; + case 1: + NVIC_DisableIRQ(EINT1_IRQn); + break; + case 2: + NVIC_DisableIRQ(EINT2_IRQn); + break; + case 3: + NVIC_DisableIRQ(EINT3_IRQn); + break; + } + } + } + return; +} + +void GPIO_IRQHandler(void) { + for (int i = 0; i < EXTERNAL_NUM_INTERRUPTS; i++) { + if (GPIOIntStatus(i)) { + GPIOIntClear(i); + + if (intFunc[i]) + intFunc[i](); + } + } +} + +void PIOINT0_IRQHandler(void) { + GPIO_IRQHandler(); + return; +} + +void PIOINT1_IRQHandler(void) { + GPIO_IRQHandler(); + return; +} + +void PIOINT2_IRQHandler(void) { + GPIO_IRQHandler(); + return; +} + +void PIOINT3_IRQHandler(void) { + GPIO_IRQHandler(); + return; +} |
