This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

how to wake up from IDLE mode using ppi?

Hi

I want to know how to use ppi to wake up CPU from IDLE mode.

I've tried to use timer timeout event for triggering Port Event and wake up CPU, but can't assign NRF_GPIOTE->EVENTS_PORT to ppi channel. nrf_drv_ppi_channel_assign returns NRF_ERROR_INVALID_STATE.

ret_code_t err_code = nrf_drv_timer_init(&timer1, NULL, timer_event_handler);
APP_ERROR_CHECK(err_code);
nrf_drv_timer_extended_compare(&timer1, NRF_TIMER_CC_CHANNEL0, 0xFFFFUL, NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, false);

nrf_drv_gpiote_init();

err_code = nrf_drv_ppi_init();
APP_ERROR_CHECK(err_code);

// Configure 1st available PPI channel to stop TIMER0 counter on TIMER1 COMPARE[0] match, which is every even number of seconds.
err_code = nrf_drv_ppi_channel_alloc(&ppi_channel1);
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_ppi_channel_assign(ppi_channel1,
                                      nrf_drv_timer_event_address_get(&timer1, NRF_TIMER_EVENT_COMPARE0),
                                      NRF_GPIOTE->EVENTS_PORT);
APP_ERROR_CHECK(err_code);

NRF_POWER->TASKS_CONSTLAT = 1;
nrf_drv_timer_enable(&timer1);
while (true)
{
   __WFI();

    if(LED_IS_ON(BSP_LED_0_MASK)){
        LEDS_OFF(BSP_LED_0_MASK);
    } else {
        LEDS_ON(BSP_LED_0_MASK);
    }
    NRF_GPIOTE->EVENTS_PORT = 0;
}

I don't want to configure any pin for GPIOTE, just want to use register.

Thanks!

Parents Reply
  • I made it to wake CPU using nrf_drv_timer_compare_int_enable(), but I can't make CPU sleep again.

    It seems that compare event is always true once happened. then I've used nrf_timer_event_clear to make compare event false, but cannot resolve this problem.

    how can i make CPU sleep again?

     while (true)
    {
        __WFI();
        printf("Current count\n\r");
        nrf_timer_event_clear(timer1.p_reg, nrf_timer_compare_event_get(NRF_TIMER_CC_CHANNEL0));
    }
    
Children
No Data
Related