From 00ff04fc4932fc7c3fc2f9b9074f11c189045dad Mon Sep 17 00:00:00 2001 From: Damien Date: Sat, 19 Oct 2013 14:40:54 +0100 Subject: Working SysTick, code factoring, some boot-up code. --- stm/systick.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 stm/systick.c (limited to 'stm/systick.c') diff --git a/stm/systick.c b/stm/systick.c new file mode 100644 index 000000000..172b75404 --- /dev/null +++ b/stm/systick.c @@ -0,0 +1,50 @@ +#include +#include "misc.h" +#include "systick.h" + +volatile uint32_t sys_tick_counter; + +void sys_tick_init() { + // sys-tick interrupt called at 1ms intervals + sys_tick_counter = 0; + SysTick_Config(SystemCoreClock / 1000); +} + +// called on SysTick interrupt +void SysTick_Handler() { + sys_tick_counter++; +} + +void sys_tick_delay_ms(uint32_t delay_ms) { + sys_tick_wait_at_least(sys_tick_counter, delay_ms); +} + +// waits until at least delay_ms milliseconds have passed from the sampling of sys_tick_counter in stc +// handles overflow properl +// assumes stc was taken from sys_tick_counter some time before calling this function +// eg stc <= sys_tick_counter for the case of no wrap around of sys_tick_counter +void sys_tick_wait_at_least(uint32_t stc, uint32_t delay_ms) { + // stc_wait is the value of sys_tick_counter that we wait for + uint32_t stc_wait = stc + delay_ms; + if (stc_wait < stc) { + // stc_wait wrapped around + while (stc <= sys_tick_counter || sys_tick_counter < stc_wait) { + } + } else { + // stc_wait did not wrap around + while (stc <= sys_tick_counter && sys_tick_counter < stc_wait) { + } + } +} + +bool sys_tick_has_passed(uint32_t stc, uint32_t delay_ms) { + // stc_wait is the value of sys_tick_counter that we wait for + uint32_t stc_wait = stc + delay_ms; + if (stc_wait < stc) { + // stc_wait wrapped around + return !(stc <= sys_tick_counter || sys_tick_counter < stc_wait); + } else { + // stc_wait did not wrap around + return !(stc <= sys_tick_counter && sys_tick_counter < stc_wait); + } +} -- cgit v1.2.3