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_ICU9(ICU_CHANNEL_1);
133 return false;
134 case Gpio::A3:
135 RETURN_ICU9(ICU_CHANNEL_2);
136 return false;
137 case Gpio::A5:
138 RETURN_ICU2(ICU_CHANNEL_1);
139 return false;
140 case Gpio::A6:
141 RETURN_ICU3(ICU_CHANNEL_1);
142 RETURN_ICU13(ICU_CHANNEL_1);
143 return false;
144 case Gpio::A7:
145 RETURN_ICU3(ICU_CHANNEL_2);
146 RETURN_ICU14(ICU_CHANNEL_1);
147 return false;
148 case Gpio::A8:
149 RETURN_ICU1(ICU_CHANNEL_1);
150 return false;
151 case Gpio::A9:
152 RETURN_ICU1(ICU_CHANNEL_2);
153 return false;
154 case Gpio::A15:
155 RETURN_ICU2(ICU_CHANNEL_1);
156 return false;
157 case Gpio::B3:
158 RETURN_ICU2(ICU_CHANNEL_2);
159 return false;
160 case Gpio::B4:
161 RETURN_ICU3(ICU_CHANNEL_1);
162 return false;
163 case Gpio::B5:
164 RETURN_ICU3(ICU_CHANNEL_2);
165 return false;
166 case Gpio::B6:
167 RETURN_ICU4(ICU_CHANNEL_1);
168 return false;
169 case Gpio::B7:
170 RETURN_ICU4(ICU_CHANNEL_2);
171 return false;
172 case Gpio::B8:
173 RETURN_ICU10(ICU_CHANNEL_1);
174 return false;
175 case Gpio::B9:
176 RETURN_ICU11(ICU_CHANNEL_1);
177 return false;
178 case Gpio::B14:
179 RETURN_ICU12(ICU_CHANNEL_1);
180 return false;
181 case Gpio::B15:
182 RETURN_ICU12(ICU_CHANNEL_2);
183 return false;
184 case Gpio::C6:
185 RETURN_ICU3(ICU_CHANNEL_1);
186 RETURN_ICU8(ICU_CHANNEL_1);
187 return false;
188 case Gpio::C7:
189 RETURN_ICU3(ICU_CHANNEL_2);
190 RETURN_ICU8(ICU_CHANNEL_2);
191 return false;
192 case Gpio::D12:
193 RETURN_ICU4(ICU_CHANNEL_1);
194 return false;
195 case Gpio::D13:
196 RETURN_ICU4(ICU_CHANNEL_2);
197 return false;
198 case Gpio::E5:
199 RETURN_ICU9(ICU_CHANNEL_1);
200 return false;
201 case Gpio::E6:
202 RETURN_ICU9(ICU_CHANNEL_2);
203 return false;
204 case Gpio::E9:
205 RETURN_ICU1(ICU_CHANNEL_1);
206 return false;
207 case Gpio::E11:
208 RETURN_ICU1(ICU_CHANNEL_2);
209 return false;
210 case Gpio::E14:
211 RETURN_ICU1(ICU_CHANNEL_4);
212 return false;
213 case Gpio::F6:
214 RETURN_ICU10(ICU_CHANNEL_1);
215 return false;
216 case Gpio::F7:
217 RETURN_ICU11(ICU_CHANNEL_1);
218 return false;
219 case Gpio::F8:
220 RETURN_ICU13(ICU_CHANNEL_1);
221 return false;
222 case Gpio::F9:
223 RETURN_ICU14(ICU_CHANNEL_1);
224 return false;
225 case Gpio::H6:
226 RETURN_ICU12(ICU_CHANNEL_1);
227 return false;
228 case Gpio::H9:
229 RETURN_ICU12(ICU_CHANNEL_2);
230 return false;
231 case Gpio::H10:
232 RETURN_ICU5(ICU_CHANNEL_1);
233 return false;
234 case Gpio::H11:
235 RETURN_ICU5(ICU_CHANNEL_2);
236 return false;
237 case Gpio::I5:
238 RETURN_ICU8(ICU_CHANNEL_1);
239 return false;
240 case Gpio::I6:
241 RETURN_ICU8(ICU_CHANNEL_2);
242 return false;
243
244 default:
245 return false;
246 }
247
248 return false;
249}
250
251#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)