px-fwlib 0.10.0
Cross-platform embedded library and documentation for 8/16/32-bit microcontrollers generated with Doxygen 1.9.2
px_exti.c
1/* =============================================================================
2 ____ ___ ____ ___ _ _ ___ __ __ ___ __ __ TM
3 | _ \ |_ _| / ___| / _ \ | \ | | / _ \ | \/ | |_ _| \ \/ /
4 | |_) | | | | | | | | | | \| | | | | | | |\/| | | | \ /
5 | __/ | | | |___ | |_| | | |\ | | |_| | | | | | | | / \
6 |_| |___| \____| \___/ |_| \_| \___/ |_| |_| |___| /_/\_\
7
8 Copyright (c) 2020 Pieter Conradie <https://piconomix.com>
9
10 License: MIT
11 https://github.com/piconomix/px-fwlib/blob/master/LICENSE.md
12
13 Title: px_exti.h : External interrupt driver
14 Author(s): Pieter Conradie
15 Creation Date: 2020-04-13
16
17============================================================================= */
18
19/* _____STANDARD INCLUDES____________________________________________________ */
20
21/* _____PROJECT INCLUDES_____________________________________________________ */
22#include "px_exti.h"
23#include "px_stm32cube.h"
24
25#include "px_log.h"
26PX_LOG_NAME("px_exti")
27
28/* _____LOCAL DEFINITIONS____________________________________________________ */
29
30/* _____MACROS_______________________________________________________________ */
31
32/* _____GLOBAL VARIABLES_____________________________________________________ */
33
34/* _____LOCAL VARIABLES______________________________________________________ */
35#if PX_EXTI_CFG_INT0_EN
36static px_exti_handler_t px_exti_0_handler;
37#endif
38#if PX_EXTI_CFG_INT1_EN
39static px_exti_handler_t px_exti_1_handler;
40#endif
41#if PX_EXTI_CFG_INT2_EN
42static px_exti_handler_t px_exti_2_handler;
43#endif
44#if PX_EXTI_CFG_INT3_EN
45static px_exti_handler_t px_exti_3_handler;
46#endif
47#if PX_EXTI_CFG_INT4_EN
48static px_exti_handler_t px_exti_4_handler;
49#endif
50#if PX_EXTI_CFG_INT5_EN
51static px_exti_handler_t px_exti_5_handler;
52#endif
53#if PX_EXTI_CFG_INT6_EN
54static px_exti_handler_t px_exti_6_handler;
55#endif
56#if PX_EXTI_CFG_INT7_EN
57static px_exti_handler_t px_exti_7_handler;
58#endif
59#if PX_EXTI_CFG_INT8_EN
60static px_exti_handler_t px_exti_8_handler;
61#endif
62#if PX_EXTI_CFG_INT9_EN
63static px_exti_handler_t px_exti_9_handler;
64#endif
65#if PX_EXTI_CFG_INT10_EN
66static px_exti_handler_t px_exti_10_handler;
67#endif
68#if PX_EXTI_CFG_INT11_EN
69static px_exti_handler_t px_exti_11_handler;
70#endif
71#if PX_EXTI_CFG_INT12_EN
72static px_exti_handler_t px_exti_12_handler;
73#endif
74#if PX_EXTI_CFG_INT13_EN
75static px_exti_handler_t px_exti_13_handler;
76#endif
77#if PX_EXTI_CFG_INT14_EN
78static px_exti_handler_t px_exti_14_handler;
79#endif
80#if PX_EXTI_CFG_INT15_EN
81static px_exti_handler_t px_exti_15_handler;
82#endif
83
84/* _____LOCAL FUNCTION DECLARATIONS__________________________________________ */
85
86/* _____LOCAL FUNCTIONS______________________________________________________ */
87#if PX_EXTI_CFG_INT0_EN || PX_EXTI_CFG_INT1_EN
88void EXTI0_1_IRQHandler(void)
89{
90#if PX_EXTI_CFG_INT0_EN
91 if(LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_0))
92 {
93 LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_0);
94 if(px_exti_0_handler) (*px_exti_0_handler)();
95 }
96#endif
97#if PX_EXTI_CFG_INT1_EN
98 if(LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_1))
99 {
100 LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_1);
101 if(px_exti_1_handler) (*px_exti_1_handler)();
102 }
103#endif
104}
105#endif
106
107#if PX_EXTI_CFG_INT2_EN || PX_EXTI_CFG_INT3_EN
108void EXTI2_3_IRQHandler(void)
109{
110#if PX_EXTI_CFG_INT2_EN
111 if(LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_2))
112 {
113 LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_2);
114 if(px_exti_2_handler) (*px_exti_2_handler)();
115 }
116#endif
117#if PX_EXTI_CFG_INT3_EN
118 if(LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_3))
119 {
120 LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_3);
121 if(px_exti_3_handler) (*px_exti_3_handler)();
122 }
123#endif
124}
125#endif
126
127#if PX_EXTI_CFG_INT4_EN || PX_EXTI_CFG_INT5_EN || PX_EXTI_CFG_INT6_EN \
128 || PX_EXTI_CFG_INT7_EN || PX_EXTI_CFG_INT8_EN || PX_EXTI_CFG_INT9_EN \
129 || PX_EXTI_CFG_INT10_EN || PX_EXTI_CFG_INT11_EN || PX_EXTI_CFG_INT12_EN \
130 || PX_EXTI_CFG_INT13_EN || PX_EXTI_CFG_INT14_EN || PX_EXTI_CFG_INT15_EN
131void EXTI4_15_IRQHandler(void)
132{
133#if PX_EXTI_CFG_INT4_EN
134 if(LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_4))
135 {
136 LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_4);
137 if(px_exti_4_handler) (*px_exti_4_handler)();
138 }
139#endif
140#if PX_EXTI_CFG_INT5_EN
141 if(LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_5))
142 {
143 LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_5);
144 if(px_exti_5_handler) (*px_exti_5_handler)();
145 }
146#endif
147#if PX_EXTI_CFG_INT6_EN
148 if(LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_6))
149 {
150 LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_6);
151 if(px_exti_6_handler) (*px_exti_6_handler)();
152 }
153#endif
154#if PX_EXTI_CFG_INT7_EN
155 if(LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_7))
156 {
157 LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_7);
158 if(px_exti_7_handler) (*px_exti_7_handler)();
159 }
160#endif
161#if PX_EXTI_CFG_INT8_EN
162 if(LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_8))
163 {
164 LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_8);
165 if(px_exti_8_handler) (*px_exti_8_handler)();
166 }
167#endif
168#if PX_EXTI_CFG_INT9_EN
169 if(LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_9))
170 {
171 LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_9);
172 if(px_exti_9_handler) (*px_exti_9_handler)();
173 }
174#endif
175#if PX_EXTI_CFG_INT10_EN
176 if(LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_10))
177 {
178 LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_10);
179 if(px_exti_10_handler) (*px_exti_10_handler)();
180 }
181#endif
182#if PX_EXTI_CFG_INT11_EN
183 if(LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_11))
184 {
185 LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_11);
186 if(px_exti_11_handler) (*px_exti_11_handler)();
187 }
188#endif
189#if PX_EXTI_CFG_INT12_EN
190 if(LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_12))
191 {
192 LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_12);
193 if(px_exti_12_handler) (*px_exti_12_handler)();
194 }
195#endif
196#if PX_EXTI_CFG_INT13_EN
197 if(LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_13))
198 {
199 LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_13);
200 if(px_exti_13_handler) (*px_exti_13_handler)();
201 }
202#endif
203#if PX_EXTI_CFG_INT14_EN
204 if(LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_14))
205 {
206 LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_14);
207 if(px_exti_14_handler) (*px_exti_14_handler)();
208 }
209#endif
210#if PX_EXTI_CFG_INT15_EN
211 if(LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_15))
212 {
213 LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_15);
214 if(px_exti_15_handler) (*px_exti_15_handler)();
215 }
216#endif
217}
218#endif
219
220/* _____GLOBAL FUNCTIONS_____________________________________________________ */
221void px_exti_init(void)
222{
223#if PX_EXTI_CFG_INT0_EN || PX_EXTI_CFG_INT1_EN
224 NVIC_EnableIRQ(EXTI0_1_IRQn);
225#endif
226#if PX_EXTI_CFG_INT2_EN || PX_EXTI_CFG_INT3_EN
227 NVIC_EnableIRQ(EXTI2_3_IRQn);
228#endif
229#if PX_EXTI_CFG_INT4_EN || PX_EXTI_CFG_INT5_EN || PX_EXTI_CFG_INT6_EN \
230 || PX_EXTI_CFG_INT7_EN || PX_EXTI_CFG_INT8_EN || PX_EXTI_CFG_INT9_EN \
231 || PX_EXTI_CFG_INT10_EN || PX_EXTI_CFG_INT11_EN || PX_EXTI_CFG_INT12_EN \
232 || PX_EXTI_CFG_INT13_EN || PX_EXTI_CFG_INT14_EN || PX_EXTI_CFG_INT15_EN
233 NVIC_EnableIRQ(EXTI4_15_IRQn);
234#endif
235}
236
238 px_exti_line_t exti_line,
239 px_exti_handler_t exti_handler)
240{
241 switch(exti_line)
242 {
243#if PX_EXTI_CFG_INT0_EN
244 case PX_EXTI_LINE_0:
245 px_exti_0_handler = exti_handler;
246 LL_SYSCFG_SetEXTISource(exti_port, LL_SYSCFG_EXTI_LINE0);
247 break;
248#endif
249#if PX_EXTI_CFG_INT1_EN
250 case PX_EXTI_LINE_1:
251 px_exti_1_handler = exti_handler;
252 LL_SYSCFG_SetEXTISource(exti_port, LL_SYSCFG_EXTI_LINE1);
253 break;
254#endif
255#if PX_EXTI_CFG_INT2_EN
256 case PX_EXTI_LINE_2:
257 px_exti_2_handler = exti_handler;
258 LL_SYSCFG_SetEXTISource(exti_port, LL_SYSCFG_EXTI_LINE2);
259 break;
260#endif
261#if PX_EXTI_CFG_INT3_EN
262 case PX_EXTI_LINE_3:
263 px_exti_3_handler = exti_handler;
264 LL_SYSCFG_SetEXTISource(exti_port, LL_SYSCFG_EXTI_LINE3);
265 break;
266#endif
267#if PX_EXTI_CFG_INT4_EN
268 case PX_EXTI_LINE_4:
269 px_exti_4_handler = exti_handler;
270 LL_SYSCFG_SetEXTISource(exti_port, LL_SYSCFG_EXTI_LINE4);
271 break;
272#endif
273#if PX_EXTI_CFG_INT5_EN
274 case PX_EXTI_LINE_5:
275 px_exti_5_handler = exti_handler;
276 LL_SYSCFG_SetEXTISource(exti_port, LL_SYSCFG_EXTI_LINE5);
277 break;
278#endif
279#if PX_EXTI_CFG_INT6_EN
280 case PX_EXTI_LINE_6:
281 px_exti_6_handler = exti_handler;
282 LL_SYSCFG_SetEXTISource(exti_port, LL_SYSCFG_EXTI_LINE6);
283 break;
284#endif
285#if PX_EXTI_CFG_INT7_EN
286 case PX_EXTI_LINE_7:
287 px_exti_7_handler = exti_handler;
288 LL_SYSCFG_SetEXTISource(exti_port, LL_SYSCFG_EXTI_LINE7);
289 break;
290#endif
291#if PX_EXTI_CFG_INT8_EN
292 case PX_EXTI_LINE_8:
293 px_exti_8_handler = exti_handler;
294 LL_SYSCFG_SetEXTISource(exti_port, LL_SYSCFG_EXTI_LINE8);
295 break;
296#endif
297#if PX_EXTI_CFG_INT9_EN
298 case PX_EXTI_LINE_9:
299 px_exti_9_handler = exti_handler;
300 LL_SYSCFG_SetEXTISource(exti_port, LL_SYSCFG_EXTI_LINE9);
301 break;
302#endif
303#if PX_EXTI_CFG_INT10_EN
304 case PX_EXTI_LINE_10:
305 px_exti_10_handler = exti_handler;
306 LL_SYSCFG_SetEXTISource(exti_port, LL_SYSCFG_EXTI_LINE10);
307 break;
308#endif
309#if PX_EXTI_CFG_INT11_EN
310 case PX_EXTI_LINE_11:
311 px_exti_11_handler = exti_handler;
312 LL_SYSCFG_SetEXTISource(exti_port, LL_SYSCFG_EXTI_LINE11);
313 break;
314#endif
315#if PX_EXTI_CFG_INT12_EN
316 case PX_EXTI_LINE_12:
317 px_exti_12_handler = exti_handler;
318 LL_SYSCFG_SetEXTISource(exti_port, LL_SYSCFG_EXTI_LINE12);
319 break;
320#endif
321#if PX_EXTI_CFG_INT13_EN
322 case PX_EXTI_LINE_13:
323 px_exti_13_handler = exti_handler;
324 LL_SYSCFG_SetEXTISource(exti_port, LL_SYSCFG_EXTI_LINE13);
325 break;
326#endif
327#if PX_EXTI_CFG_INT14_EN
328 case PX_EXTI_LINE_14:
329 px_exti_14_handler = exti_handler;
330 LL_SYSCFG_SetEXTISource(exti_port, LL_SYSCFG_EXTI_LINE14);
331 break;
332#endif
333#if PX_EXTI_CFG_INT15_EN
334 case PX_EXTI_LINE_15:
335 px_exti_15_handler = exti_handler;
336 LL_SYSCFG_SetEXTISource(exti_port, LL_SYSCFG_EXTI_LINE15);
337 break;
338#endif
339 default:
340 PX_LOG_E("Invalid EXTI line specified");
341 }
342}
343
345 px_exti_type_t exti_type)
346{
347 uint32_t exti_line_mask = (1 << exti_line);
348
349 switch(exti_type)
350 {
351 case PX_EXTI_TYPE_FALLING_EDGE:
352 LL_EXTI_EnableFallingTrig_0_31(exti_line_mask);
353 LL_EXTI_DisableRisingTrig_0_31(exti_line_mask);
354 break;
355 case PX_EXTI_TYPE_RISING_EDGE:
356 LL_EXTI_EnableRisingTrig_0_31(exti_line_mask);
357 LL_EXTI_DisableFallingTrig_0_31(exti_line_mask);
358 break;
359 case PX_EXTI_TYPE_BOTH_EDGES:
360 LL_EXTI_EnableFallingTrig_0_31(exti_line_mask);
361 LL_EXTI_EnableRisingTrig_0_31(exti_line_mask);
362 break;
363 default:
364 PX_LOG_E("Invalid EXTI type specified");
365 break;
366 }
367}
368
370{
371 uint32_t exti_line_mask = (1 << exti_line);
372
373 LL_EXTI_EnableIT_0_31(exti_line_mask);
374}
375
377{
378 uint32_t exti_line_mask = (1 << exti_line);
379
380 LL_EXTI_DisableIT_0_31(exti_line_mask);
381}
#define PX_LOG_NAME(name)
Macro to declare a log name string once for each file to reduce code size.
Definition: px_log.h:349
#define PX_LOG_E(format,...)
Macro to display a formatted ERROR message.
Definition: px_log.h:377
px_exti_port_t
External interrupt port.
Definition: px_exti.h:120
void px_exti_type_set(px_exti_line_t exti_line, px_exti_type_t exti_type)
Set External Interrupt type (fallig or rising edge or both)
Definition: px_exti.c:344
void px_exti_disable(px_exti_line_t exti_line)
Disable External Interrupt.
Definition: px_exti.c:376
void px_exti_init(void)
Initialise External Interrupt driver.
Definition: px_exti.c:221
void px_exti_enable(px_exti_line_t exti_line)
Enable External Interrupt.
Definition: px_exti.c:369
px_exti_type_t
External interrupt type.
Definition: px_exti.h:131
px_exti_line_t
External Interupt line.
Definition: px_exti.h:99
void(* px_exti_handler_t)(void)
Definition for a pointer to a function that will be called when the external interrupt triggers.
Definition: px_exti.h:142
void px_exti_open(px_exti_port_t exti_port, px_exti_line_t exti_line, px_exti_handler_t exti_handler)
Configure External Interrupt.
Definition: px_exti.c:237