AnsweredAssumed Answered

How to wake up the system from deep sleep mode with pin interrupt?

Question asked by Yen Milton on Apr 18, 2018
Latest reply on Apr 23, 2018 by Yen Milton

What I’ve done is connecting the PIO1.0 to GND. However, I’m still not able to wake up the MCU. I’m not sure where I did wrong in the code. Please help me! Very much appreciated!


Summary of my code:
1. Setting PIO1.0 as pin interrupt, and then have the red LED light on indicating the this setting has been done.
2. num is for setting the sleep mode. The blue LED light will be on before going to deep sleep. After PIO 1.0 is connected to GND, the system will be woken up and UART0 will display text “WAKEUP”. And then the blue LED light will be on before going to deep sleep.


My EVB:
LPCXpresso11U68 OM13058

Code download:
https://drive.google.com/open?id=12ay_2-3bhIqHxvHi4gOAvLcs_3Rm1OyO

 

Code:

#include "board.h"

 

/* Mapped to PIO0_1, ISP_EN button on LPCXpresso board */
#define GPIO_PININT_PIN 0 /* GPIO pin number mapped to PININT */
#define GPIO_PININT_PORT 1 /* GPIO port number mapped to PININT */
#define GPIO_PININT_INDEX 0 /* PININT index used for GPIO mapping */

 

void PIN_INT0_IRQHandler(void)
{
      Chip_PININT_ClearIntStatus(LPC_PININT, PININTCH(GPIO_PININT_INDEX));
      //Board_LED_Toggle(0);
}

 

int main(void)
{
uint32_t i,num;

SystemCoreClockUpdate();
Board_Init();
Board_LED_Set(0, 0);

 

//P1.0 Interrupt Wakeup---------------------------------------------------------------------------------------------
/* We'll use an optional IOCON filter (0) with a divider of 64 for the
input pin to be used for PININT */
Chip_Clock_SetIOCONFiltClockDiv(0, 64);

 

/* Configure GPIO pin as input */
Chip_GPIO_SetPinDIRInput(LPC_GPIO, GPIO_PININT_PORT, GPIO_PININT_PIN);

 

/* Configure pin as GPIO with pullup and use optional IOCON divider
0 with 3 filter clocks for input filtering */
Chip_IOCON_PinMuxSet(LPC_IOCON, GPIO_PININT_PORT, GPIO_PININT_PIN,
(IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_CLKDIV(0) | IOCON_S_MODE(3)));

 

/* Enable PININT clock */
Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_PINT);

 

/* Configure interrupt channel for the GPIO pin in SysCon block */
Chip_SYSCTL_SetPinInterrupt(GPIO_PININT_INDEX, GPIO_PININT_PORT, GPIO_PININT_PIN);

Chip_SYSCTL_EnableStartPin(0);

 

/* Configure channel interrupt as edge sensitive and falling edge interrupt */
Chip_PININT_ClearIntStatus(LPC_PININT, PININTCH(GPIO_PININT_INDEX));
Chip_PININT_SetPinModeEdge(LPC_PININT, PININTCH(GPIO_PININT_INDEX));
Chip_PININT_EnableIntLow(LPC_PININT, PININTCH(GPIO_PININT_INDEX));

 

/* Enable interrupt in the NVIC */
NVIC_ClearPendingIRQ(PIN_INT0_IRQn);
NVIC_EnableIRQ(PIN_INT0_IRQn);

 

Board_LED_Set(0, 1);
for (i = 0; i < 4000000; i++);
for (i = 0; i < 4000000; i++);
for (i = 0; i < 4000000; i++);
Board_LED_Set(0, 0);

 

num = 1; //Select sleep mode 0:sleep 1:deep sleep

 

/* Go to sleep mode - LED will toggle on each wakeup event */
while (1)
{
      //sleep LED
      Board_LED_Set(2, 1);
      for (i = 0; i < 1800000; i++);
      Board_LED_Set(2, 0);

      switch (num)
      {
         case 0:
               DEBUGOUT("sleep mode\r\n\r\n");
               for (i = 0; i < 1800000; i++);

               Chip_PMU_SleepState(LPC_PMU);

               DEBUGOUT("sleep mode-WAKEUP\r\n\r\n");
               for (i = 0; i < 1800000; i++);
              break;
        case 1:
               DEBUGOUT("Deep Sleep mode\r\n\r\n");
               for (i = 0; i < 1800000; i++);

 

               /* 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 Deep Sleep mode */
               Chip_PMU_DeepSleepState(LPC_PMU);

 

               /* Power anything back up here that isn't powered up on wakeup. The example
               code below powers back up the BOD and WDT oscillator, which weren't setup to
                power up in the Chip_SYSCTL_SetWakeup() function. */
               Chip_SYSCTL_SetDeepSleepPD(0);

 

                DEBUGOUT("Deep Sleep mode-WAKEUP\r\n\r\n");
               for (i = 0; i < 1800000; i++);

               break;
         }

      }

return 0;

}

Attachments

Outcomes