summaryrefslogtreecommitdiff
path: root/include/arch/stm32f746zg-nucleo/driver
diff options
context:
space:
mode:
authorBirte Kristina Friesel <birte.friesel@uos.de>2024-02-08 13:46:48 +0100
committerBirte Kristina Friesel <birte.friesel@uos.de>2024-02-08 13:46:48 +0100
commitec871ef8ae230bcb779c8535c3c4526817fd5d93 (patch)
tree558e731639f7ece070d7abd14c3c82afa11f9647 /include/arch/stm32f746zg-nucleo/driver
parent18db600341bcf1c21e4282515d458b898639f349 (diff)
Add preliminary STM32F746ZG-Nucleo support
Diffstat (limited to 'include/arch/stm32f746zg-nucleo/driver')
-rw-r--r--include/arch/stm32f746zg-nucleo/driver/counter.h40
-rw-r--r--include/arch/stm32f746zg-nucleo/driver/gpio.h134
-rw-r--r--include/arch/stm32f746zg-nucleo/driver/stdout.h24
-rw-r--r--include/arch/stm32f746zg-nucleo/driver/uptime.h32
4 files changed, 230 insertions, 0 deletions
diff --git a/include/arch/stm32f746zg-nucleo/driver/counter.h b/include/arch/stm32f746zg-nucleo/driver/counter.h
new file mode 100644
index 0000000..ef993bd
--- /dev/null
+++ b/include/arch/stm32f746zg-nucleo/driver/counter.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2024 Birte Kristina Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+#ifndef COUNTER_H
+#define COUNTER_H
+
+#include <libopencm3/stm32/timer.h>
+
+#include "arch.h"
+
+typedef uint32_t counter_value_t;
+typedef uint32_t counter_overflow_t;
+
+class Counter {
+ private:
+ Counter(const Counter &copy);
+
+ public:
+ counter_value_t value;
+ volatile counter_overflow_t overflow;
+
+ Counter() : overflow(0) {}
+
+ inline void start() {
+ overflow = 0;
+ timer_set_counter(TIM2, 0);
+ timer_enable_counter(TIM2);
+ }
+
+ inline void stop() {
+ timer_disable_counter(TIM2);
+ value = timer_get_counter(TIM2);
+ }
+};
+
+extern Counter counter;
+
+#endif
diff --git a/include/arch/stm32f746zg-nucleo/driver/gpio.h b/include/arch/stm32f746zg-nucleo/driver/gpio.h
new file mode 100644
index 0000000..9eb81c0
--- /dev/null
+++ b/include/arch/stm32f746zg-nucleo/driver/gpio.h
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2024 Birte Kristina Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+#ifndef GPIO_H
+#define GPIO_H
+
+#include <libopencm3/stm32/rcc.h>
+#include <libopencm3/stm32/gpio.h>
+
+class GPIO {
+ private:
+ GPIO(const GPIO &copy);
+
+ public:
+ GPIO () {}
+
+ enum Pin : unsigned char {
+ pa0 = 0, pa1, pa2, pa3, pa4, pa5, pa6, pa7,
+ pa8, pa9, pa10, pa11, pa12, pa13, pa14, pa15,
+ pb0, pb1, pb2, pb3, pb4, pb5, pb6, pb7,
+ pb8, pb9, pb10, pb11, pb12, pb13, pb14, pb15,
+ pc0, pc1, pc2, pc3, pc4, pc5, pc6, pc7,
+ pc8, pc9, pc10, pc11, pc12, pc13, pc14, pc15,
+ pd0, pd1, pd2, pd3, pd4, pd5, pd6, pd7,
+ pd8, pd9, pd10, pd11, pd12, pd13, pd14, pd15,
+ pe0, pe1, pe2, pe3, pe4, pe5, pe6, pe7,
+ pe8, pe9, pe10, pe11, pe12, pe13, pe14, pe15,
+ pf0, pf1, pf2, pf3, pf4, pf5, pf6, pf7,
+ pf8, pf9, pf10, pf11, pf12, pf13, pf14, pf15,
+ pg0, pg1, pg2, pg3, pg4, pg5, pg6, pg7,
+ pg8, pg9, pg10, pg11, pg12, pg13, pg14, pg15,
+ ph0, ph1, ph2, ph3, ph4, ph5, ph6, ph7,
+ ph8, ph9, ph10, ph11, ph12, ph13, ph14, ph15,
+ PIN_INVALID
+ };
+
+ inline void setup() {
+ rcc_periph_clock_enable(RCC_GPIOA);
+ rcc_periph_clock_enable(RCC_GPIOB);
+ rcc_periph_clock_enable(RCC_GPIOC);
+ rcc_periph_clock_enable(RCC_GPIOD);
+
+ // Set LEDs as output
+ gpio_mode_setup(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO0);
+ gpio_mode_setup(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO7);
+ gpio_mode_setup(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO14);
+ }
+ inline void led_on(unsigned char id = 0) {
+ if (id == 2) {
+ gpio_set(GPIOB, GPIO0);
+ } else if (id == 1) {
+ gpio_set(GPIOB, GPIO7);
+ } else {
+ gpio_set(GPIOB, GPIO14);
+ }
+ }
+ inline void led_off(unsigned char id = 0) {
+ if (id == 2) {
+ gpio_clear(GPIOB, GPIO0);
+ } else if (id == 1) {
+ gpio_clear(GPIOB, GPIO7);
+ } else {
+ gpio_clear(GPIOB, GPIO14);
+ }
+ }
+ inline void led_toggle(unsigned char id = 0) {
+ if (id == 2) {
+ gpio_toggle(GPIOB, GPIO0);
+ } else if (id == 1) {
+ gpio_toggle(GPIOB, GPIO7);
+ } else {
+ gpio_toggle(GPIOB, GPIO14);
+ }
+ }
+ inline void input(unsigned char const pin) {
+ if (pin < pb0) {
+ gpio_mode_setup(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, 1 << pin);
+ } else if (pin < pc0) {
+ gpio_mode_setup(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_NONE, 1 << (pin - pb0));
+ } else if (pin < PIN_INVALID) {
+ gpio_mode_setup(GPIOC, GPIO_MODE_INPUT, GPIO_PUPD_NONE, 1 << (pin - pc0));
+ }
+ }
+ inline void input(unsigned char const pin, unsigned char const pull) {
+ }
+ inline void output(unsigned char const pin) {
+ if (pin < pb0) {
+ gpio_mode_setup(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, 1 << pin);
+ } else if (pin < pc0) {
+ gpio_mode_setup(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, 1 << (pin - pb0));
+ } else if (pin < PIN_INVALID) {
+ gpio_mode_setup(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, 1 << (pin - pc0));
+ }
+ }
+ /*
+ inline void output(unsigned char const pin, unsigned char const value) {
+ }*/
+ inline unsigned int read(unsigned char const pin) {
+ if (pin < pb0) {
+ return gpio_get(GPIOA, 1 << pin);
+ } else if (pin < pc0) {
+ return gpio_get(GPIOB, 1 << (pin-pb0));
+ } else if (pin < PIN_INVALID) {
+ return gpio_get(GPIOC, 1 << (pin-pc0));
+ }
+ }
+ inline void write(unsigned char const pin, unsigned char value) {
+ if (pin < pb0) {
+ if (value) {
+ gpio_port_write(GPIOA, gpio_port_read(GPIOA) | (1 << pin));
+ } else {
+ gpio_port_write(GPIOA, gpio_port_read(GPIOA) & ~(1 << pin));
+ }
+ } else if (pin < pc0) {
+ if (value) {
+ gpio_port_write(GPIOB, gpio_port_read(GPIOB) | (1 << (pin-pb0)));
+ } else {
+ gpio_port_write(GPIOB, gpio_port_read(GPIOB) & ~(1 << (pin-pb0)));
+ }
+ } else if (pin < PIN_INVALID) {
+ if (value) {
+ gpio_port_write(GPIOC, gpio_port_read(GPIOC) | (1 << (pin-pc0)));
+ } else {
+ gpio_port_write(GPIOC, gpio_port_read(GPIOC) & ~(1 << (pin-pc0)));
+ }
+ }
+ }
+};
+
+extern GPIO gpio;
+
+#endif
diff --git a/include/arch/stm32f746zg-nucleo/driver/stdout.h b/include/arch/stm32f746zg-nucleo/driver/stdout.h
new file mode 100644
index 0000000..fa04e1b
--- /dev/null
+++ b/include/arch/stm32f746zg-nucleo/driver/stdout.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2024 Birte Kristina Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+#ifndef STANDARDOUTPUT_H
+#define STANDARDOUTPUT_H
+
+#include "object/outputstream.h"
+
+class StandardOutput : public OutputStream {
+ private:
+ StandardOutput(const StandardOutput &copy);
+
+ public:
+ StandardOutput () {}
+ void setup();
+
+ virtual void put(char c) override;
+};
+
+extern StandardOutput kout;
+
+#endif
diff --git a/include/arch/stm32f746zg-nucleo/driver/uptime.h b/include/arch/stm32f746zg-nucleo/driver/uptime.h
new file mode 100644
index 0000000..cae3424
--- /dev/null
+++ b/include/arch/stm32f746zg-nucleo/driver/uptime.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2024 Birte Kristina Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+#ifndef UPTIME_H
+#define UPTIME_H
+
+#include <stdint.h>
+
+class Uptime {
+ private:
+ Uptime(const Uptime &copy);
+#ifdef TIMER_S
+ uint32_t seconds;
+#endif
+
+ public:
+#ifdef TIMER_S
+ Uptime () : seconds(0) {}
+#else
+ Uptime () {}
+#endif
+#ifdef TIMER_S
+ inline uint32_t get_s() { return seconds; }
+ inline void tick_s() { seconds++; }
+#endif
+};
+
+extern Uptime uptime;
+
+#endif