summaryrefslogtreecommitdiffstats
path: root/radiator-plc/stm32/app/ticker.c
diff options
context:
space:
mode:
authorfishsoupisgood <github@madingley.org>2020-09-09 11:53:37 +0100
committerfishsoupisgood <github@madingley.org>2020-09-09 11:53:37 +0100
commit9d87c925a9eaa4fc256be3173c14a20d1469472d (patch)
tree50d63f87a47a0eac3f5b8058850184bcd4e6ee95 /radiator-plc/stm32/app/ticker.c
parentdafd8cf2fdcdd637cc06f760d318cf8391b1a294 (diff)
downloadheating-9d87c925a9eaa4fc256be3173c14a20d1469472d.tar.gz
heating-9d87c925a9eaa4fc256be3173c14a20d1469472d.tar.bz2
heating-9d87c925a9eaa4fc256be3173c14a20d1469472d.zip
everything, mostly, working
Diffstat (limited to 'radiator-plc/stm32/app/ticker.c')
-rw-r--r--radiator-plc/stm32/app/ticker.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/radiator-plc/stm32/app/ticker.c b/radiator-plc/stm32/app/ticker.c
new file mode 100644
index 0000000..bb346fb
--- /dev/null
+++ b/radiator-plc/stm32/app/ticker.c
@@ -0,0 +1,97 @@
+#include "project.h"
+
+static volatile uint32_t delay_ms_count;
+volatile uint32_t ticks;
+static volatile int tick_ready;
+
+uint32_t clock_scale = 72;
+
+void
+delay_us (uint32_t d)
+{
+ d *= clock_scale;
+
+ while (d--)
+ __asm__ ("nop");
+}
+
+
+
+void
+sys_tick_handler (void)
+{
+ static unsigned slow = 0;
+ static unsigned medium = 0;
+
+ if (delay_ms_count)
+ delay_ms_count--;
+
+ ticks++;
+
+ if (!tick_ready)
+ return;
+
+ //buttons_ticker();
+ //
+ led_tick();
+ usart_ticker();
+
+
+ medium++;
+
+ if (medium < 1000) return;
+
+ medium = 0;
+
+ //target_tick();
+
+ slow++;
+
+ if (slow < 2) return;
+ logic_tick();
+
+
+}
+
+
+
+void
+delay_ms (uint32_t d)
+{
+ delay_ms_count = d;
+
+ while (delay_ms_count);
+}
+
+
+void
+ticker_init (void)
+{
+ uint32_t v, w;
+
+ /*Start periodic timer */
+ systick_set_clocksource (STK_CSR_CLKSOURCE_AHB_DIV8);
+ /* 72MHz / 8 = > 9Mhz */
+ systick_set_reload (9000);
+ /* 9MHz / 9000 => 1kHz */
+ systick_interrupt_enable();
+ systick_counter_enable();
+
+ do {
+ clock_scale--;
+ v = ticks;
+
+ while (v == ticks);
+
+ delay_us (1000);
+ w = ticks;
+ v++;
+ w -= v;
+ } while (w);
+
+
+ tick_ready = 1;
+
+ SCS_DEMCR |= SCS_DEMCR_TRCENA;
+ SCS_DWT_CTRL |= SCS_DWT_CTRL_CYCCNTENA;
+}