HAL
HAL layer above libopencm3 library.
 All Files Functions Macros Groups Pages
pin_v1.h
Go to the documentation of this file.
1 /*
2  * This file is part of the HAL project, inline library above libopencm3.
3  *
4  * This library is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public License
15  * along with this library. If not, see <http://www.gnu.org/licenses/>.
16  */
17 #ifndef HAL_PIN_STM32_V1_H_INCLUDED
18 #define HAL_PIN_STM32_V1_H_INCLUDED
19 
20 #if !defined(HAL_PIN_H_INCLUDED)
21 # error please do not include HAL library internals directly
22 #endif
23 
25 
26 BEGIN_DECLS
27 
28 /*****************************************************************************/
29 
30 INLINE uint32_t _pin_port(const uint32_t pin)
31 {
32  return pin & ~15;
33 }
34 
35 INLINE uint32_t _pin_pin(const uint32_t pin)
36 {
37  return 1 << (pin & 15);
38 }
39 
40 INLINE uint32_t _pin_pinno(const uint32_t pin)
41 {
42  return pin & 15;
43 }
44 
45 /*****************************************************************************/
46 
47 INLINE bool pin_get(const uint32_t pin)
48 {
49  return (GPIO_IDR(_pin_port(pin)) & _pin_pin(pin)) != 0;
50 }
51 
52 INLINE void pin_set(const uint32_t pin, const bool val)
53 {
54  GPIO_BSRR(_pin_port(pin)) = (val) ? _pin_pin(pin) : (_pin_pin(pin) << 16);
55 }
56 
57 INLINE void pin_toggle(const uint32_t pin)
58 {
59  uint32_t val = GPIO_ODR(_pin_port(pin));
60  GPIO_BSRR(_pin_port(pin)) = ((val & _pin_pin(pin)) << 16) | (~val & _pin_pin(pin));
61 }
62 
63 /******************************************************************************/
64 
65 INLINE void pin_pull_disable(const uint32_t pin)
66 {
67  GPIO_PUPDR(_pin_port(pin)) = (GPIO_PUPDR(_pin_port(pin)) & ~GPIO_PUPD_MASK(_pin_pinno(pin))) | GPIO_PUPD(_pin_pinno(pin), GPIO_PUPD_NONE);
68 }
69 
70 INLINE void pin_pull_down(const uint32_t pin)
71 {
72  GPIO_PUPDR(_pin_port(pin)) = (GPIO_PUPDR(_pin_port(pin)) & ~GPIO_PUPD_MASK(_pin_pinno(pin))) | GPIO_PUPD(_pin_pinno(pin), GPIO_PUPD_PULLDOWN);
73 }
74 
75 INLINE void pin_pull_up(const uint32_t pin)
76 {
77  GPIO_PUPDR(_pin_port(pin)) = (GPIO_PUPDR(_pin_port(pin)) & ~GPIO_PUPD_MASK(_pin_pinno(pin))) | GPIO_PUPD(_pin_pinno(pin), GPIO_PUPD_PULLUP);
78 }
79 
80 /******************************************************************************/
81 
82 INLINE void pin_output_pushpull(const uint32_t pin)
83 {
84  GPIO_MODER(_pin_port(pin)) = (GPIO_MODER(_pin_port(pin)) & ~GPIO_MODE_MASK(_pin_pinno(pin))) | GPIO_MODE(_pin_pinno(pin), GPIO_MODE_OUTPUT);
85  GPIO_OTYPER(_pin_port(pin)) &= ~_pin_pin(pin);
86 }
87 
88 INLINE void pin_output_opendrain(const uint32_t pin)
89 {
90  GPIO_OTYPER(_pin_port(pin)) |= _pin_pin(pin);
91  GPIO_MODER(_pin_port(pin)) = (GPIO_MODER(_pin_port(pin)) & ~GPIO_MODE_MASK(_pin_pinno(pin))) | GPIO_MODE(_pin_pinno(pin), GPIO_MODE_OUTPUT);
92 }
93 
94 INLINE void pin_af_pushpull(const uint32_t pin)
95 {
96  GPIO_MODER(_pin_port(pin)) = (GPIO_MODER(_pin_port(pin)) & ~GPIO_MODE_MASK(_pin_pinno(pin))) | GPIO_MODE(_pin_pinno(pin), GPIO_MODE_AF);
97  GPIO_OTYPER(_pin_port(pin)) &= ~_pin_pin(pin);
98 }
99 
100 INLINE void pin_af_opendrain(const uint32_t pin)
101 {
102  GPIO_OTYPER(_pin_port(pin)) |= _pin_pin(pin);
103  GPIO_MODER(_pin_port(pin)) = (GPIO_MODER(_pin_port(pin)) & ~GPIO_MODE_MASK(_pin_pinno(pin))) | GPIO_MODE(_pin_pinno(pin), GPIO_MODE_AF);
104 }
105 
106 INLINE void pin_input(const uint32_t pin)
107 {
108  GPIO_MODER(_pin_port(pin)) = (GPIO_MODER(_pin_port(pin)) & ~GPIO_MODE_MASK(_pin_pinno(pin))) | GPIO_MODE(_pin_pinno(pin), GPIO_MODE_INPUT);
109 }
110 
111 INLINE void pin_analog(const uint32_t pin)
112 {
113  GPIO_PUPDR(_pin_port(pin)) = (GPIO_PUPDR(_pin_port(pin)) & ~GPIO_PUPD_MASK(_pin_pinno(pin))) | GPIO_PUPD(_pin_pinno(pin), GPIO_PUPD_NONE);
114  GPIO_MODER(_pin_port(pin)) = (GPIO_MODER(_pin_port(pin)) & ~GPIO_MODE_MASK(_pin_pinno(pin))) | GPIO_MODE(_pin_pinno(pin), GPIO_MODE_ANALOG);
115 }
116 
117 /******************************************************************************/
118 
119 INLINE void pin_speed_low(const uint32_t pin)
120 {
121  GPIO_OSPEEDR(_pin_port(pin)) = (GPIO_OSPEEDR(_pin_port(pin)) & ~GPIO_OSPEED_MASK(_pin_pinno(pin))) | GPIO_OSPEED(_pin_pinno(pin), 0);
122 }
123 
124 INLINE void pin_speed_medium(const uint32_t pin)
125 {
126  GPIO_OSPEEDR(_pin_port(pin)) = (GPIO_OSPEEDR(_pin_port(pin)) & ~GPIO_OSPEED_MASK(_pin_pinno(pin))) | GPIO_OSPEED(_pin_pinno(pin), 1);
127 }
128 
129 INLINE void pin_speed_fast(const uint32_t pin)
130 {
131  GPIO_OSPEEDR(_pin_port(pin)) = (GPIO_OSPEEDR(_pin_port(pin)) & ~GPIO_OSPEED_MASK(_pin_pinno(pin))) | GPIO_OSPEED(_pin_pinno(pin), 2);
132 }
133 
134 INLINE void pin_speed_high(const uint32_t pin)
135 {
136  GPIO_OSPEEDR(_pin_port(pin)) = (GPIO_OSPEEDR(_pin_port(pin)) & ~GPIO_OSPEED_MASK(_pin_pinno(pin))) | GPIO_OSPEED(_pin_pinno(pin), 3);
137 }
138 
139 
140 /******************************************************************************/
141 
142 INLINE void pin_af_map(const uint32_t pin, const uint32_t af)
143 {
144  GPIO_MODER(_pin_port(pin)) = (GPIO_MODER(_pin_port(pin)) & ~GPIO_MODE_MASK(_pin_pinno(pin))) |
145  GPIO_MODE(_pin_pinno(pin), GPIO_MODE_AF);
146 
147 
148  if (_pin_pinno(pin) < 8)
149  GPIO_AFRL(_pin_port(pin)) = (GPIO_AFRL(_pin_port(pin)) & ~GPIO_AFR_MASK(pin)) |
150  GPIO_AFR(_pin_pinno(pin), af);
151  else
152  GPIO_AFRH(_pin_port(pin)) = (GPIO_AFRH(_pin_port(pin)) & ~GPIO_AFR_MASK(pin-8)) |
153  GPIO_AFR(_pin_pinno(pin)-8, af);
154 }
155 
156 END_DECLS
157 
158 #endif /* HAL_PIN_STM32_V1_H_INCLUDED */