Issue with Timer configuring multiple channels (channel 0 and channel 1 of timer 0)

Hi,

I’m working with Timer 0 on my nRF5340 DK and trying to set up two different intervals: one at 1 second and another at 60 seconds, each on separate channels (COMPARE0 and COMPARE1). In the timer handler, the event for channel 1 (60 seconds) is not triggering, while the 1-second event is executing as expected. When initializing a single channel, everything works fine, but when both channels are initialized, the second channel (60 seconds) fails to trigger. Does anyone know the reason for this behavior?

I have attached the code snippet for the same.

static void timer_handler(nrf_timer_event_t event_type, void * p_context)
{ 
  if (event_type == NRF_TIMER_EVENT_COMPARE1) {
     LOG_INF("60 sec Interrupt");
  }
  if (event_type == NRF_TIMER_EVENT_COMPARE0){
    LOG_INF("1 sec Interrupt");
  }
}

/* Function for Timer initialization */
int led_timer_init(void) {
    nrfx_err_t status;

    #if defined(__ZEPHYR__)
    IRQ_CONNECT(NRFX_IRQ_NUMBER_GET(NRF_TIMER_INST_GET(TIM_INST_IDX)), IRQ_PRIO_LOWEST,
                NRFX_TIMER_INST_HANDLER_GET(TIM_INST_IDX), 0, 0);
    #endif

    // Configuring timer instance in timer mode with the base frequency and 32-bit width
    uint32_t base_frequency = NRF_TIMER_BASE_FREQUENCY_GET(timer_t_inst.p_reg);
    nrfx_timer_config_t config = NRFX_TIMER_DEFAULT_CONFIG(base_frequency);
    config.bit_width = NRF_TIMER_BIT_WIDTH_32;
    config.p_context = &timer_t_inst;

    status = nrfx_timer_init(&timer_t_inst, &config, timer_handler);
    if(status == NRFX_SUCCESS){
    return SEM_RET_SUCCESS;
    }
    else{
    return SEM_RET_ERROR;
    }
}

/*Function for starting the Timer*/
int led_timer_start(void) {

  // Enable the timer
  nrfx_timer_enable(&timer_t_inst);
  bool adv_timer_state = nrfx_timer_is_enabled(&timer_t_inst);
  if (adv_timer_state){

    uint32_t desired_ticks = nrfx_timer_ms_to_ticks(&timer_t_inst, TIME_TO_WAIT_60s);

    // Set compare on channel 1 to trigger an interrupt and clear the timer on compare match
    nrfx_timer_extended_compare(&timer_t_inst, NRF_TIMER_CC_CHANNEL1, desired_ticks,
                                NRF_TIMER_SHORT_COMPARE1_CLEAR_MASK, true);

       desired_ticks = nrfx_timer_ms_to_ticks(&timer_t_inst, TIME_TO_WAIT_1s);

    //Set compare on channel 0 to trigger an interrupt and clear the timer on compare match
   nrfx_timer_extended_compare(&timer_t_inst, NRF_TIMER_CC_CHANNEL0, desired_ticks,NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, true);

    return SEM_RET_SUCCESS;
  }
  else{
    return SEM_RET_ERROR;
  }
}

Related