armcm_timer: Support micro-controllers faster than 160Mhz

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2019-07-24 01:03:23 -04:00
parent 4e5ddff00b
commit 79bd13dba7
1 changed files with 22 additions and 0 deletions

View File

@ -68,6 +68,25 @@ udelay(uint32_t usecs)
; ;
} }
// On fast cpus, schedule a recurring timer so SysTick doesn't overflow
static uint_fast8_t
timer_wrap_event(struct timer *t)
{
t->waketime += 0xffffff;
return SF_RESCHEDULE;
}
static struct timer wrap_timer = {
.func = timer_wrap_event,
.waketime = 0xffffff,
};
void
timer_reset(void)
{
if (CONFIG_CLOCK_FREQ > 0xffffff * 10)
sched_add_timer(&wrap_timer);
}
DECL_SHUTDOWN(timer_reset);
void void
timer_init(void) timer_init(void)
{ {
@ -76,6 +95,9 @@ timer_init(void)
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
DWT->CYCCNT = 0; DWT->CYCCNT = 0;
// Schedule a recurring timer on fast cpus
timer_reset();
// Enable SysTick // Enable SysTick
irqstatus_t flag = irq_save(); irqstatus_t flag = irq_save();
NVIC_SetPriority(SysTick_IRQn, 2); NVIC_SetPriority(SysTick_IRQn, 2);