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// SPDX-FileCopyrightText: Copyright (C) 2019 Tobias Hienzsch
3
4#ifndef TETL_HARDWARE_STM32_GPIO_HPP
5#define TETL_HARDWARE_STM32_GPIO_HPP
6
7#include <etl/version.hpp>
8
9#include <etl/cstdint.hpp>
10#include <etl/new.hpp>
11#include <etl/utility.hpp>
12
13namespace etl::experimental::hardware::stm32 {
14enum struct pin_number : etl::uint16_t {
15 pin_0 = 0,
16 pin_1,
17 pin_2,
18 pin_3,
19 pin_4,
20 pin_5,
21 pin_6,
22 pin_7,
23 pin_8,
24 pin_9,
25 pin_10,
26 pin_11,
27 pin_12,
28 pin_13,
29 pin_14,
30 pin_15,
31};
32
33enum struct pin_state : etl::uint8_t {
34 reset = 0,
35 set,
36};
37
38inline auto val(pin_number pin) -> etl::uint16_t
39{
40 return static_cast<etl::uint16_t>(pin);
41}
42
44 etl::uint32_t volatile control_low;
45 etl::uint32_t volatile control_high;
46 etl::uint32_t volatile input_data;
47 etl::uint32_t volatile output_data;
48 etl::uint32_t volatile bit_set_reset;
49 etl::uint32_t volatile bit_set;
50 etl::uint32_t volatile lock;
51};
52
53struct port {
54 ~port() = default;
55
56 port(port const&) = delete;
57 auto operator=(port const&) -> port& = delete;
58
59 port(port&&) = delete;
60 auto operator=(port&&) -> port& = delete;
61
62 auto toggle_pin(pin_number pin) noexcept -> void;
63 auto write(pin_number pin, pin_state state) noexcept -> void;
64 [[nodiscard]] auto read(pin_number pin) noexcept -> pin_state;
65
66 [[nodiscard]] static auto place_at(void* addr) -> port&;
67
68private:
69 explicit port() = default;
70
71 gpio_memory_layout _memory;
72};
73
74inline auto port::read(pin_number const pin) noexcept -> pin_state
75{
77 return {};
78}
79
80inline auto port::write(pin_number const pin, pin_state const state) noexcept -> void
81{
82 if (state == pin_state::reset) {
83 _memory.bit_set_reset = (1U << val(pin));
84 return;
85 }
86 _memory.bit_set_reset = (1U << (val(pin) + 16U));
87}
88
89inline auto port::toggle_pin(pin_number const pin) noexcept -> void
90{
91 _memory.output_data = _memory.output_data ^ (1U << val(pin));
92}
93
94inline auto port::place_at(void* addr) -> port&
95{
96 return *new (addr) port;
97}
98
99} // namespace etl::experimental::hardware::stm32
100
101#endif // TETL_HARDWARE_STM32_GPIO_HPP
pin_number
Definition gpio.hpp:14
auto val(pin_number pin) -> etl::uint16_t
Definition gpio.hpp:38
pin_state
Definition gpio.hpp:33
Definition adjacent_find.hpp:9
constexpr auto ignore_unused(Types &&...) -> void
Explicitly ignore arguments or variables.
Definition ignore_unused.hpp:18
etl::uint32_t volatile input_data
Definition gpio.hpp:46
etl::uint32_t volatile lock
Definition gpio.hpp:50
etl::uint32_t volatile control_low
Definition gpio.hpp:44
etl::uint32_t volatile bit_set
Definition gpio.hpp:49
etl::uint32_t volatile output_data
Definition gpio.hpp:47
etl::uint32_t volatile control_high
Definition gpio.hpp:45
etl::uint32_t volatile bit_set_reset
Definition gpio.hpp:48
auto read(pin_number pin) noexcept -> pin_state
Definition gpio.hpp:74
auto operator=(port const &) -> port &=delete
auto toggle_pin(pin_number pin) noexcept -> void
Definition gpio.hpp:89
static auto place_at(void *addr) -> port &
Definition gpio.hpp:94
auto write(pin_number pin, pin_state state) noexcept -> void
Definition gpio.hpp:80
auto operator=(port &&) -> port &=delete