nrfx timer multiple compare interrupts enabled

NCS 2.9.1 - NRF5340DK

I am trying to use multiple compare channels on Timer1 (output_timer) such that an interrupt handler fires for both compare values, the second of which is enabled with the compare_extend shortcut such that it clears the timer. My app_timer_init function also inits Timer0 (timer_inst). 

static void output_timer_handler(nrf_timer_event_t event_type, void * p_context)
{
    switch(event_type)
    {
        case NRF_TIMER_EVENT_COMPARE1://3 or 1us - timer doesn't stop
            //Drive data pin low
            NRF_P1->OUTCLR  = (1UL << (POLL_PIN - 32));

            break;
        case NRF_TIMER_EVENT_COMPARE0://4us - timer clears
            // Set the next compare value on CC1
            // Drive data pin high
            NRF_P1->OUTSET  = (1UL << (POLL_PIN - 32));

            break;
        default: 
            break;
    }
}

static void app_timer_init()
{
    nrfx_err_t status;
    (void)status;

    
    uint32_t base_frequency = NRF_TIMER_BASE_FREQUENCY_16MHZ;
    nrfx_timer_config_t timer_config = NRFX_TIMER_DEFAULT_CONFIG(base_frequency);
    timer_config.bit_width = NRF_TIMER_BIT_WIDTH_32;
    timer_config.p_context = "Some context";

    nrfx_timer_config_t timer_config2 = NRFX_TIMER_DEFAULT_CONFIG(base_frequency);
    timer_config2.bit_width = NRF_TIMER_BIT_WIDTH_32;

    status = nrfx_timer_init(&timer_inst, &timer_config, NULL);
    if(status != NRFX_SUCCESS)
    {
        printk("Error Timer Init No: %d\n", status);
        return;
    }
    else
        printk("Controller Response Timer Initialized\n");

    nrfx_timer_clear(&timer_inst);

    status = nrfx_timer_init(&output_timer, &timer_config2, output_timer_handler);
    if(status != NRFX_SUCCESS)
    {
        printk("Error Timer Init No: %d\n", status);
        return;
    }
    else
        printk("Poll Timer Initialized\n");

    uint32_t period_len = nrfx_timer_us_to_ticks(&output_timer, (uint32_t) 4);
    uint32_t zero_interval = nrfx_timer_us_to_ticks(&output_timer, (uint32_t) 1);

    nrfx_timer_extended_compare(&output_timer, NRF_TIMER_CC_CHANNEL0, period_len, NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, true);
    nrfx_timer_compare(&output_timer, NRF_TIMER_CC_CHANNEL1, zero_interval, true);
                                                        //                    ^ enabling this iterrupt causes no output
    
    nrfx_timer_clear(&output_timer);

}

This is how I've connected IRQ in main().

IRQ_CONNECT(NRFX_IRQ_NUMBER_GET(NRF_TIMER_INST_GET(TIMER_INST_IDX)), IRQ_PRIO_LOWEST,
                    NRFX_TIMER_INST_HANDLER_GET(TIMER_INST_IDX), 0, 0);

IRQ_CONNECT(NRFX_IRQ_NUMBER_GET(NRF_TIMER_INST_GET(OUTPUT_TIMER_IDX)), IRQ_PRIO_LOWEST,
                    NRFX_TIMER_INST_HANDLER_GET(OUTPUT_TIMER_IDX), 0, 0);

The problem arises when I enable just the second compare interrupt on the output_timer. The application compiles but does not output anything to the console. When I set the int_enable parameter in the nrfx_timer_compare() function to false, everything behaves as expected. 

Am I implementing this incorrectly?

Parents Reply Children
No Data
Related