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

nrf52832 DCDC & __WFE problem

Hi, I am editing my question:

I have seen some strange behaviuor I could not explain. In order to test it I have made the next test program: I am using the application timer module to create 2 timers: one timer of 33.3 ms in repeat mode, and another of 2 ms in single shot mode, which is triggered once inside the 33.3 ms cycle (my code is attached below). inside the 2 ms timer I put the CPU to low power mode, using __WFE.

when I work with the debugger connected, I see the expected behaviour (see Logic image:) image description

but when I run the program without the debugger connected, this is what I get (program is stack after a few cycles): image description

I have also noticed that disabling __WFE in the 2 ms loop, or disabling the dc-dc solves this issue (see Logic images)

no WFE: image description

no dc-dc: image description

this is my code:

void timers_create(void)
{
  // Initialize timer module.
  APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_MAX_TIMERS,    APP_TIMER_OP_QUEUE_SIZE, false);
  
  // Create timer for cycles (33.3 ms)
  g_err_code = app_timer_create(&m_cycle_timer_timer_id, APP_TIMER_MODE_REPEATED, cycle_timeout_handler);
  APP_ERROR_CHECK(g_err_code);
 
  // Create timer for delays
  g_err_code = app_timer_create(&m_delay_timer_id, APP_TIMER_MODE_SINGLE_SHOT, delay_timeout_handler);
  APP_ERROR_CHECK(g_err_code);
}



void cycle_timer_start(void)
{
  g_err_code = app_timer_start(m_cycle_timer_timer_id, CYCLE_INTERVAL, NULL);
  APP_ERROR_CHECK(g_err_code);
}

void main()
{
  NRF_POWER->DCDCEN = 1;  
  
  g_err_code = nrf_drv_clock_init(NULL); 
  APP_ERROR_CHECK(g_err_code);
  
  // start LFCLK
  nrf_drv_clock_lfclk_request();  
  
  timers_create();  
  
  nrf_gpio_cfg_output(25); 
  nrf_gpio_pin_clear(25);

  nrf_gpio_cfg_output(26); 
  nrf_gpio_pin_clear(26);  

  cycle_timer_start();  // 33 ms cycle
 
  while(1)
  {
    // wait for fglag
    while(!g_activate_flag)  {};
    
    nrf_gpio_pin_toggle(25);
    g_activate_flag = false;
    
    // delay timer start
    app_timer_start(m_delay_timer_id, 66, NULL);
    nrf_gpio_pin_set(26);
  
  
    while (!g_delay_ended)
    {
      // Wait for event 
      __WFE();      
    }  
  
    g_delay_ended = false;
    nrf_gpio_pin_clear(26);
  }  
}

Can someone explain this behaviour? Thanks Yaron

Parents
  • if you manually toggle gpio in the interrupt handler then while in debug mode, i think the delay is understandable. Instruction execution timings may be affected by debugger but RTC timings will not be affected.

    Instead of toggling GPIO pins in interrupt handler, use PPI and GPIOTE to toggle the pins, then you will see that RTC timings are not affected by debugger.

    This is what you can do

    RTC_EVent->PPI->GPIOTE_TASK_TOGGLE_Mode
    
Reply
  • if you manually toggle gpio in the interrupt handler then while in debug mode, i think the delay is understandable. Instruction execution timings may be affected by debugger but RTC timings will not be affected.

    Instead of toggling GPIO pins in interrupt handler, use PPI and GPIOTE to toggle the pins, then you will see that RTC timings are not affected by debugger.

    This is what you can do

    RTC_EVent->PPI->GPIOTE_TASK_TOGGLE_Mode
    
Children
No Data
Related