rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
stm32_icu.cpp
Go to the documentation of this file.
1/**
2 * @file stm32_icu.cpp
3 * @brief Port implementation for the STM32 timer units in ICU mode found on the STM32F4 and STM32F7
4 *
5 * @date October 20, 2022
6 * @author Andrey Gusakov, (c) 2022
7 * @author Andrey Belomutskiy, (c) 2012-2020
8 */
9
10#include "pch.h"
11
12#if HAL_USE_ICU
13
14#define RETURN_ICU_TRUE(icu, channel, af, clock) \
15 do { \
16 if (icu_ptr) { \
17 if (*icu_ptr != (icu)) { \
18 if (af_ptr) \
19 *af_ptr = (af); \
20 *icu_ptr = (icu); \
21 if (channel_ptr) \
22 *channel_ptr = (channel); \
23 if (clock_ptr) \
24 *clock_ptr = (clock); \
25 return true; \
26 } else { \
27 /* if current icu is allready in *icu_ptr, continue and return another icu available on this pin, if any */ \
28 } \
29 } else { \
30 /* called with null icu_ptr, just to know if icu is available on given pin */ \
31 return true; \
32 } \
33 } while(0)
34
35/*
36 * TIMCLK1: Clock of timers connected to APB1
37 * (Timers 2, 3, 4, 5, 6, 7, 12, 13, 14).
38 * TIMCLK2: Clock of timers connected to APB2
39 * (Timers 1, 8, 9, 10, 11).
40 */
41
42#if (STM32_ICU_USE_TIM1 == TRUE)
43 #define RETURN_ICU1(channel) RETURN_ICU_TRUE(&ICUD1, channel, GPIO_AF_TIM1, STM32_TIMCLK2)
44#else
45 #define RETURN_ICU1(channel)
46#endif
47
48#if (STM32_ICU_USE_TIM2 == TRUE)
49 #define RETURN_ICU2(channel) RETURN_ICU_TRUE(&ICUD2, channel, GPIO_AF_TIM2, STM32_TIMCLK1)
50#else
51 #define RETURN_ICU2(channel)
52#endif
53
54#if (STM32_ICU_USE_TIM3 == TRUE)
55 #define RETURN_ICU3(channel) RETURN_ICU_TRUE(&ICUD3, channel, GPIO_AF_TIM3, STM32_TIMCLK1)
56#else
57 #define RETURN_ICU3(channel)
58#endif
59
60#if (STM32_ICU_USE_TIM4 == TRUE)
61 #define RETURN_ICU4(channel) RETURN_ICU_TRUE(&ICUD4, channel, GPIO_AF_TIM4, STM32_TIMCLK1)
62#else
63 #define RETURN_ICU4(channel)
64#endif
65
66#if (STM32_ICU_USE_TIM5 == TRUE)
67 #define RETURN_ICU5(channel) RETURN_ICU_TRUE(&ICUD5, channel, GPIO_AF_TIM5, STM32_TIMCLK1)
68#else
69 #define RETURN_ICU5(channel)
70#endif
71
72/* TIM6 is internal only */
73
74/* TIM7 is internal only */
75
76#if (STM32_ICU_USE_TIM8 == TRUE)
77 #define RETURN_ICU8(channel) RETURN_ICU_TRUE(&ICUD8, channel, GPIO_AF_TIM8, STM32_TIMCLK2)
78#else
79 #define RETURN_ICU8(channel)
80#endif
81
82#if (STM32_ICU_USE_TIM9 == TRUE)
83 #define RETURN_ICU9(channel) RETURN_ICU_TRUE(&ICUD9, channel, GPIO_AF_TIM9, STM32_TIMCLK2)
84#else
85 #define RETURN_ICU9(channel)
86#endif
87
88#if (STM32_ICU_USE_TIM10 == TRUE)
89 #define RETURN_ICU10(channel) RETURN_ICU_TRUE(&ICUD10, channel, GPIO_AF_TIM10, STM32_TIMCLK2)
90#else
91 #define RETURN_ICU10(channel)
92#endif
93
94#if (STM32_ICU_USE_TIM11 == TRUE)
95 #define RETURN_ICU11(channel) RETURN_ICU_TRUE(&ICUD11, channel, GPIO_AF_TIM11, STM32_TIMCLK2)
96#else
97 #define RETURN_ICU11(channel)
98#endif
99
100#if (STM32_ICU_USE_TIM12 == TRUE)
101 #define RETURN_ICU12(channel) RETURN_ICU_TRUE(&ICUD12, channel, GPIO_AF_TIM12, STM32_TIMCLK1)
102#else
103 #define RETURN_ICU12(channel)
104#endif
105
106#if (STM32_ICU_USE_TIM13 == TRUE)
107 #define RETURN_ICU13(channel) RETURN_ICU_TRUE(&ICUD13, channel, GPIO_AF_TIM13, STM32_TIMCLK1)
108#else
109 #define RETURN_ICU13(channel)
110#endif
111
112#if (STM32_ICU_USE_TIM14 == TRUE)
113 #define RETURN_ICU14(channel) RETURN_ICU_TRUE(&ICUD14, channel, GPIO_AF_TIM14, STM32_TIMCLK1)
114#else
115 #define RETURN_ICU14(channel)
116#endif
117
118/**
119 * ChibiOS limitation is that only channels #1 and #2 could be used for input capture
120 * Could this be unified with getConfigForPin() method?
121 */
122bool getIcuParams(brain_pin_e hwPin, iomode_t *af_ptr, ICUDriver ** icu_ptr, icuchannel_t *channel_ptr, uint32_t *clock_ptr) {
123 switch (hwPin) {
124 case Gpio::A0:
125 RETURN_ICU5(ICU_CHANNEL_1);
126 return false;
127 case Gpio::A1:
128 RETURN_ICU2(ICU_CHANNEL_2);
129 RETURN_ICU5(ICU_CHANNEL_2);
130 return false;
131 case Gpio::A2:
132 RETURN_ICU2(ICU_CHANNEL_3);
133 RETURN_ICU5(ICU_CHANNEL_3);
134 RETURN_ICU9(ICU_CHANNEL_1);
135 return false;
136 case Gpio::A3:
137 RETURN_ICU2(ICU_CHANNEL_4);
138 RETURN_ICU5(ICU_CHANNEL_4);
139 RETURN_ICU9(ICU_CHANNEL_2);
140 return false;
141 case Gpio::A6:
142 RETURN_ICU3(ICU_CHANNEL_1);
143 RETURN_ICU13(ICU_CHANNEL_1);
144 return false;
145 case Gpio::A7:
146 RETURN_ICU3(ICU_CHANNEL_2);
147 RETURN_ICU14(ICU_CHANNEL_1);
148 return false;
149 case Gpio::A8:
150 RETURN_ICU1(ICU_CHANNEL_1);
151 return false;
152 case Gpio::A9:
153 RETURN_ICU1(ICU_CHANNEL_2);
154 return false;
155 case Gpio::A10:
156 RETURN_ICU1(ICU_CHANNEL_3);
157 return false;
158 case Gpio::A11:
159 RETURN_ICU1(ICU_CHANNEL_4);
160 return false;
161 case Gpio::A15:
162 RETURN_ICU2(ICU_CHANNEL_1);
163 return false;
164 case Gpio::B0:
165 RETURN_ICU3(ICU_CHANNEL_3);
166 return false;
167 case Gpio::B1:
168 RETURN_ICU3(ICU_CHANNEL_4);
169 return false;
170 case Gpio::B3:
171 RETURN_ICU2(ICU_CHANNEL_2);
172 return false;
173 case Gpio::B4:
174 RETURN_ICU3(ICU_CHANNEL_1);
175 return false;
176 case Gpio::B5:
177 RETURN_ICU3(ICU_CHANNEL_2);
178 return false;
179 case Gpio::B6:
180 RETURN_ICU4(ICU_CHANNEL_1);
181 return false;
182 case Gpio::B7:
183 RETURN_ICU4(ICU_CHANNEL_2);
184 return false;
185 case Gpio::B8:
186 RETURN_ICU3(ICU_CHANNEL_3);
187 RETURN_ICU10(ICU_CHANNEL_1);
188 return false;
189 case Gpio::B9:
190 RETURN_ICU3(ICU_CHANNEL_4);
191 RETURN_ICU11(ICU_CHANNEL_1);
192 return false;
193 case Gpio::B10:
194 RETURN_ICU2(ICU_CHANNEL_3);
195 return false;
196 case Gpio::B11:
197 RETURN_ICU2(ICU_CHANNEL_4);
198 return false;
199 case Gpio::B14:
200 RETURN_ICU12(ICU_CHANNEL_1);
201 return false;
202 case Gpio::B15:
203 RETURN_ICU12(ICU_CHANNEL_2);
204 return false;
205 case Gpio::C6:
206 RETURN_ICU3(ICU_CHANNEL_1);
207 RETURN_ICU8(ICU_CHANNEL_1);
208 return false;
209 case Gpio::C7:
210 RETURN_ICU3(ICU_CHANNEL_2);
211 RETURN_ICU8(ICU_CHANNEL_2);
212 return false;
213 case Gpio::C8:
214 RETURN_ICU3(ICU_CHANNEL_3);
215 RETURN_ICU8(ICU_CHANNEL_3);
216 return false;
217 case Gpio::C9:
218 RETURN_ICU3(ICU_CHANNEL_4);
219 RETURN_ICU8(ICU_CHANNEL_4);
220 return false;
221 case Gpio::D12:
222 RETURN_ICU4(ICU_CHANNEL_1);
223 return false;
224 case Gpio::D13:
225 RETURN_ICU4(ICU_CHANNEL_2);
226 return false;
227 case Gpio::D14:
228 RETURN_ICU4(ICU_CHANNEL_3);
229 return false;
230 case Gpio::D15:
231 RETURN_ICU4(ICU_CHANNEL_4);
232 return false;
233 case Gpio::E5:
234 RETURN_ICU9(ICU_CHANNEL_1);
235 return false;
236 case Gpio::E6:
237 RETURN_ICU9(ICU_CHANNEL_2);
238 return false;
239 case Gpio::E9:
240 RETURN_ICU1(ICU_CHANNEL_1);
241 return false;
242 case Gpio::E11:
243 RETURN_ICU1(ICU_CHANNEL_2);
244 return false;
245 case Gpio::E13:
246 RETURN_ICU1(ICU_CHANNEL_3);
247 return false;
248 case Gpio::E14:
249 RETURN_ICU1(ICU_CHANNEL_4);
250 return false;
251 case Gpio::F6:
252 RETURN_ICU10(ICU_CHANNEL_1);
253 return false;
254 case Gpio::F7:
255 RETURN_ICU11(ICU_CHANNEL_1);
256 return false;
257 case Gpio::F8:
258 RETURN_ICU13(ICU_CHANNEL_1);
259 return false;
260 case Gpio::F9:
261 RETURN_ICU14(ICU_CHANNEL_1);
262 return false;
263 case Gpio::H6:
264 RETURN_ICU12(ICU_CHANNEL_1);
265 return false;
266 case Gpio::H9:
267 RETURN_ICU12(ICU_CHANNEL_2);
268 return false;
269 case Gpio::H10:
270 RETURN_ICU5(ICU_CHANNEL_1);
271 return false;
272 case Gpio::H11:
273 RETURN_ICU5(ICU_CHANNEL_2);
274 return false;
275 case Gpio::H12:
276 RETURN_ICU5(ICU_CHANNEL_3);
277 return false;
278 case Gpio::I0:
279 RETURN_ICU5(ICU_CHANNEL_4);
280 return false;
281 case Gpio::I2:
282 RETURN_ICU8(ICU_CHANNEL_4);
283 return false;
284 case Gpio::I5:
285 RETURN_ICU8(ICU_CHANNEL_1);
286 return false;
287 case Gpio::I6:
288 RETURN_ICU8(ICU_CHANNEL_2);
289 return false;
290 case Gpio::I7:
291 RETURN_ICU8(ICU_CHANNEL_3);
292 return false;
293
294 default:
295 return false;
296 }
297
298 return false;
299}
300
301#endif //HAL_USE_ICU
uint32_t iomode_t
Digital I/O modes.
Definition hal_pal_lld.h:83
bool getIcuParams(brain_pin_e hwPin, iomode_t *af_ptr, ICUDriver **icu_ptr, icuchannel_t *channel_ptr, uint32_t *clock_ptr)