tetl 0.1.0
Embedded Template Library
Loading...
Searching...
No Matches
gpio.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSL-1.0
2
3#ifndef TETL_HARDWARE_STM32_GPIO_HPP
4#define TETL_HARDWARE_STM32_GPIO_HPP
5
6#include <etl/version.hpp>
7
8#include <etl/cstdint.hpp>
9#include <etl/new.hpp>
10#include <etl/utility.hpp>
11
31
32enum struct pin_state : etl::uint8_t {
33 reset = 0,
35};
36
37inline auto val(pin_number pin) -> etl::uint16_t { return static_cast<etl::uint16_t>(pin); }
38
48
49struct port {
50 ~port() = default;
51
52 port(port const&) = delete;
53 auto operator=(port const&) -> port& = delete;
54
55 port(port&&) = delete;
56 auto operator=(port&&) -> port& = delete;
57
58 auto toggle_pin(pin_number pin) noexcept -> void;
59 auto write(pin_number pin, pin_state state) noexcept -> void;
60 [[nodiscard]] auto read(pin_number pin) noexcept -> pin_state;
61
62 [[nodiscard]] static auto place_at(void* addr) -> port&;
63
64private:
65 explicit port() = default;
66
67 gpio_memory_layout _memory;
68};
69
70inline auto port::read(pin_number const pin) noexcept -> pin_state
71{
72 etl::ignore_unused(this, pin);
73 return {};
74}
75
76inline auto port::write(pin_number const pin, pin_state const state) noexcept -> void
77{
78 if (state == pin_state::reset) {
79 _memory.bit_set_reset = (1U << val(pin));
80 return;
81 }
82 _memory.bit_set_reset = (1U << (val(pin) + 16U));
83}
84
85inline auto port::toggle_pin(pin_number const pin) noexcept -> void
86{
87 _memory.output_data = _memory.output_data ^ (1U << val(pin));
88}
89
90inline auto port::place_at(void* addr) -> port& { return *new (addr) port; }
91
92} // namespace etl::experimental::hardware::stm32
93
94#endif // TETL_HARDWARE_STM32_GPIO_HPP
pin_number
Definition gpio.hpp:13
auto val(pin_number pin) -> etl::uint16_t
Definition gpio.hpp:37
pin_state
Definition gpio.hpp:32
TETL_BUILTIN_UINT16 uint16_t
Unsigned integer type with width of exactly 16 bits.
Definition uint_t.hpp:14
TETL_BUILTIN_UINT8 uint8_t
Unsigned integer type with width of exactly 8 bits.
Definition uint_t.hpp:11
TETL_BUILTIN_UINT32 uint32_t
Unsigned integer type with width of exactly 32 bits.
Definition uint_t.hpp:17
constexpr auto ignore_unused(Types &&...) -> void
Explicitly ignore arguments or variables.
Definition ignore_unused.hpp:17
etl::uint32_t volatile input_data
Definition gpio.hpp:42
etl::uint32_t volatile lock
Definition gpio.hpp:46
etl::uint32_t volatile control_low
Definition gpio.hpp:40
etl::uint32_t volatile bit_set
Definition gpio.hpp:45
etl::uint32_t volatile output_data
Definition gpio.hpp:43
etl::uint32_t volatile control_high
Definition gpio.hpp:41
etl::uint32_t volatile bit_set_reset
Definition gpio.hpp:44
auto read(pin_number pin) noexcept -> pin_state
Definition gpio.hpp:70
auto operator=(port const &) -> port &=delete
auto toggle_pin(pin_number pin) noexcept -> void
Definition gpio.hpp:85
static auto place_at(void *addr) -> port &
Definition gpio.hpp:90
auto write(pin_number pin, pin_state state) noexcept -> void
Definition gpio.hpp:76
auto operator=(port &&) -> port &=delete