App_timer interrupt doesn't wake the processor from System ON sleep

Hi everyone. Here is my code for 2 different timers that put uc to sleep and wake it up(supposedly)

Definitions:

APP_TIMER_DEF(app_timer_uc); 
APP_TIMER_DEF(app_timer_lcd);

Create Timers:

static void create_uc_timer()
{
    ret_code_t err_code;

    // Create timers
    err_code = app_timer_create(&app_timer_uc,
                                APP_TIMER_MODE_REPEATED,
                                uc_wake_handler);
    APP_ERROR_CHECK(err_code);
}

static void create_lcd_timer()
{
    ret_code_t err_code;

    // Create timers
    err_code = app_timer_create(&app_timer_lcd,
                                APP_TIMER_MODE_SINGLE_SHOT,
                                lcd_wake_handler);
    APP_ERROR_CHECK(err_code);
}

Handlers:

static void uc_wake_handler(void * p_context)
{
		uint32_t err_code;
    nrf_drv_gpiote_out_toggle(LED_1);
		err_code = app_timer_start(app_timer_lcd, APP_TIMER_TICKS(2000), NULL);
    APP_ERROR_CHECK(err_code);
		sleep_Uc();
		
}

static void lcd_wake_handler(void * p_context)
{
    nrf_drv_gpiote_out_toggle(LED_2);
}

Main() function calls:

        create_uc_timer();
		create_lcd_timer();
	
		err_code = app_timer_start(app_timer_uc, APP_TIMER_TICKS(1000), NULL);
        APP_ERROR_CHECK(err_code);

sleep_Uc() function:

static void sleep_Uc(){
	
		
    __SEV();
	__WFE();
    __WFE();
	
}

the code works fine when there is no sleep_Uc(); function. But when it is used, LED_1 toggle from low to high and uC goes to sleep. But the timer for lcd doesn't wake the processor. Additionally, when app_timer IRQ priority higher then GPIOTE IRQ priority, GPIOTE interrupts doesnt wake the uC either.

At the moment, IRQ_Priority of app_timer is 3, IRQ_Priority of GPIOTE is 2. When an GPIOTE interrupt occurs, uC wakes and goes to sleep immediatelly due to queued interrupts of app_timer i guess. How can i make the system wake with app_timer interrupts ?

Related