GPIOTE event not coming

I have enable 4 Low power events for 4 button in NRF52832 board. when i press a button board is waking up due to low power event

but when it is waiting in low power mode using sequence __sev(); __wfe(); __wfe(); events are not coming.

if i enable GPIOTE IRQ interrupt, i am getting the interrupts in low power mode but I don't want use interrupts.

main.c
#include "nrf_esb.h"

#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include "sdk_common.h"
#include "nrf.h"
#include "nrf_error.h"
#include "nrf_esb_error_codes.h"
#include "nrf_delay.h"
#include "nrf_gpio.h"
#include "boards.h"
#include "app_util.h"

#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"

#define BTN_PRESSED     0                       /**< Value of a pressed button. */
#define BTN_RELEASED    1                       /**< Value of a released button. */


static uint32_t button_state_1;
static uint32_t button_state_2;
static uint32_t button_state_3;
static uint32_t button_state_4;


uint32_t gpio_check()
{
    uint32_t err_code;
		if(NRF_GPIOTE->EVENTS_PORT)
		{
			
			NRF_LOG_INFO("NRF_GPIOTE->EVENTS_PORT %d\n",NRF_GPIOTE->EVENTS_PORT);
			NRF_LOG_PROCESS();
			NRF_GPIOTE->EVENTS_PORT = 0;
		}
		nrf_delay_ms(100);
    button_state_1 = nrf_gpio_pin_read(BUTTON_1);
    button_state_2 = nrf_gpio_pin_read(BUTTON_2);
    button_state_3 = nrf_gpio_pin_read(BUTTON_3);
    button_state_4 = nrf_gpio_pin_read(BUTTON_4);
		
    if (button_state_1 == BTN_PRESSED)
    {
        bsp_board_led_invert(0);
    }
    if (button_state_2 == BTN_PRESSED)
    {
        bsp_board_led_invert(1);
    }
    if (button_state_3 == BTN_PRESSED)
    {
        bsp_board_led_invert(2);
    }
    if (button_state_4 == BTN_PRESSED)
    {
        bsp_board_led_invert(3);
    }
      
		nrf_delay_ms(100);
    return NRF_SUCCESS;
}

#define   MY_BUTTON 			BUTTON_1
#define 	MY_LED 					LED_2
void gpio_init( void )
{
    nrf_gpio_cfg_sense_input(BUTTON_1, NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW);
    nrf_gpio_cfg_sense_input(BUTTON_2, NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW);
    nrf_gpio_cfg_sense_input(BUTTON_3, NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW);
    nrf_gpio_cfg_sense_input(BUTTON_4, NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW);

    // Workaround for PAN_028 rev1.1 anomaly 22 - System: Issues with disable System OFF mechanism
    nrf_delay_ms(1);

    bsp_board_init(BSP_INIT_LEDS);
	
		NRF_GPIOTE->EVENTS_PORT |= (1 << BUTTON_1);
  // Enable interrupt:
  //NVIC_EnableIRQ(GPIOTE_IRQn);
  //NRF_GPIOTE->INTENSET = GPIOTE_INTENSET_PORT_Set << GPIOTE_INTENSET_PORT_Pos;
}


/**@brief Function for initializing the nrf log module.
 */
static void log_init(void)
{
    ret_code_t err_code = NRF_LOG_INIT(NULL);
    APP_ERROR_CHECK(err_code);

    NRF_LOG_DEFAULT_BACKENDS_INIT();
}


int main(void)
{
    uint32_t err_code;
		log_init();
    gpio_init();

    while (true)
    {

			 // Check state of all buttons  with the button press, and toggle LED
				err_code = gpio_check();
			
#if 1
				__SEV();
				__WFE();
				__WFE();
#endif
			
    }
}
/*lint -restore */

I have attached simple test file main.c

Parents Reply
  • the same sequence is being used in all examples.

    The sev/wfe/wfe sequence saves some power when waiting for interrupt, but in case of waiting-for-event loop, you will lose an event if it comes while CPU is active.

    I forgot to mention that SEVONPEND flag should be enabled to wake up on any events, including ones disabled in NVIC:

    SCB->SCR |= SCB_SCR_SEVONPEND_Msk;

    I played with such method for bit-banging protocol some time ago and found it unreliable (sometimes device didn't wake up when it should). For button handling, I don't see any advantage over traditional interrupt-based method.

Children
Related