// Initialize the push button void pb_init(void){ // Set initial values pbState = READY; pbTenths = 0; pbLongPress = false; pbShortPress = false; // Set up timer interrupt Chip_MRT_IntClear(LPC_MRT_CH(0)); Chip_MRT_SetEnabled(LPC_MRT_CH(0)); // Set up pin interrupt Chip_PININT_Init(LPC_GPIO_PIN_INT); Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_PININT); Chip_SYSCTL_PeriphReset(RESET_PININT); Chip_INMUX_PinIntSel(0, 0, PWR_PB_SENSE); Chip_PININT_ClearIntStatus(LPC_GPIO_PIN_INT, 1 << 0); Chip_PININT_SetPinModeLevel(LPC_GPIO_PIN_INT, 1 << 0); PININT_EnableLevelInt(LPC_GPIO_PIN_INT, 1 << 0); PININT_LowActive(LPC_GPIO_PIN_INT, 1 << 0); // Enable low first so that initial press is not detected NVIC_ClearPendingIRQ(PIN_INT0_IRQn); NVIC_EnableIRQ(PIN_INT0_IRQn); NVIC_SetPriority(PIN_INT0_IRQn, 0x02); // Set higher than systick, but lower than sampling }
void gpio_irq_enable(gpio_irq_t *obj) { switch(obj->event){ case IRQ_EDGE_RISE: Chip_PININT_SetPinModeEdge(LPC_PININT, obj->irq_index); /* edge sensitive */ Chip_PININT_EnableIntHigh(LPC_PININT, obj->irq_index); /* Rising edge interrupt */ break; case IRQ_EDGE_FALL: Chip_PININT_SetPinModeEdge(LPC_PININT, obj->irq_index); /* Edge sensitive */ Chip_PININT_EnableIntLow(LPC_PININT, obj->irq_index); /* Falling edge interrupt */ break; case IRQ_LEVEL_HIGH: Chip_PININT_SetPinModeLevel(LPC_PININT, obj->irq_index); /* Level sensitive */ Chip_PININT_EnableIntHigh(LPC_PININT, obj->irq_index); /* High level interrupt */ break; case IRQ_LEVEL_LOW: Chip_PININT_SetPinModeLevel(LPC_PININT, obj->irq_index); /* Level sensitive */ Chip_PININT_EnableIntLow(LPC_PININT, obj->irq_index); /* Low level interrupt */ break; default: D1_printf("GPIO_IRQ_ENABLE: Bad IRQ Mode: %d\r\n", obj->irq_index); while(1){}; } }
bool Board_GPIOs_enableIntCallback(int gpioNumber,void(*function)(void*),void* arg, uint8_t flagEdgeLevel, uint8_t flagHighLow) { // check if gpio alerady has assigned int for(uint8_t i=0; i<4 ; i++) { if(extIntData[i].callback!=NULL && extIntData[i].gpioNumber==gpioNumber) return 0; } // find free extInt callback for(uint8_t i=0; i<4 ; i++) { if(extIntData[i].callback==NULL) { extIntData[i].callback = function; extIntData[i].callbackArg = arg; extIntData[i].gpioNumber=gpioNumber; // Enable interrupt uint8_t intNumber = i + 4; // starts from INT4 Chip_SCU_GPIOIntPinSel(intNumber, gpiosInfo[gpioNumber].gpio, gpiosInfo[gpioNumber].gpioBit); Chip_PININT_ClearIntStatus(LPC_GPIO_PIN_INT, PININTCH(intNumber)); if(flagEdgeLevel) Chip_PININT_SetPinModeEdge(LPC_GPIO_PIN_INT, PININTCH(intNumber)); else Chip_PININT_SetPinModeLevel(LPC_GPIO_PIN_INT, PININTCH(intNumber)); if(flagHighLow) Chip_PININT_EnableIntHigh(LPC_GPIO_PIN_INT, PININTCH(intNumber)); else Chip_PININT_EnableIntLow(LPC_GPIO_PIN_INT, PININTCH(intNumber)); switch(intNumber) { case 4: NVIC_ClearPendingIRQ(PIN_INT4_IRQn); NVIC_EnableIRQ(PIN_INT4_IRQn); break; case 5: NVIC_ClearPendingIRQ(PIN_INT5_IRQn); NVIC_EnableIRQ(PIN_INT5_IRQn); break; case 6: NVIC_ClearPendingIRQ(PIN_INT6_IRQn); NVIC_EnableIRQ(PIN_INT6_IRQn); break; case 7: NVIC_ClearPendingIRQ(PIN_INT7_IRQn); NVIC_EnableIRQ(PIN_INT7_IRQn); break; } return 1; } } return 0; }
void Board_Attach_Interrupt(uint32_t ulPin, void (*callback)(void), uint32_t mode) { uint8_t port = 1; uint8_t pin = 24; uint8_t pinIntChannel = 0; LPC1347_IRQn_Type pinIntIRQ = PIN_INT0_IRQn; port = APIN_PORT(ulPin); pin = APIN_PIN(ulPin); pinIntChannel = APIN_INT(ulPin); if(pinIntChannel == EXT_INT_0) { pinIntIRQ = PIN_INT0_IRQn; callbackPinIntA = callback; } else if(pinIntChannel == EXT_INT_1) { pinIntIRQ = PIN_INT1_IRQn; callbackPinIntB = callback; } else if(pinIntChannel == EXT_INT_2) { pinIntIRQ = PIN_INT2_IRQn; callbackPinIntC = callback; } else if(pinIntChannel == EXT_INT_3) { pinIntIRQ = PIN_INT3_IRQn; callbackPinIntD = callback; } /* Configure GPIO pin as input */ Chip_GPIO_SetPinDIRInput(LPC_GPIO_PORT, port, pin); /* Configure pin as GPIO with pulldown */ // All digital pins are selected such that GPIO is on IOCON_FUNC0 Chip_IOCON_PinMuxSet(LPC_IOCON, port, pin, (IOCON_FUNC0 | IOCON_MODE_PULLDOWN)); /* Enable PININT clock */ Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_PINT); /* Configure interrupt channel for the GPIO pin in SysCon block */ Chip_SYSCTL_SetPinInterrupt(pinIntChannel, port, pin); /* Configure channel interrupt as edge sensitive and falling edge interrupt */ Chip_PININT_ClearIntStatus(LPC_PININT, PININTCH(pinIntChannel)); if(mode == HIGH) { Chip_PININT_SetPinModeLevel(LPC_PININT, PININTCH(pinIntChannel)); Chip_PININT_EnableIntHigh(LPC_PININT, PININTCH(pinIntChannel)); } else if(mode == LOW) { Chip_PININT_SetPinModeLevel(LPC_PININT, PININTCH(pinIntChannel)); Chip_PININT_EnableIntLow(LPC_PININT, PININTCH(pinIntChannel)); } else if(mode == RISING) { Chip_PININT_SetPinModeEdge(LPC_PININT, PININTCH(pinIntChannel)); Chip_PININT_EnableIntHigh(LPC_PININT, PININTCH(pinIntChannel)); } else if(mode == FALLING) { Chip_PININT_SetPinModeEdge(LPC_PININT, PININTCH(pinIntChannel)); Chip_PININT_EnableIntLow(LPC_PININT, PININTCH(pinIntChannel)); } else if(mode == CHANGE) { Chip_PININT_SetPinModeEdge(LPC_PININT, PININTCH(pinIntChannel)); Chip_PININT_EnableIntHigh(LPC_PININT, PININTCH(pinIntChannel)); Chip_PININT_EnableIntLow(LPC_PININT, PININTCH(pinIntChannel)); } /* Enable interrupt in the NVIC */ NVIC_ClearPendingIRQ(pinIntIRQ); NVIC_EnableIRQ(pinIntIRQ); }