diff options
author | Birte Kristina Friesel <birte.friesel@uos.de> | 2024-02-08 13:46:48 +0100 |
---|---|---|
committer | Birte Kristina Friesel <birte.friesel@uos.de> | 2024-02-08 13:46:48 +0100 |
commit | ec871ef8ae230bcb779c8535c3c4526817fd5d93 (patch) | |
tree | 558e731639f7ece070d7abd14c3c82afa11f9647 /include/arch/stm32f746zg-nucleo/driver | |
parent | 18db600341bcf1c21e4282515d458b898639f349 (diff) |
Add preliminary STM32F746ZG-Nucleo support
Diffstat (limited to 'include/arch/stm32f746zg-nucleo/driver')
-rw-r--r-- | include/arch/stm32f746zg-nucleo/driver/counter.h | 40 | ||||
-rw-r--r-- | include/arch/stm32f746zg-nucleo/driver/gpio.h | 134 | ||||
-rw-r--r-- | include/arch/stm32f746zg-nucleo/driver/stdout.h | 24 | ||||
-rw-r--r-- | include/arch/stm32f746zg-nucleo/driver/uptime.h | 32 |
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 ©); + + 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 ©); + + 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 ©); + + 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 ©); +#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 |