diff options
author | Ilya Stolyarov <i.stolyarov@thirdpin.ru> | 2020-09-23 19:04:09 +0300 |
---|---|---|
committer | Ilya Stolyarov <i.stolyarov@thirdpin.ru> | 2020-09-23 19:04:09 +0300 |
commit | 659bffc60d6e3d29146a639ccc85024f4ee81b98 (patch) | |
tree | 0e461bb20266485bdc3b6afd4789830658cfb599 | |
parent | 1229c03c875bf944b7a4949afab94e0b94dd350e (diff) |
[gpio] Make the port typed
-rw-r--r-- | cm3cpp/gpio.hpp | 186 | ||||
-rw-r--r-- | cm3cpp/private/pinout.h | 2 |
2 files changed, 119 insertions, 69 deletions
diff --git a/cm3cpp/gpio.hpp b/cm3cpp/gpio.hpp index 340c6f2..a49b1bc 100644 --- a/cm3cpp/gpio.hpp +++ b/cm3cpp/gpio.hpp @@ -52,83 +52,133 @@ class Gpio public: struct Pinout { - uint32_t port; - uint16_t pin; - uint8_t pin_number; + enum Port + { +// Check preprocessor value is not empty +// Works for integer values +// https://stackoverflow.com/questions/4102351/test-for-empty-macro-definition +#if (GPIOA + 0) + PORT_A = GPIOA +#endif +#if (GPIOB + 0) + , + PORT_B = GPIOC +#endif +#if (GPIOC + 0) + , + PORT_C = GPIOC +#endif +#if (GPIOD + 0) + , + PORT_D = GPIOD +#endif +#if (GPIOE + 0) + , + PORT_E = GPIOE +#endif +#if (GPIOF + 0) + , + PORT_F = GPIOF +#endif +#if (GPIOG + 0) + , + PORT_G = GPIOG +#endif +#if (GPIOH + 0) + , + PORT_H = GPIOH +#endif +#if (GPIOI + 0) + , + PORT_I = GPIOI +#endif +#if (GPIOJ + 0) + , + PORT_J = GPIOJ +#endif +#if (GPIOK + 0) + , + PORT_K = GPIOK +#endif }; - enum Mode - { - INPUT, - OUTPUT, - ALTERNATE_FUNCTION, - ANALOG - }; + Port port; + uint16_t pin; + uint8_t pin_number; +}; - enum PullMode - { - NO_PULL, - PULL_UP, - PULL_DOWN - }; +enum Mode +{ + INPUT, + OUTPUT, + ALTERNATE_FUNCTION, + ANALOG +}; - enum OutputType - { - PUSH_PULL, - OPEN_DRAIN - }; +enum PullMode +{ + NO_PULL, + PULL_UP, + PULL_DOWN +}; - enum Speed - { - LOW_2MHz, - MEDIUM_25MHz, - FAST_50MHz, - HIGH_SPEED_100MHz - }; +enum OutputType +{ + PUSH_PULL, + OPEN_DRAIN +}; - enum AltFuncNumber - { - AF0, - AF1, - AF2, - AF3, - AF4, - AF5, - AF6, - AF7, - AF8, - AF9, - AF10, - AF11, - AF12, - AF13, - AF14, - AF15 - }; +enum Speed +{ + LOW_2MHz, + MEDIUM_25MHz, + FAST_50MHz, + HIGH_SPEED_100MHz +}; - Gpio() {} - Gpio(Pinout pinout); - - void init(Pinout pinout); - void set(); - void clear(); - bool get() const; - void toggle(); - uint16_t port_read() const; - void port_write(uint16_t data); - void port_config_lock(); - void mode_setup(Mode mode, PullMode pull_mode); - void set_output_options(OutputType type, Speed speed); - void set_af(AltFuncNumber af_num); - void setup_exti(enum exti_trigger_type trigger); - void clear_exti_pending_bit(); - bool get_exti_flag_status() const; - - private: - Pinout _pinout; +enum AltFuncNumber +{ + AF0, + AF1, + AF2, + AF3, + AF4, + AF5, + AF6, + AF7, + AF8, + AF9, + AF10, + AF11, + AF12, + AF13, + AF14, + AF15 }; -} // namespace gpio +Gpio() {} +Gpio(Pinout pinout); + +void init(Pinout pinout); +void set(); +void clear(); +bool get() const; +void toggle(); +uint16_t port_read() const; +void port_write(uint16_t data); +void port_config_lock(); +void mode_setup(Mode mode, PullMode pull_mode); +void set_output_options(OutputType type, Speed speed); +void set_af(AltFuncNumber af_num); +void setup_exti(enum exti_trigger_type trigger); +void clear_exti_pending_bit(); +bool get_exti_flag_status() const; + +private: +Pinout _pinout; +}; // namespace gpio + +} // namespace cm3cpp } // namespace cm3cpp diff --git a/cm3cpp/private/pinout.h b/cm3cpp/private/pinout.h index ae42718..dfb0841 100644 --- a/cm3cpp/private/pinout.h +++ b/cm3cpp/private/pinout.h @@ -3,7 +3,7 @@ #define PINOUT_CTOR(port, pin) \ { \ - GPIO##port, GPIO##pin, pin \ + static_cast<Pinout::Port>(GPIO##port), GPIO##pin, pin \ } #define PNULL \ |