Пример #1
0
static inline void usart_rx_irq(const usart_dev *dev)    {
#ifdef ISR_PERF
        uint32_t t=stopwatch_getticks();
#endif

	/* Check on Receive Data register Not Empty interrupt */
        uint16_t sr = dev->USARTx->SR;
	if( (sr & USART_F_RXNE) && (dev->USARTx->CR1 & USART_MASK_RXNEIE) ){
#ifdef USART_SAFE_INSERT
	    /* If the buffer is full and the user defines USART_SAFE_INSERT, ignore new bytes. */
	    rb_safe_insert(dev->rxrb, (uint8_t) dev->USARTx->DR);
#else
	    /* By default, push bytes around in the ring buffer. */
	    rb_push_insert(dev->rxrb, (uint8_t)dev->USARTx->DR);
#endif

            if(dev->state->callback) {
                revo_call_handler(dev->state->callback, (uint32_t)dev); 
            }
	}

        if( sr & USART_F_ORE ){
	    (void)dev->USARTx->DR; // cleared after reading sr, dr
	}

#ifdef ISR_PERF
    t = stopwatch_getticks() - t;
    isr_time += t;
    if(t>max_isr_time) max_isr_time=t;
#endif

}
Пример #2
0
void SysTick_Handler(void)
{
    systick_uptime_millis++;

    uint8_t i;
    for(i=0; i< num_handlers; i++) {
        if(systick_handlers[i])
            revo_call_handler(systick_handlers[i], 0);
    }
}
Пример #3
0
static void dispatch_handler(dma_stream stream) {
#ifdef ISR_PERF
    t = stopwatch_getticks();
#endif
    const dma_dev * dev=DMAS[(stream>>4) & 3]; 

    Handler handler = dev->handlers[stream & 0xF];
    if (handler) {
        revo_call_handler(handler, (uint32_t)stream);
    }
    dma_clear_isr_bits(stream); /* in case handler doesn't */
#ifdef ISR_PERF
    t = stopwatch_getticks() - t;
    isr_time += t;
    if(t>max_isr_time) max_isr_time=t;
#endif
}