summaryrefslogtreecommitdiffstats
path: root/radiator-plc/stm32/app/outputs.c
diff options
context:
space:
mode:
Diffstat (limited to 'radiator-plc/stm32/app/outputs.c')
-rw-r--r--radiator-plc/stm32/app/outputs.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/radiator-plc/stm32/app/outputs.c b/radiator-plc/stm32/app/outputs.c
new file mode 100644
index 0000000..67d0519
--- /dev/null
+++ b/radiator-plc/stm32/app/outputs.c
@@ -0,0 +1,47 @@
+#include "project.h"
+
+#define N_OUTPUTS 8
+
+static const uint32_t output_bank[N_OUTPUTS] = { GPIOC, GPIOA, GPIOA, GPIOA, GPIOD, GPIOD, GPIOD, GPIOD};
+static const uint32_t output[N_OUTPUTS] = { GPIO9, GPIO8, GPIO11, GPIO12, GPIO0, GPIO1, GPIO2, GPIO3};
+
+void output_set (unsigned r)
+{
+ if (r >= N_OUTPUTS) return;
+
+ gpio_set (output_bank[r], output[r]);
+}
+
+void output_clear (unsigned r)
+{
+ if (r >= N_OUTPUTS) return;
+
+ gpio_clear (output_bank[r], output[r]);
+}
+
+void outputs_set (unsigned v)
+{
+ unsigned r;
+
+ for (r = 0; r < N_OUTPUTS; r++, v >>= 1) {
+ if (v & 1) output_set (r);
+ else output_clear (r);
+ }
+}
+
+void output_write (unsigned r, unsigned v)
+{
+ if (v) output_set (r);
+ else output_clear (r);
+}
+
+
+
+void outputs_init (void)
+{
+ unsigned r;
+
+ for (r = 0; r < N_OUTPUTS; ++r)
+ gpio_set_mode (output_bank[r], GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, output[r]);
+
+}