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

Timers interrupt lagging on nRF5340

Hi All!

I have a problem which i can't really understood. I'm using nRF5340-DK evaluation board, and currently i'm trying to get one of timer (TIMER1 in this example) to have a tick every 1s.

I want to have it done via NRF(X) library, not using Zephyr. Here's my code:

Z_ISR_DECLARE( TIMER1_IRQn, 0, nrfx_timer_1_irq_handler, NULL );

void timerEventHandler( nrf_timer_event_t event_type, void *p_context )
{
    printk("Timer called");
}

nrfx_timer_config_t initCfg = {
            .frequency          = NRF_TIMER_FREQ_16MHz,
            .mode               = NRF_TIMER_MODE_TIMER,
            .bit_width          = TIMER_BITMODE_BITMODE_32Bit,
            .interrupt_priority = 1,
            .p_context          = NULL
        };
z_arm_irq_priority_set( TIMER1_IRQn, 1, 0 );
nrfx_timer_init( NRFX_TIMER_INSTANCE( 1 ), &initCfg, timerEventHandler );
uint32_t maxVal = nrfx_timer_us_to_ticks( NRFX_TIMER_INSTANCE( 1 ), 1000000 );
nrfx_timer_extended_compare( NRFX_TIMER_INSTANCE( 1 ), NRF_TIMER_CC_CHANNEL0, maxVal, NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, true );
nrfx_timer_enable( NRFX_TIMER_INSTANCE( 1 ) );

Now the problem is, that in most situations it is working fine. However, after some time (ex. 20 seconds), i observe the lag on UART console, meaning that timer has been called not a second ago prior to last call, but about 2-3 seconds.

Can't really get what could be reason?

I have also another issue facing timers. If i add infinite while loop like this into main:

while(1)
{
    uart_irq_rx_disable( device);
    checkFlag = !checkFlag;
    uart_irq_rx_enabe( device );
}

Then it appears that uart_irq_rx_disable also disables timer interrupt. When i do frequently rx_disable, then timer interrupt is lagging even more.

Can't really understood why disabling UART interrupt also disables Timer interrupt?

Thank you for any help!

Parents
Reply
  • Hi 

    I don't have any issues running your code, but I made one change to store the instance to a variable:

    nrfx_timer_t my_timer = NRFX_TIMER_INSTANCE(1);
    And then I just refer to this in the later calls:
    nrfx_timer_init(&my_timer, &initCfg, timerEventHandler);
    But if it works some times but not others I doubt this is the reason for the issue. 
    What happens if you toggle a LED instead of writing to the UART? 
    Is the problem still the same?

    Then it appears that uart_irq_rx_disable also disables timer interrupt. When i do frequently rx_disable, then timer interrupt is lagging even more.

    Can't really understood why disabling UART interrupt also disables Timer interrupt?

    Could this be because the UART gets delayed rather than the interrupt?

    What if you add a small delay after each time you disable and re-enable the uart RX?

    k_msleep(1);

    Best regards
    Torbjørn

Children
Related