5b3a143ffe
The tick timer needed to be reworked because the ASF delay functions also use the SysTick timer. Now, it uses TC5 and calls out to the autoreset logic every tick. Fixes #43. Added neopixel status colors and corrected the latch time from ms to us. Fixes #42.
37 lines
1.1 KiB
C
37 lines
1.1 KiB
C
#include "autoreset.h"
|
|
|
|
#include "tick.h"
|
|
|
|
#include "asf/sam0/drivers/tc/tc_interrupt.h"
|
|
|
|
// Global millisecond tick count
|
|
volatile uint32_t ticks_ms = 0;
|
|
|
|
static struct tc_module ms_timer;
|
|
|
|
static void ms_tick(struct tc_module *const module_inst) {
|
|
// SysTick interrupt handler called when the SysTick timer reaches zero
|
|
// (every millisecond).
|
|
ticks_ms += 1;
|
|
// Keep the counter within the range of 31 bit uint values since that's the
|
|
// max value for micropython 'small' ints.
|
|
ticks_ms = ticks_ms > (0xFFFFFFFF >> 1) ? 0 : ticks_ms;
|
|
|
|
#ifdef AUTORESET_DELAY_MS
|
|
autoreset_tick();
|
|
#endif
|
|
}
|
|
|
|
void tick_init() {
|
|
struct tc_config config_tc;
|
|
tc_get_config_defaults(&config_tc);
|
|
config_tc.counter_size = TC_COUNTER_SIZE_16BIT;
|
|
config_tc.clock_prescaler = TC_CLOCK_PRESCALER_DIV1;
|
|
tc_set_top_value(&ms_timer, system_cpu_clock_get_hz() / 1000);
|
|
tc_init(&ms_timer, TC5, &config_tc);
|
|
tc_enable(&ms_timer);
|
|
tc_register_callback(&ms_timer, ms_tick, TC_CALLBACK_OVERFLOW);
|
|
tc_enable_callback(&ms_timer, TC_CALLBACK_OVERFLOW);
|
|
tc_start_counter(&ms_timer);
|
|
}
|