// Timer based on ARM Cortex-M3/M4 SysTick and DWT logic // // Copyright (C) 2017-2019 Kevin O'Connor // // This file may be distributed under the terms of the GNU GPLv3 license. #include "autoconf.h" // CONFIG_CLOCK_FREQ #include "armcm_boot.h" // DECL_ARMCM_IRQ #include "board/internal.h" // SysTick #include "board/irq.h" // irq_disable #include "board/misc.h" // timer_from_us #include "canboot.h" // timer_setup // Return the number of clock ticks for a given number of microseconds uint32_t timer_from_us(uint32_t us) { return us * (CONFIG_CLOCK_FREQ / 1000000); } // Return true if time1 is before time2. Always use this function to // compare times as regular C comparisons can fail if the counter // rolls over. uint8_t timer_is_before(uint32_t time1, uint32_t time2) { return (int32_t)(time1 - time2) < 0; } // Return the current time (in absolute clock ticks). uint32_t timer_read_time(void) { return DWT->CYCCNT; } // Initialize the timer void timer_setup(void) { CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; }