static void timers_init(void) { /* TIM2 is a 32-bit free running counter with 1Mhz frequency */ STM32_TIM_CR2(2) = 0x0000; STM32_TIM32_ARR(2) = 0xFFFFFFFF; STM32_TIM32_CNT(2) = 0; STM32_TIM_PSC(2) = CPU_CLOCK / 1000000 - 1; STM32_TIM_EGR(2) = 0x0001; /* Reload the pre-scaler */ STM32_TIM_CR1(2) = 1; STM32_TIM_DIER(2) = 0; task_enable_irq(STM32_IRQ_TIM2); }
void tim2_interrupt(void) { uint32_t stat = STM32_TIM_SR(2); if (stat & 2) { /* Event match */ /* disable match interrupt but keep update interrupt */ STM32_TIM_DIER(2) = 1; last_event = TASK_EVENT_TIMER; } if (stat & 1) /* Counter overflow */ clksrc_high++; STM32_TIM_SR(2) = ~stat & 3; /* clear interrupt flags */ task_clear_pending_irq(STM32_IRQ_TIM2); }