GPIO wakeup from deep sleep mode
Posted: Thu Nov 03, 2016 12:53 pm
Hi,
I'm designing a battery powered application using the ESP32. For this I need to put the ESP32 in deep sleep mode for most of the time, and only wake on a timer event or if one of multiple GPIO lines go high.
Unfortunately I'm having a bit of trouble getting the ESP32 to wakeup from deep sleep by a GPIO event.
I configured RTC_GPIO7 to be in input mode and setup both EXT_WAKEUP0 and EXT_WAKEUP1 to trigger on this GPIO pin. I verified that the GPIO is indeed working as input, by reading RTC_GPIO_IN_REG. Also when I trigger the GPIO when in deep sleep mode this is recorded in the RTC_GPIO_STATUS_REG register. However the chip doesn't wake up from deep sleep, only by the timer. The RTC_CNTL_EXT_WAKEUP1_STATUS_REG also doesn't pick up the event, It only detects it when I constantly trigger the GPIO pin during system start.
Any suggestions on which register I need to configure to make this work?
My current register configuration:
I'm designing a battery powered application using the ESP32. For this I need to put the ESP32 in deep sleep mode for most of the time, and only wake on a timer event or if one of multiple GPIO lines go high.
Unfortunately I'm having a bit of trouble getting the ESP32 to wakeup from deep sleep by a GPIO event.
I configured RTC_GPIO7 to be in input mode and setup both EXT_WAKEUP0 and EXT_WAKEUP1 to trigger on this GPIO pin. I verified that the GPIO is indeed working as input, by reading RTC_GPIO_IN_REG. Also when I trigger the GPIO when in deep sleep mode this is recorded in the RTC_GPIO_STATUS_REG register. However the chip doesn't wake up from deep sleep, only by the timer. The RTC_CNTL_EXT_WAKEUP1_STATUS_REG also doesn't pick up the event, It only detects it when I constantly trigger the GPIO pin during system start.
Any suggestions on which register I need to configure to make this work?
My current register configuration:
Code: Select all
// Configure RTC GPIO wakeup input
REG_SET_BIT(RTC_IO_PAD_DAC2_REG, RTC_IO_PDAC2_MUX_SEL); // route GPIO26 to the Digital I/O block
REG_SET_BIT(RTC_IO_PAD_DAC2_REG, RTC_IO_PDAC2_FUN_IE); // Enable RTC_GPIO7 Input
REG_SET_BIT(RTC_IO_PAD_DAC2_REG, RTC_IO_PDAC2_SLP_SEL); // Enable Sleep status selection(per RTC_IO_PDAC2_SLP_xE)
REG_SET_BIT(RTC_IO_PAD_DAC2_REG, RTC_IO_PDAC2_SLP_IE); // Set pin as input in sleep mode
REG_SET_BIT(RTC_GPIO_PIN7_REG, RTC_GPIO_PIN7_WAKEUP_ENABLE); // Enable RTC_GPIO7 wake-up (for light sleep only?)
REG_SET_FIELD(RTC_GPIO_PIN7_REG, RTC_GPIO_PIN7_INT_TYPE, 3); // Make RTC_GPIO7 interrupt edge triggered, any edge
REG_SET_BIT(RTC_CNTL_EXT_WAKEUP_CONF_REG, RTC_CNTL_EXT_WAKEUP1_LV | RTC_CNTL_EXT_WAKEUP0_LV); // Set WAKEUP0 and WAKEUP1 to trigger on a high signal level
REG_SET_FIELD(RTC_IO_EXT_WAKEUP0_REG, RTC_IO_EXT_WAKEUP0_SEL, 7); // Select RTC_GPIO7 as WAKEUP0 input source
REG_SET_BIT(RTC_CNTL_WAKEUP_STATE_REG, RTC_CNTL_GPIO_WAKEUP_FILTER); // GPIO wakeup filtering????
REG_SET_FIELD(RTC_CNTL_WAKEUP_STATE_REG, RTC_CNTL_WAKEUP_ENA, RTC_CNTL_WAKEUP_ENA); // Just enable all
REG_SET_FIELD(RTC_CNTL_EXT_WAKEUP1_REG, RTC_CNTL_EXT_WAKEUP1_SEL, RTC_CNTL_EXT_WAKEUP1_SEL); // Enable all GPIO's as WAKEUP1 input source
//REG_SET_BIT(RTC_CNTL_INT_ENA_REG, RTC_CNTL_SLP_WAKEUP_INT_ENA);