GPIO_Interrupts
Source code can be downloaded from source:/Examples/IPC_Blinking
Description
Demo example for testing GPIO interrupts.
Initialization
1 SystemInit();
2 CGU_Init();
Configure LEDs
1 scu_pinmux(D3_SCU_PORT, D3_SCU_PIN, MD_PLN, FUNC4);
2 scu_pinmux(D4_SCU_PORT, D4_SCU_PIN, MD_PLN, FUNC4);
3 scu_pinmux(D5_SCU_PORT, D5_SCU_PIN, MD_PLN, FUNC4);
4 scu_pinmux(D6_SCU_PORT, D6_SCU_PIN, MD_PLN, FUNC4);
5 GPIO_SetDir(D3_GPIO_PORT, D3_GPIO_MASK, 1);
6 GPIO_SetDir(D4_GPIO_PORT, D4_GPIO_MASK, 1);
7 GPIO_SetDir(D5_GPIO_PORT, D5_GPIO_MASK, 1);
8 GPIO_SetDir(D6_GPIO_PORT, D6_GPIO_MASK, 1);
9 GPIO_ClearValue(D3_GPIO_PORT, D3_GPIO_MASK);
10 GPIO_ClearValue(D4_GPIO_PORT, D4_GPIO_MASK);
11 GPIO_ClearValue(D5_GPIO_PORT, D5_GPIO_MASK);
12 GPIO_ClearValue(D6_GPIO_PORT, D6_GPIO_MASK);
Configure buttons
1 scu_pinmux(S1_SCU_PORT, S1_SCU_PIN, MD_PUP | MD_EZI, FUNC4);
2 scu_pinmux(S2_SCU_PORT, S2_SCU_PIN, MD_PUP | MD_EZI, FUNC4);
3 scu_pinmux(S3_SCU_PORT, S3_SCU_PIN, MD_PUP | MD_EZI, FUNC4);
4 scu_pinmux(S4_SCU_PORT, S4_SCU_PIN, MD_PUP | MD_EZI, FUNC4);
5 GPIO_SetDir(S1_GPIO_PORT, S1_GPIO_MASK, 0);
6 GPIO_SetDir(S2_GPIO_PORT, S2_GPIO_MASK, 0);
7 GPIO_SetDir(S3_GPIO_PORT, S3_GPIO_MASK, 0);
8 GPIO_SetDir(S4_GPIO_PORT, S4_GPIO_MASK, 0);
Configure button S1 to generate GPIO0 interrupt on both edges
1 LPC_SCU->PINTSEL0 &= ~(0xFF << 0);
2 LPC_SCU->PINTSEL0 |= (S1_GPIO_PORT << 5) | (S1_GPIO_PIN << 0);
3 LPC_GPIO_PIN_INT->ISEL &= ~(1 << 0); // edge sensitive
4 LPC_GPIO_PIN_INT->SIENR = (1 << 0); // rising edge enable
5 LPC_GPIO_PIN_INT->SIENF = (1 << 0); // falling edge enable
6 NVIC_EnableIRQ(PIN_INT0_IRQn);
Configure button S2 to generate GPIO group interrupt 0
1 LPC_GPIO_GROUP_INT0->CTRL = 0x01; // clear interrupt, OR, edge
2 ((uint32_t *)&(LPC_GPIO_GROUP_INT0->PORT_POL0))[S2_GPIO_PORT] &= ~S2_GPIO_MASK; // falling edge
3 ((uint32_t *)&(LPC_GPIO_GROUP_INT0->PORT_ENA0))[S2_GPIO_PORT] |= S2_GPIO_MASK; // enable interrupt
4 NVIC_EnableIRQ(GINT0_IRQn);
Configure buttons S3 and S4 to renerate interrupt when BOTH are pressed
1 LPC_GPIO_GROUP_INT1->CTRL = 0x07; // clear interrupt, AND, level
2 ((uint32_t *)&(LPC_GPIO_GROUP_INT1->PORT_POL0))[S3_GPIO_PORT] &= ~S3_GPIO_MASK; // low level
3 ((uint32_t *)&(LPC_GPIO_GROUP_INT1->PORT_ENA0))[S3_GPIO_PORT] |= S3_GPIO_MASK; // enable interrupt
4 ((uint32_t *)&(LPC_GPIO_GROUP_INT1->PORT_POL0))[S4_GPIO_PORT] &= ~S4_GPIO_MASK; // low level
5 ((uint32_t *)&(LPC_GPIO_GROUP_INT1->PORT_ENA0))[S4_GPIO_PORT] |= S4_GPIO_MASK; // enable interrupt
6 NVIC_EnableIRQ(GINT1_IRQn);