sd_power_system_off() interfere with GPIOTE port interrupts [closed]

mindaugast gravatar image

asked 2017-09-13 14:01:35 +0100

I am using NRF52 SDK14.0 and SoftDevice S132 v5.0.0. I am using GPIOTE low level port interrupt to wake the system from SysOff mode. If SoftDevice is enabled and I put the system to SysOff by calling NRF_POWER->SYSTEMOFF = POWER_SYSTEMOFF_SYSTEMOFF_Enter; port interrupt (button press) wakes the system as expected. But if I am trying to use sd_power_system_off() function instead, the system goes to SysOff and is never woken again by the port interrupt. Could something inside sd_power_system_off() interfere with GPIOTE interrupt settings?

edit retag flag offensive reopen delete report spam

Closed as "the question is answered, right answer was accepted" by Mindaugas Tinteris at 2017-09-18 08:31:04 +0100


3 answers

Sort by » oldest newest most voted
mindaugast gravatar image

answered 2017-09-14 16:08:33 +0100

updated 2017-09-15 14:35:31 +0100

By making #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 in FreeRTOSConfig.h now sd_power_system_off() works fine, but I am not sure if it's the right option.

edit flag offensive delete publish link more
sigurdon gravatar image

answered 2017-09-15 13:34:22 +0100

mindaugast gravatar image

updated 2017-09-15 14:34:50 +0100


If you want to use sd_ function calls within the FreeRTOS context, then setting it to 5 is the correct option. See this figure here.

edit flag offensive delete publish link more
sigurdon gravatar image

answered 2017-09-14 12:55:20 +0100


When in System OFF mode, the device can be woken up through one of the following signals:

  1. The DETECT signal, optionally generated by the GPIO peripheral
  2. The ANADETECT signal, optionally generated by the LPCOMP module
  3. The SENSE signal, optionally generated by the NFC module to “wake-on-field”
  4. A reset

GPIOTE will not wake the processor up from SYSTEM OFF, the sense mechanism in the GPIO peripheral will. If you enable the sense mechanism, a DETECT signal will be generated if the correct sense is detected on one of the pins.

Try to configure the pin you want to use to wake the chip up like this:


Also note that when the SoftDevice is enabled, the POWER register is restricted, and should not be accessed directly. When the SoftDevice is enabled, you should therefore only use the sd_power_system_off() function to go to sleep.

edit flag offensive delete publish link more


Please, read my post original carefully. I do use Sense functionality, and it is working fine unless I use sd_power_system_off(). I am aware of the issue that I should not access POWER register directly when using SoftDevice, that's why I am asking this question. I use this code to setup a pin:

nrf_drv_gpiote_in_config_t in_config_button = GPIOTE_CONFIG_IN_SENSE_HITOLO(false);
in_config_button.pull = NRF_GPIO_PIN_PULLUP;
err_code = nrf_drv_gpiote_in_init(GPIO_BUTTON_MAIN, &in_config_button, ButtonInterruptHandler);
nrf_drv_gpiote_in_event_enable(GPIO_BUTTON_MAIN, true);

I'll repeat myself. The system wakes up if going to SysOff by using POWER reg. This doesn't work only if I use sd_power_system_off().

Mindaugas Tinteris ( 2017-09-14 14:34:29 +0100 )editconvert to answer

I just tested the code you provided, and it worked fine to exit sleep mode with it. The sd_power_system_off() does not interfere with any GPIOTE interrupt settings.

What pin is GPIO_BUTTON_MAIN ? Could you debug/print the GPIO configuration register value of the pin you use, and see if it's correctly configured before you enter system off?

The NRF_P0->PIN_CNF[GPIO_BUTTON_MAIN] should be 0x0003000C if configured correctly.

Sigurd ( 2017-09-14 15:10:34 +0100 )editconvert to answer

GPIO_BUTTON_MAIN is 20. Yes I checked, NRF_P0->PIN_CNF[GPIO_BUTTON_MAIN] is indeed 0x0003000C. I'll add one important thing to the whole story: I call sd_power_system_off() from FreeRTOS idle task hook. Afte looking more carefully I discovered, that system goes to Hard Fault Handler after calling sd_power_system_off() and it seems to me that I can find the answer to this here. Now it's only unclear, how to change IDLE task interrupt priority level in FreeRTOS. Any hints would be appreciated.

Mindaugas Tinteris ( 2017-09-14 15:50:06 +0100 )editconvert to answer

User menu

    or sign up

Recent questions

Question Tools

1 follower


Asked: 2017-09-13 14:01:35 +0100

Seen: 208 times

Last updated: sep. 14 '17