#include "board.h"
/***************************************************************************** * Private types/enumerations/variables ****************************************************************************/
/* These two inputs for GROUP GPIO Interrupt 0. */ #define LEFT_SWITCH_PORT 0 #define LEFT_SWITCH_BIT 1 #define UP_SWITCH_PORT 0 #define UP_SWITCH_BIT 16
/***************************************************************************** * Public types/enumerations/variables ****************************************************************************/
/***************************************************************************** * Private functions ****************************************************************************/
/***************************************************************************** * Public functions ****************************************************************************/
/** * @brief Handle Group GPIO 0 interrupt * @return Nothing */ void GINT0_IRQHandler(void) { Chip_GPIOGP_ClearIntStatus(LPC_GPIOGROUP, 0); Board_LED_Toggle(0); }
/** * @brief Handle Group GPIO 1 interrupt * @return Nothing */ void GINT1_IRQHandler(void) { Chip_GPIOGP_ClearIntStatus(LPC_GPIOGROUP, 1); Board_LED_Toggle(1); }
/** * @brief Main program body * @return Does not return */ int main(void) { /* Generic Initialization */ SystemCoreClockUpdate();
/* Board_Init calls Chip_GPIO_Init and enables GPIO clock if needed, Chip_GPIO_Init is not called again */ Board_Init(); Board_LED_Set(0, false);
/* Group GPIO interrupt 0 will be invoked when both the joystick up switch and left switch are pressed. */ Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_GROUP0INT); Chip_GPIO_SetPinDIRInput(LPC_GPIO, LEFT_SWITCH_PORT, LEFT_SWITCH_BIT); Chip_GPIO_SetPinDIRInput(LPC_GPIO, UP_SWITCH_PORT, UP_SWITCH_BIT); Chip_GPIOGP_SelectLowLevel(LPC_GPIOGROUP, 0, LEFT_SWITCH_PORT, 1 << LEFT_SWITCH_BIT); Chip_GPIOGP_SelectLowLevel(LPC_GPIOGROUP, 0, UP_SWITCH_PORT, 1 << UP_SWITCH_BIT); Chip_GPIOGP_EnableGroupPins(LPC_GPIOGROUP, 0, LEFT_SWITCH_PORT, 1 << LEFT_SWITCH_BIT); Chip_GPIOGP_EnableGroupPins(LPC_GPIOGROUP, 0, UP_SWITCH_PORT, 1 << UP_SWITCH_BIT); Chip_GPIOGP_SelectOrMode(LPC_GPIOGROUP, 0); Chip_GPIOGP_SelectEdgeMode(LPC_GPIOGROUP, 0);
Chip_SYSCTL_EnablePeriphWakeup(SYSCTL_WAKEUP_GPIOINT0);
/* Enable Group GPIO interrupt 0 */ NVIC_EnableIRQ(GINT0_IRQn);
/* We can optionally call Chip_SYSCTL_SetDeepSleepPD() to power down the BOD and WDT if we aren't using them in deep sleep modes. */ Chip_SYSCTL_SetDeepSleepPD(SYSCTL_DEEPSLP_BOD_PD | SYSCTL_DEEPSLP_WDTOSC_PD);
/* We should call Chip_SYSCTL_SetWakeup() to setup any peripherals we want to power back up on wakeup. For this example, we'll power back up the IRC, FLASH, the system oscillator, and the PLL */ Chip_SYSCTL_SetWakeup(~(SYSCTL_SLPWAKE_IRCOUT_PD | SYSCTL_SLPWAKE_IRC_PD | SYSCTL_SLPWAKE_FLASH_PD | SYSCTL_SLPWAKE_SYSOSC_PD | SYSCTL_SLPWAKE_SYSPLL_PD));
/* Enter MCU Power down mode */ Chip_PMU_PowerDownState(LPC_PMU);
/* Stay in sleep mode. All the work is done in ISRs. */ while (1) { /* Go to sleep state - will wake up automatically on interrupt */ // Chip_PMU_SleepState(LPC_PMU); }
/* Does not return */ return 0; } |