semf
stm32gpio.cpp
Go to the documentation of this file.
1
12
13#if defined(STM32)
14namespace semf
15{
16Stm32Gpio::Stm32Gpio(GPIO_TypeDef* port, uint16_t pin)
17: m_port(port),
18 m_pin(pin)
19{
20}
21
23{
24 SEMF_INFO("set pin %u on port %p", m_pin, m_port);
25 HAL_GPIO_WritePin(m_port, m_pin, GPIO_PIN_SET);
26}
27
29{
30 SEMF_INFO("reset pin %u on port %p", m_pin, m_port);
31 HAL_GPIO_WritePin(m_port, m_pin, GPIO_PIN_RESET);
32}
33
34bool Stm32Gpio::state() const
35{
36 auto state = HAL_GPIO_ReadPin(m_port, m_pin);
37 if (state == GPIO_PIN_SET)
38 {
39 SEMF_INFO("pin %u on port %p is high", m_pin, m_port);
40 return true;
41 }
42 else
43 {
44 SEMF_INFO("pin %u on port %p is low", m_pin, m_port);
45 return false;
46 }
47}
48
49#ifndef STM32F1
51{
52 uint16_t ioPos = pinNumberToIOPosition(m_pin);
53 if (((m_port->MODER >> ioPos * 2) & 0x03) == 0)
54 return Input;
55 else if (((m_port->OTYPER >> ioPos) & 0x01) == 0)
56 return OutputPushpull;
57 else
58 return OutputOpendrain;
59}
60#endif
61
62#ifndef STM32F1
64{
65 uint16_t ioPos = pinNumberToIOPosition(m_pin);
66 uint32_t moder = m_port->MODER;
67 uint32_t otyper = m_port->OTYPER;
68 moder &= ~(0x03 << (ioPos * 2)); // pin as input
69 switch (direction)
70 {
71 case OutputPushpull:
72 SEMF_INFO("set output pushpull: pin %u on port %p", m_pin, m_port);
73 moder |= (1 << (ioPos * 2));
74 otyper &= ~(1 << ioPos);
75 break;
76 case OutputOpendrain:
77 SEMF_INFO("set output opendrain: pin %u on port %p", m_pin, m_port);
78 moder |= (1 << (ioPos * 2));
79 otyper |= (1 << ioPos);
80 break;
81 case Input:
82 SEMF_INFO("set input: pin %u on port %p", m_pin, m_port);
83 break;
84 default:
85 break;
86 }
87 m_port->MODER = moder;
88 m_port->OTYPER = otyper;
89}
90#endif
91
92#ifndef STM32F1
94{
95 uint16_t ioPos = pinNumberToIOPosition(m_pin);
97 switch ((m_port->PUPDR >> (ioPos * 2)) & 0x03)
98 {
99 case 1:
100 ret = Pullup;
101 break;
102 case 2:
103 ret = Pulldown;
104 break;
105 default:
106 break;
107 }
108 return ret;
109}
110#endif
111
112#ifndef STM32F1
114{
115 uint16_t ioPos = pinNumberToIOPosition(m_pin);
116 uint32_t pupdr = m_port->PUPDR;
117 pupdr &= ~(0x03 << (ioPos * 2)); // no pullup, no pulldown
118 switch (pullUpPullDown)
119 {
120 case Pullup:
121 SEMF_INFO("set pullup: pin %u on port %p", m_pin, m_port);
122 pupdr |= (0x01 << (ioPos * 2));
123 break;
124 case Pulldown:
125 SEMF_INFO("set pulldown: pin %u on port %p", m_pin, m_port);
126 pupdr |= (0x02 << (ioPos * 2));
127 break;
128 case NoPullupPulldown:
129 SEMF_INFO("set no pullup / pulldown: pin %u on port %p", m_pin, m_port);
130 break;
131 default:
132 break;
133 }
134 m_port->PUPDR = pupdr;
135}
136#endif
137
138GPIO_TypeDef* Stm32Gpio::port() const
139{
140 return m_port;
141}
142
143GPIO_TypeDef* Stm32Gpio::port()
144{
145 return m_port;
146}
147
148uint16_t Stm32Gpio::pin() const
149{
150 return m_pin;
151}
152
153uint16_t Stm32Gpio::pinNumberToIOPosition(uint16_t pin) const
154{
155 for (uint16_t pos = 0; pos < 16; pos++)
156 {
157 if (pin == (1 << pos))
158 {
159 return pos;
160 }
161 }
162 return 0;
163}
164} /* namespace semf */
165#endif
Direction
Definition: gpio.h:27
@ OutputOpendrain
Definition: gpio.h:30
@ Input
Definition: gpio.h:28
@ OutputPushpull
Definition: gpio.h:29
PullUpPullDown
Definition: gpio.h:35
@ NoPullupPulldown
Definition: gpio.h:36
@ Pulldown
Definition: gpio.h:38
@ Pullup
Definition: gpio.h:37
GPIO_TypeDef * port() const
Returns the GPIO handler.
Definition: stm32gpio.cpp:138
uint16_t pinNumberToIOPosition(uint16_t pin) const
Returns the io position based on the pin number.
Definition: stm32gpio.cpp:153
void reset() override
Definition: stm32gpio.cpp:28
Stm32Gpio(GPIO_TypeDef *port, uint16_t pin)
Constructor.
Definition: stm32gpio.cpp:16
void setPullUpPullDown(PullUpPullDown pullUpPullDown) override
Sets the pullup or pulldown setting of a GPIO.
Definition: stm32gpio.cpp:113
PullUpPullDown pullUpPullDown() const override
Returns the pullup or pulldown setting of a GPIO.
Definition: stm32gpio.cpp:93
uint16_t pin() const
Returns pin number.
Definition: stm32gpio.cpp:148
void set() override
Definition: stm32gpio.cpp:22
bool state() const override
Returns the current state of the pin.
Definition: stm32gpio.cpp:34
Direction direction() const override
Returns the direction setting of a GPIO.
Definition: stm32gpio.cpp:50
void setDirection(Direction direction) override
Sets the direction of a GPIO.
Definition: stm32gpio.cpp:63
#define SEMF_INFO(...)
Definition: debug.h:41