void TIMER1_IRQHandler(void) { if ((US_TICKER_TIMER->EVENTS_COMPARE[1] != 0) && ((US_TICKER_TIMER->INTENSET & TIMER_INTENSET_COMPARE1_Msk) != 0)) { US_TICKER_TIMER->EVENTS_COMPARE[1] = 0; overflow++; US_TICKER_TIMER->CC[1] = 0xFFFF; if (timeStamp>0) { timeStamp--; if (timeStamp==0) { us_ticker_clear_interrupt(); us_ticker_disable_interrupt(); us_ticker_irq_handler(); return; } } } if ((US_TICKER_TIMER->EVENTS_COMPARE[0] != 0) && ((US_TICKER_TIMER->INTENSET & TIMER_INTENSET_COMPARE0_Msk) != 0)) { us_ticker_clear_interrupt(); us_ticker_disable_interrupt(); if (timeStamp==0) { us_ticker_irq_handler(); } } }
void us_ticker_set_interrupt(timestamp_t timestamp) { /* Clear any previously pending interrupts */ us_ticker_clear_interrupt(); NVIC_ClearPendingIRQ(TIMER_MODINIT.irq_n); /* In continuous mode, counter will be reset to zero with the following sequence: * 1. Stop counting * 2. Configure new CMP value * 3. Restart counting * * This behavior is not what we want. To fix it, we could configure new CMP value * without stopping counting first. */ TIMER_T *timer_base = (TIMER_T *) NU_MODBASE(TIMER_MODINIT.modname); /* NOTE: Because H/W timer requests min compare value, our implementation would have alarm delay of * (TMR_CMP_MIN - interval_clk) clocks when interval_clk is between [1, TMR_CMP_MIN). */ uint32_t cmp_timer = timestamp * NU_TMRCLK_PER_TICK; cmp_timer = NU_CLAMP(cmp_timer, TMR_CMP_MIN, TMR_CMP_MAX); timer_base->CMP = cmp_timer; /* We can call ticker_irq_handler now. */ NVIC_EnableIRQ(TIMER_MODINIT.irq_n); }
void irq_handler(void) { us_ticker_clear_interrupt(); /* Go through all the pending TimerEvents */ while (1) { if (head == NULL) { // There are no more TimerEvents left, so disable matches. us_ticker_disable_interrupt(); return; } if ((int)(head->timestamp - us_ticker_read()) <= 0) { // This event was in the past: // point to the following one and execute its handler ticker_event_t *p = head; head = head->next; event_handler(p->id); // NOTE: the handler can set new events } else { // This event and the following ones in the list are in the future: // set it as next interrupt and return us_ticker_set_interrupt(head->timestamp); return; } } }
void us_ticker_irq_handler(void) { us_ticker_clear_interrupt(); /* Go through all the pending TimerEvents */ while (1) { if (head == NULL) { // There are no more TimerEvents left, so disable matches. us_ticker_disable_interrupt(); return; } if ((int)(head->timestamp - us_ticker_read()) <= 0) { // This event was in the past: // point to the following one and execute its handler ticker_event_t *p = head; head = head->next; if (event_handler != NULL) { event_handler(p->id); // NOTE: the handler can set new events } /* Note: We continue back to examining the head because calling the * event handler may have altered the chain of pending events. */ } else { // This event and the following ones in the list are in the future: // set it as next interrupt and return us_ticker_set_interrupt(head->timestamp); return; } } }
static void tmr0_vec(void) { us_ticker_clear_interrupt(); // NOTE: us_ticker_set_interrupt() may get called in us_ticker_irq_handler(); us_ticker_irq_handler(); }
void TMR0_IRQHandler(void) { us_ticker_clear_interrupt(); // NOTE: us_ticker_set_interrupt() may get called in us_ticker_irq_handler(); us_ticker_irq_handler(); }