diff --git a/library/stm32f072xb/gpio/abstract-gpio/abstract-gpio-init.hpp b/library/stm32f072xb/gpio/abstract-gpio/abstract-gpio-init.hpp index 262c5a68e2fe074d783819858db99c65b2760f29..01e45c2e04cb29ec4afdc8539545798e1b7556f6 100644 --- a/library/stm32f072xb/gpio/abstract-gpio/abstract-gpio-init.hpp +++ b/library/stm32f072xb/gpio/abstract-gpio/abstract-gpio-init.hpp @@ -1,12 +1,15 @@ #include "gpio-register.hpp" + #ifndef ABSTRACT_GPIO_INIT_H #define ABSTRACT_GPIO_INIT_H namespace stm32f072xb { struct AbstractGpioInit { - GpioPin pin; - Pupdr pullMode; + const GpioPin pin; + const Pupdr pullMode; }; + } // namespace stm32f072xb + #endif diff --git a/library/stm32f072xb/gpio/abstract-gpio/abstract-gpio.cpp b/library/stm32f072xb/gpio/abstract-gpio/abstract-gpio.cpp index 2d7746868522427f1bc1d1ecf830d53614f41a6e..75ece456a5fcae895ba27dbaf7548ef4d77b3a5b 100644 --- a/library/stm32f072xb/gpio/abstract-gpio/abstract-gpio.cpp +++ b/library/stm32f072xb/gpio/abstract-gpio/abstract-gpio.cpp @@ -1,13 +1,26 @@ #include "abstract-gpio.hpp" using namespace stm32f072xb; -AbstractGpio::AbstractGpio(GPIO_TypeDef* gpio, AbstractGpioInit gpioInit) : _gpio(gpio), _gpioInit(gpioInit) {} + +AbstractGpio::AbstractGpio(GPIO_TypeDef* gpio, const AbstractGpioInit& gpioInit) : _gpio(gpio), _gpioInit(gpioInit) {} AbstractGpio::~AbstractGpio() { CLEAR_BIT(_gpio->PUPDR, 3 << (getPin() * 2)); } -void AbstractGpio::setupRegister() { +uint8_t AbstractGpio::getPin() const { + return uint8_t(_gpioInit.pin); +} + +uint8_t AbstractGpio::getPullMode() const { + return uint8_t(_gpioInit.pullMode); +} + +GPIO_TypeDef* AbstractGpio::getGpio() const { + return _gpio; +} + +void AbstractGpio::setupRegister() const { CLEAR_BIT(_gpio->PUPDR, 3 << (getPin() * 2)); SET_BIT(_gpio->PUPDR, getPullMode() << (getPin() * 2)); } diff --git a/library/stm32f072xb/gpio/abstract-gpio/abstract-gpio.hpp b/library/stm32f072xb/gpio/abstract-gpio/abstract-gpio.hpp index 2fc9b771037afe39ff27a70fb125cde2c4876efc..6e282373418fedbd1ece9164cdd27320e5a42c64 100644 --- a/library/stm32f072xb/gpio/abstract-gpio/abstract-gpio.hpp +++ b/library/stm32f072xb/gpio/abstract-gpio/abstract-gpio.hpp @@ -5,20 +5,21 @@ #define ABSTRACT_GPIO_H namespace stm32f072xb { + class AbstractGpio { - public: - AbstractGpio(GPIO_TypeDef* gpio, AbstractGpioInit gpioInit); - GPIO_TypeDef* getGpio() { return _gpio; }; - uint8_t getPin() { return (uint8_t)_gpioInit.pin; } - uint8_t getPullMode() { return (uint8_t)_gpioInit.pullMode; } - ~AbstractGpio(); + private: + GPIO_TypeDef* _gpio; + const AbstractGpioInit _gpioInit; protected: - void setupRegister(); + void setupRegister() const; - private: - GPIO_TypeDef* _gpio; - AbstractGpioInit _gpioInit; + public: + AbstractGpio(GPIO_TypeDef* gpio, const AbstractGpioInit& gpioInit); + ~AbstractGpio(); + GPIO_TypeDef* getGpio() const; + uint8_t getPin() const; + uint8_t getPullMode() const; }; } // namespace stm32f072xb diff --git a/library/stm32f072xb/gpio/alternate-gpio/alternate-gpio-init.hpp b/library/stm32f072xb/gpio/alternate-gpio/alternate-gpio-init.hpp index 75e55648c7b5fc098eb8e006f0c6d69e9a4567a3..62fe798efd7b5fbb6c67b86ddbd07d80eec954c8 100644 --- a/library/stm32f072xb/gpio/alternate-gpio/alternate-gpio-init.hpp +++ b/library/stm32f072xb/gpio/alternate-gpio/alternate-gpio-init.hpp @@ -3,9 +3,13 @@ #ifndef ALTERNATE_GPIO_INIT_H #define ALTERNATE_GPIO_INIT_H + namespace stm32f072xb { -struct AlternateGpioInit : AbstractGpioInit { - AlternateFunction alternateFunction; + +struct AlternateGpioInit : public AbstractGpioInit { + const AlternateFunction alternateFunction; }; + } // namespace stm32f072xb + #endif diff --git a/library/stm32f072xb/gpio/alternate-gpio/alternate-gpio.hpp b/library/stm32f072xb/gpio/alternate-gpio/alternate-gpio.hpp index 0907665e881eadf5cff2ac9babb301d7e78daeb4..3bf4d1bfd19feb770b6db2f70944ec199e8226bb 100644 --- a/library/stm32f072xb/gpio/alternate-gpio/alternate-gpio.hpp +++ b/library/stm32f072xb/gpio/alternate-gpio/alternate-gpio.hpp @@ -8,23 +8,29 @@ namespace stm32f072xb { template <Port T> class AlternateGpio : public Gpio<T> { - private: public: - AlternateGpio(AlternateGpioInit gpioInit) : Gpio<T>(gpioInit) { + AlternateGpio(const AlternateGpioInit& gpioInit) : Gpio<T>(gpioInit) { CLEAR_BIT(this->getGpio()->OTYPER, 1 << (this->getPin())); CLEAR_BIT(this->getGpio()->MODER, 0x3UL << (this->getPin() * 2)); SET_BIT(this->getGpio()->MODER, 0x2UL << (this->getPin() * 2)); + uint32_t position = 0; uint8_t level = 0; - if ((int)gpioInit.pin < (int)GpioPin::P8) { + + if (int(gpioInit.pin) < (int)GpioPin::P8) { position = 4 * (int)gpioInit.pin; level = 0; - } else { + } + + else { position = 4 * (((int)gpioInit.pin) % 8); level = 1; } + SET_BIT(this->getGpio()->AFR[level], (int)gpioInit.alternateFunction << position); } }; + } // namespace stm32f072xb + #endif diff --git a/library/stm32f072xb/gpio/gpio-register/gpio-afr.hpp b/library/stm32f072xb/gpio/gpio-register/gpio-afr.hpp index a63c469c9fba2ff29febe22f00d84d9bd35cbd09..b8f023a14622688818b13f718308927988675f6b 100644 --- a/library/stm32f072xb/gpio/gpio-register/gpio-afr.hpp +++ b/library/stm32f072xb/gpio/gpio-register/gpio-afr.hpp @@ -2,7 +2,9 @@ #define AFR_H namespace stm32f072xb { + enum class AlternateFunction { AF0, AF1, AF2, AF3, AF4, AF5, AF6, AF7 }; -} + +} // namespace stm32f072xb #endif diff --git a/library/stm32f072xb/gpio/gpio-register/gpio-moder.hpp b/library/stm32f072xb/gpio/gpio-register/gpio-moder.hpp index 23c6989febd2d38717d0377fdd8ab5dfe9bfa78d..48991cef0507ac8557ea32f6b4cdcb0a5ba15f19 100644 --- a/library/stm32f072xb/gpio/gpio-register/gpio-moder.hpp +++ b/library/stm32f072xb/gpio/gpio-register/gpio-moder.hpp @@ -1,8 +1,10 @@ -#include <stm32f0xx.h> #ifndef MODER_H #define MODER_H + namespace stm32f072xb { + enum class Moder { INPUT, OUPUT, ALTERNATE, ANALOG }; -} + +} // namespace stm32f072xb #endif diff --git a/library/stm32f072xb/gpio/gpio-register/gpio-ospeedr.hpp b/library/stm32f072xb/gpio/gpio-register/gpio-ospeedr.hpp index 48636937cc80c0d09dea1bedda54ca083f96d6b4..9042635a9aebef077e909c347d9ff7e14bc42a3a 100644 --- a/library/stm32f072xb/gpio/gpio-register/gpio-ospeedr.hpp +++ b/library/stm32f072xb/gpio/gpio-register/gpio-ospeedr.hpp @@ -1,7 +1,10 @@ -#include <stm32f0xx.h> #ifndef SPEED_R_H #define SPEED_R_H + namespace stm32f072xb { -enum class SpeedR { LOW, MEDIUM, HIGH }; -} + +enum class Speedr { LOW, MEDIUM, HIGH }; + +} // namespace stm32f072xb + #endif diff --git a/library/stm32f072xb/gpio/gpio-register/gpio-otyper.hpp b/library/stm32f072xb/gpio/gpio-register/gpio-otyper.hpp index 41301ba47a98b9a69011b8c6481e9c70f73e5614..9b05b0897b337a0b9cc15217ae7d8861cd902442 100644 --- a/library/stm32f072xb/gpio/gpio-register/gpio-otyper.hpp +++ b/library/stm32f072xb/gpio/gpio-register/gpio-otyper.hpp @@ -1,7 +1,10 @@ -#include <stm32f0xx.h> #ifndef OTYPER_H #define OTYPER_H + namespace stm32f072xb { -enum class Otyper { PUSH_PULL, OPEN_DRAIN }; -} + +enum class OTyper { PUSH_PULL, OPEN_DRAIN }; + +} // namespace stm32f072xb + #endif diff --git a/library/stm32f072xb/gpio/gpio-register/gpio-pin.hpp b/library/stm32f072xb/gpio/gpio-register/gpio-pin.hpp index 85170df5c2cc836f4257ab615e12cefe5a9a1251..3b940f78d27f53a7e21da7955f01b3c2da047925 100644 --- a/library/stm32f072xb/gpio/gpio-register/gpio-pin.hpp +++ b/library/stm32f072xb/gpio/gpio-register/gpio-pin.hpp @@ -1,8 +1,10 @@ -#include <stm32f0xx.h> #ifndef GPIO_PIN_H #define GPIO_PIN_H + namespace stm32f072xb { + enum class GpioPin : uint8_t { P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15 }; -} + +} // namespace stm32f072xb #endif diff --git a/library/stm32f072xb/gpio/gpio-register/gpio-port.hpp b/library/stm32f072xb/gpio/gpio-register/gpio-port.hpp index 181f32b3fb9bc0ebff22adb2d575a8378b81b34b..11cd9f57ee2f32da33118c5955098d80ab0dd8a7 100644 --- a/library/stm32f072xb/gpio/gpio-register/gpio-port.hpp +++ b/library/stm32f072xb/gpio/gpio-register/gpio-port.hpp @@ -1,8 +1,10 @@ -#include <stm32f0xx.h> #ifndef PORT_H #define PORT_H namespace stm32f072xb { + enum class Port { A, B, C, D, E, F }; -} + +} // namespace stm32f072xb + #endif diff --git a/library/stm32f072xb/gpio/gpio-register/gpio-pupdr.hpp b/library/stm32f072xb/gpio/gpio-register/gpio-pupdr.hpp index c4d20c6872c9763c3c9cea48df66ee00176d1f5e..f0ac6b1e6341567f5f3bf846b5b16dc051e90045 100644 --- a/library/stm32f072xb/gpio/gpio-register/gpio-pupdr.hpp +++ b/library/stm32f072xb/gpio/gpio-register/gpio-pupdr.hpp @@ -1,9 +1,10 @@ -#include <stm32f0xx.h> #ifndef PUPDR_H #define PUPDR_H namespace stm32f072xb { + enum class Pupdr { NONE, PULL_UP, PULL_DOWN }; -} + +} // namespace stm32f072xb #endif diff --git a/library/stm32f072xb/gpio/gpio-register/gpio-register.hpp b/library/stm32f072xb/gpio/gpio-register/gpio-register.hpp index 8e8a0427d571d48c5ea282b656b7f0702dda921a..4d9be27098812c74de80c9636c25e2f636a178a1 100644 --- a/library/stm32f072xb/gpio/gpio-register/gpio-register.hpp +++ b/library/stm32f072xb/gpio/gpio-register/gpio-register.hpp @@ -1,3 +1,4 @@ +#include <stm32f0xx.h> #include "gpio-afr.hpp" #include "gpio-moder.hpp" #include "gpio-ospeedr.hpp" diff --git a/library/stm32f072xb/gpio/gpio.cpp b/library/stm32f072xb/gpio/gpio.cpp index df1222c432a239385900a3faeab73cfa4180ae85..ecc25004b965ab59e55c00a217bb0111f25bd1f5 100644 --- a/library/stm32f072xb/gpio/gpio.cpp +++ b/library/stm32f072xb/gpio/gpio.cpp @@ -2,30 +2,30 @@ using namespace stm32f072xb; -Gpio<Port::A>::Gpio(AbstractGpioInit gpioInit) : AbstractGpio(GPIOA, gpioInit) { +Gpio<Port::A>::Gpio(const AbstractGpioInit& gpioInit) : AbstractGpio(GPIOA, gpioInit) { SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOAEN); // enable GPIOA (p.120) this->setupRegister(); } -Gpio<Port::B>::Gpio(AbstractGpioInit gpioInit) : AbstractGpio(GPIOB, gpioInit) { +Gpio<Port::B>::Gpio(const AbstractGpioInit& gpioInit) : AbstractGpio(GPIOB, gpioInit) { SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOBEN); this->setupRegister(); } -Gpio<Port::C>::Gpio(AbstractGpioInit gpioInit) : AbstractGpio(GPIOC, gpioInit) { +Gpio<Port::C>::Gpio(const AbstractGpioInit& gpioInit) : AbstractGpio(GPIOC, gpioInit) { SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOCEN); this->setupRegister(); } -Gpio<Port::D>::Gpio(AbstractGpioInit gpioInit) : AbstractGpio(GPIOD, gpioInit) { +Gpio<Port::D>::Gpio(const AbstractGpioInit& gpioInit) : AbstractGpio(GPIOD, gpioInit) { SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIODEN); this->setupRegister(); } -Gpio<Port::E>::Gpio(AbstractGpioInit gpioInit) : AbstractGpio(GPIOE, gpioInit) { +Gpio<Port::E>::Gpio(const AbstractGpioInit& gpioInit) : AbstractGpio(GPIOE, gpioInit) { SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOEEN); this->setupRegister(); } -Gpio<Port::F>::Gpio(AbstractGpioInit gpioInit) : AbstractGpio(GPIOF, gpioInit) { +Gpio<Port::F>::Gpio(const AbstractGpioInit& gpioInit) : AbstractGpio(GPIOF, gpioInit) { SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOFEN); this->setupRegister(); } diff --git a/library/stm32f072xb/gpio/gpio.hpp b/library/stm32f072xb/gpio/gpio.hpp index e708baafd4e5a89c4a0893827ec9f77f28da610a..0ce60e3851536bbd1c4d7b057cd646d566de4386 100644 --- a/library/stm32f072xb/gpio/gpio.hpp +++ b/library/stm32f072xb/gpio/gpio.hpp @@ -1,53 +1,51 @@ #include "abstract-gpio-init.hpp" #include "abstract-gpio.hpp" + #ifndef GPIO_H #define GPIO_H namespace stm32f072xb { + template <Port T> class Gpio : public AbstractGpio { - private: public: - Gpio(AbstractGpioInit gpioInit); + Gpio(const AbstractGpioInit& gpioInit); }; template <> class Gpio<Port::A> : public AbstractGpio { - private: public: - Gpio(AbstractGpioInit gpioInit); + Gpio(const AbstractGpioInit& gpioInit); }; template <> class Gpio<Port::B> : public AbstractGpio { - private: public: - Gpio(AbstractGpioInit gpioInit); + Gpio(const AbstractGpioInit& gpioInit); }; + template <> class Gpio<Port::C> : public AbstractGpio { - private: public: - Gpio(AbstractGpioInit gpioInit); + Gpio(const AbstractGpioInit& gpioInit); }; template <> class Gpio<Port::D> : public AbstractGpio { - private: public: - Gpio(AbstractGpioInit gpioInit); + Gpio(const AbstractGpioInit& gpioInit); }; + template <> class Gpio<Port::E> : public AbstractGpio { - private: public: - Gpio(AbstractGpioInit gpioInit); + Gpio(const AbstractGpioInit& gpioInit); }; + template <> class Gpio<Port::F> : public AbstractGpio { - private: public: - Gpio(AbstractGpioInit gpioInit); + Gpio(const AbstractGpioInit& gpioInit); }; } // namespace stm32f072xb diff --git a/library/stm32f072xb/gpio/input-gpio/input-gpio-init.hpp b/library/stm32f072xb/gpio/input-gpio/input-gpio-init.hpp index 676ee3cb6e433a79b009eaad8d7ed0166756ad27..0e824281d4e7ec6c50edb31e322d5137353dc58f 100644 --- a/library/stm32f072xb/gpio/input-gpio/input-gpio-init.hpp +++ b/library/stm32f072xb/gpio/input-gpio/input-gpio-init.hpp @@ -3,7 +3,11 @@ #ifndef INPUT_GPIO_INIT_H #define INPUT_GPIO_INIT_H + namespace stm32f072xb { -struct InputGpioInit : AbstractGpioInit {}; + +struct InputGpioInit : public AbstractGpioInit {}; + } // namespace stm32f072xb + #endif diff --git a/library/stm32f072xb/gpio/input-gpio/input-gpio.hpp b/library/stm32f072xb/gpio/input-gpio/input-gpio.hpp index 1550fe4c583eeb1cbb9ca70c8ccdd802ce0b02b4..dda9da8ae2a8f4006c249bb86d23af9f5899c9e3 100644 --- a/library/stm32f072xb/gpio/input-gpio/input-gpio.hpp +++ b/library/stm32f072xb/gpio/input-gpio/input-gpio.hpp @@ -8,21 +8,20 @@ namespace stm32f072xb { template <Port T> class InputGpio : public Gpio<T> { - private: public: - InputGpio(InputGpioInit gpioInit) : Gpio<T>(gpioInit) { + InputGpio(const InputGpioInit& gpioInit) : Gpio<T>(gpioInit) { CLEAR_BIT(this->getGpio()->MODER, 0x3UL << (this->getPin() * 2)); } - ~InputGpio(); - - FlagStatus readPin() { + FlagStatus readPin() const { return READ_BIT(this->getGpio()->IDR, 1 << this->getPin()) ? FlagStatus::SET : FlagStatus::RESET; } - bool isHigh() { return READ_BIT(this->getGpio()->IDR, 1 << this->getPin()); } + bool isHigh() const { return READ_BIT(this->getGpio()->IDR, 1 << this->getPin()); } - bool isLow() { return !READ_BIT(this->getGpio()->IDR, 1 << this->getPin()); } + bool isLow() const { return !READ_BIT(this->getGpio()->IDR, 1 << this->getPin()); } }; + } // namespace stm32f072xb + #endif diff --git a/library/stm32f072xb/gpio/output-gpio/output-gpio-init.hpp b/library/stm32f072xb/gpio/output-gpio/output-gpio-init.hpp index 47b0073699c69997c37b9cc237a8fb3556893c57..79f1c1085780d05aec8a094d4cf82a39e03557e7 100644 --- a/library/stm32f072xb/gpio/output-gpio/output-gpio-init.hpp +++ b/library/stm32f072xb/gpio/output-gpio/output-gpio-init.hpp @@ -6,6 +6,8 @@ namespace stm32f072xb { -struct OutputGpioInit : AbstractGpioInit {}; +struct OutputGpioInit : public AbstractGpioInit {}; + } // namespace stm32f072xb + #endif diff --git a/library/stm32f072xb/gpio/output-gpio/output-gpio.hpp b/library/stm32f072xb/gpio/output-gpio/output-gpio.hpp index a0f439dd8b14b0fe0ecb632f07b140894c6f0855..edee15f60f0248b8027bf6bb9885f2f5aa589330 100644 --- a/library/stm32f072xb/gpio/output-gpio/output-gpio.hpp +++ b/library/stm32f072xb/gpio/output-gpio/output-gpio.hpp @@ -12,15 +12,13 @@ class OutputGpio : public Gpio<T> { FlagStatus _status; public: - OutputGpio(OutputGpioInit gpioInit) : Gpio<T>(gpioInit) { + OutputGpio(const OutputGpioInit& gpioInit) : Gpio<T>(gpioInit) { CLEAR_BIT(this->getGpio()->MODER, 0x3UL << (this->getPin() * 2)); SET_BIT(this->getGpio()->MODER, 0x1UL << (this->getPin() * 2)); CLEAR_BIT(this->getGpio()->OTYPER, 0x1UL << (this->getPin())); } - ~OutputGpio(); - - void setPin(FlagStatus status) { + void setPin(const FlagStatus& status) { _status = status; (status == FlagStatus::SET) ? SET_BIT(this->getGpio()->ODR, 1 << this->getPin()) : CLEAR_BIT(this->getGpio()->ODR, 1 << this->getPin()); @@ -33,4 +31,5 @@ class OutputGpio : public Gpio<T> { }; } // namespace stm32f072xb + #endif diff --git a/library/stm32f072xb/gpio/uart-gpio/uart-gpio-type.hpp b/library/stm32f072xb/gpio/uart-gpio/uart-gpio-type.hpp index ef33e3db51d65bc07a76d1b639a72ab4762a33e0..6c705de61e7054d33f2473f0e4b898733a25cb34 100644 --- a/library/stm32f072xb/gpio/uart-gpio/uart-gpio-type.hpp +++ b/library/stm32f072xb/gpio/uart-gpio/uart-gpio-type.hpp @@ -2,7 +2,9 @@ #define UART_GPIO_TYPE_H namespace stm32f072xb { + enum class UartGpioType { RX, TX }; -} + +} // namespace stm32f072xb #endif diff --git a/library/stm32f072xb/gpio/uart-gpio/uart-gpio.hpp b/library/stm32f072xb/gpio/uart-gpio/uart-gpio.hpp index fb631689d55d296bc306c2bac94e45b6187f9657..e1452956ff374db397692de5def06ec1ae452793 100644 --- a/library/stm32f072xb/gpio/uart-gpio/uart-gpio.hpp +++ b/library/stm32f072xb/gpio/uart-gpio/uart-gpio.hpp @@ -6,138 +6,121 @@ #include "uart-register.hpp" namespace stm32f072xb { + template <UartRegister T, UartGpioType V, Port U> class UartGpio : public AlternateGpio<U> { - private: public: UartGpio(); }; template <> class UartGpio<UartRegister::UART1, UartGpioType::TX, Port::A> : public AlternateGpio<Port::A> { - private: public: UartGpio(); }; template <> class UartGpio<UartRegister::UART1, UartGpioType::RX, Port::A> : public AlternateGpio<Port::A> { - private: public: UartGpio(); }; template <> class UartGpio<UartRegister::UART1, UartGpioType::TX, Port::B> : public AlternateGpio<Port::B> { - private: public: UartGpio(); }; template <> class UartGpio<UartRegister::UART1, UartGpioType::RX, Port::B> : public AlternateGpio<Port::B> { - private: public: UartGpio(); }; template <> class UartGpio<UartRegister::UART2, UartGpioType::TX, Port::A> : public AlternateGpio<Port::A> { - private: public: UartGpio(); }; template <> class UartGpio<UartRegister::UART2, UartGpioType::RX, Port::A> : public AlternateGpio<Port::A> { - private: public: UartGpio(); }; template <> class UartGpio<UartRegister::UART2, UartGpioType::TX, Port::D> : public AlternateGpio<Port::D> { - private: public: UartGpio(); }; template <> class UartGpio<UartRegister::UART2, UartGpioType::RX, Port::D> : public AlternateGpio<Port::D> { - private: public: UartGpio(); }; template <> class UartGpio<UartRegister::UART3, UartGpioType::TX, Port::B> : public AlternateGpio<Port::B> { - private: public: UartGpio(); }; template <> class UartGpio<UartRegister::UART3, UartGpioType::RX, Port::B> : public AlternateGpio<Port::B> { - private: public: UartGpio(); }; template <> class UartGpio<UartRegister::UART3, UartGpioType::TX, Port::C> : public AlternateGpio<Port::C> { - private: public: UartGpio(); }; template <> class UartGpio<UartRegister::UART3, UartGpioType::RX, Port::C> : public AlternateGpio<Port::C> { - private: public: UartGpio(); }; template <> class UartGpio<UartRegister::UART3, UartGpioType::TX, Port::D> : public AlternateGpio<Port::D> { - private: public: UartGpio(); }; template <> class UartGpio<UartRegister::UART3, UartGpioType::RX, Port::D> : public AlternateGpio<Port::D> { - private: public: UartGpio(); }; template <> class UartGpio<UartRegister::UART4, UartGpioType::TX, Port::A> : public AlternateGpio<Port::A> { - private: public: UartGpio(); }; template <> class UartGpio<UartRegister::UART4, UartGpioType::RX, Port::A> : public AlternateGpio<Port::A> { - private: public: UartGpio(); }; template <> class UartGpio<UartRegister::UART4, UartGpioType::TX, Port::C> : public AlternateGpio<Port::C> { - private: public: UartGpio(); }; template <> class UartGpio<UartRegister::UART4, UartGpioType::RX, Port::C> : public AlternateGpio<Port::C> { - private: public: UartGpio(); }; } // namespace stm32f072xb + #endif