Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/thirdpin/libopencm3_cpp_extensions.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlya Stolyarov <i.stolyarov@thirdpin.ru>2020-09-23 19:04:09 +0300
committerIlya Stolyarov <i.stolyarov@thirdpin.ru>2020-09-23 19:04:09 +0300
commit659bffc60d6e3d29146a639ccc85024f4ee81b98 (patch)
tree0e461bb20266485bdc3b6afd4789830658cfb599
parent1229c03c875bf944b7a4949afab94e0b94dd350e (diff)
[gpio] Make the port typed
-rw-r--r--cm3cpp/gpio.hpp186
-rw-r--r--cm3cpp/private/pinout.h2
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 \