libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
ch32_dma.cpp
1// NOLINTBEGIN(cppcoreguidelines-pro-type-cstyle-cast,performance-no-int-to-ptr)
2#include "ch32_dma.hpp"
3
4static struct
5{
6 ch32_dma_callback_t fun;
7 void* arg;
8} ch32_dma_callback_map[CH32_DMA_CHANNEL_NUMBER] = {};
9
10void ch32_dma_register_callback(ch32_dma_channel_t id, ch32_dma_callback_t callback,
11 void* arg)
12{
13 ASSERT(id < CH32_DMA_CHANNEL_NUMBER);
14 ch32_dma_callback_map[id] = {callback, arg};
15}
16
17ch32_dma_channel_t ch32_dma_get_id(DMA_Channel_TypeDef* channel)
18{
19#if defined(DMA1_Channel1)
20 if (channel == DMA1_Channel1)
21 {
22 return CH32_DMA1_CHANNEL1;
23 }
24#endif
25
26#if defined(DMA1_Channel2)
27 if (channel == DMA1_Channel2)
28 {
29 return CH32_DMA1_CHANNEL2;
30 }
31#endif
32
33#if defined(DMA1_Channel3)
34 if (channel == DMA1_Channel3)
35 {
36 return CH32_DMA1_CHANNEL3;
37 }
38#endif
39
40#if defined(DMA1_Channel4)
41 if (channel == DMA1_Channel4)
42 {
43 return CH32_DMA1_CHANNEL4;
44 }
45#endif
46
47#if defined(DMA1_Channel5)
48 if (channel == DMA1_Channel5)
49 {
50 return CH32_DMA1_CHANNEL5;
51 }
52#endif
53
54#if defined(DMA1_Channel6)
55 if (channel == DMA1_Channel6)
56 {
57 return CH32_DMA1_CHANNEL6;
58 }
59#endif
60
61#if defined(DMA1_Channel7)
62 if (channel == DMA1_Channel7)
63 {
64 return CH32_DMA1_CHANNEL7;
65 }
66#endif
67
68#if defined(DMA1_Channel8)
69 if (channel == DMA1_Channel8)
70 {
71 return CH32_DMA1_CHANNEL8;
72 }
73#endif
74
75#if defined(DMA2_Channel1)
76 if (channel == DMA2_Channel1)
77 {
78 return CH32_DMA2_CHANNEL1;
79 }
80#endif
81
82#if defined(DMA2_Channel2)
83 if (channel == DMA2_Channel2)
84 {
85 return CH32_DMA2_CHANNEL2;
86 }
87#endif
88
89#if defined(DMA2_Channel3)
90 if (channel == DMA2_Channel3)
91 {
92 return CH32_DMA2_CHANNEL3;
93 }
94#endif
95
96#if defined(DMA2_Channel4)
97 if (channel == DMA2_Channel4)
98 {
99 return CH32_DMA2_CHANNEL4;
100 }
101#endif
102
103#if defined(DMA2_Channel5)
104 if (channel == DMA2_Channel5)
105 {
106 return CH32_DMA2_CHANNEL5;
107 }
108#endif
109
110#if defined(DMA2_Channel6)
111 if (channel == DMA2_Channel6)
112 {
113 return CH32_DMA2_CHANNEL6;
114 }
115#endif
116
117#if defined(DMA2_Channel7)
118 if (channel == DMA2_Channel7)
119 {
120 return CH32_DMA2_CHANNEL7;
121 }
122#endif
123
124#if defined(DMA2_Channel8)
125 if (channel == DMA2_Channel8)
126 {
127 return CH32_DMA2_CHANNEL8;
128 }
129#endif
130
131#if defined(DMA2_Channel9)
132 if (channel == DMA2_Channel9)
133 {
134 return CH32_DMA2_CHANNEL9;
135 }
136#endif
137
138#if defined(DMA2_Channel10)
139 if (channel == DMA2_Channel10)
140 {
141 return CH32_DMA2_CHANNEL10;
142 }
143#endif
144
145#if defined(DMA2_Channel11)
146 if (channel == DMA2_Channel11)
147 {
148 return CH32_DMA2_CHANNEL11;
149 }
150#endif
151
152 return CH32_DMA_CHANNEL_NONE;
153}
154
155DMA_Channel_TypeDef* ch32_dma_get_channel(ch32_dma_channel_t id)
156{
157#if defined(DMA1_Channel1)
158 if (id == CH32_DMA1_CHANNEL1)
159 {
160 return DMA1_Channel1;
161 }
162#endif
163
164#if defined(DMA1_Channel2)
165 if (id == CH32_DMA1_CHANNEL2)
166 {
167 return DMA1_Channel2;
168 }
169#endif
170
171#if defined(DMA1_Channel3)
172 if (id == CH32_DMA1_CHANNEL3)
173 {
174 return DMA1_Channel3;
175 }
176#endif
177
178#if defined(DMA1_Channel4)
179 if (id == CH32_DMA1_CHANNEL4)
180 {
181 return DMA1_Channel4;
182 }
183#endif
184
185#if defined(DMA1_Channel5)
186 if (id == CH32_DMA1_CHANNEL5)
187 {
188 return DMA1_Channel5;
189 }
190#endif
191
192#if defined(DMA1_Channel6)
193 if (id == CH32_DMA1_CHANNEL6)
194 {
195 return DMA1_Channel6;
196 }
197#endif
198
199#if defined(DMA1_Channel7)
200 if (id == CH32_DMA1_CHANNEL7)
201 {
202 return DMA1_Channel7;
203 }
204#endif
205
206#if defined(DMA1_Channel8)
207 if (id == CH32_DMA1_CHANNEL8)
208 {
209 return DMA1_Channel8;
210 }
211#endif
212
213#if defined(DMA2_Channel1)
214 if (id == CH32_DMA2_CHANNEL1)
215 {
216 return DMA2_Channel1;
217 }
218#endif
219
220#if defined(DMA2_Channel2)
221 if (id == CH32_DMA2_CHANNEL2)
222 {
223 return DMA2_Channel2;
224 }
225#endif
226
227#if defined(DMA2_Channel3)
228 if (id == CH32_DMA2_CHANNEL3)
229 {
230 return DMA2_Channel3;
231 }
232#endif
233
234#if defined(DMA2_Channel4)
235 if (id == CH32_DMA2_CHANNEL4)
236 {
237 return DMA2_Channel4;
238 }
239#endif
240
241#if defined(DMA2_Channel5)
242 if (id == CH32_DMA2_CHANNEL5)
243 {
244 return DMA2_Channel5;
245 }
246#endif
247
248#if defined(DMA2_Channel6)
249 if (id == CH32_DMA2_CHANNEL6)
250 {
251 return DMA2_Channel6;
252 }
253#endif
254
255#if defined(DMA2_Channel7)
256 if (id == CH32_DMA2_CHANNEL7)
257 {
258 return DMA2_Channel7;
259 }
260#endif
261
262#if defined(DMA2_Channel8)
263 if (id == CH32_DMA2_CHANNEL8)
264 {
265 return DMA2_Channel8;
266 }
267#endif
268
269#if defined(DMA2_Channel9)
270 if (id == CH32_DMA2_CHANNEL9)
271 {
272 return DMA2_Channel9;
273 }
274#endif
275
276#if defined(DMA2_Channel10)
277 if (id == CH32_DMA2_CHANNEL10)
278 {
279 return DMA2_Channel10;
280 }
281#endif
282
283#if defined(DMA2_Channel11)
284 if (id == CH32_DMA2_CHANNEL11)
285 {
286 return DMA2_Channel11;
287 }
288#endif
289
290 return NULL;
291}
292
293#if defined(DMA1_Channel1)
294// NOLINTNEXTLINE(readability-identifier-naming)
295extern "C" void DMA1_Channel1_IRQHandler(void)
296 __attribute__((interrupt("WCH-Interrupt-fast")));
297// NOLINTNEXTLINE(readability-identifier-naming)
298extern "C" void DMA1_Channel1_IRQHandler(void)
299{
300 if (ch32_dma_callback_map[CH32_DMA1_CHANNEL1].fun != nullptr)
301 {
302 ch32_dma_callback_map[CH32_DMA1_CHANNEL1].fun(
303 ch32_dma_callback_map[CH32_DMA1_CHANNEL1].arg);
304 }
305}
306#endif
307
308#if defined(DMA1_Channel2)
309// NOLINTNEXTLINE(readability-identifier-naming)
310extern "C" void DMA1_Channel2_IRQHandler(void)
311 __attribute__((interrupt("WCH-Interrupt-fast")));
312// NOLINTNEXTLINE(readability-identifier-naming)
313extern "C" void DMA1_Channel2_IRQHandler(void)
314{
315 if (ch32_dma_callback_map[CH32_DMA1_CHANNEL2].fun != nullptr)
316 {
317 ch32_dma_callback_map[CH32_DMA1_CHANNEL2].fun(
318 ch32_dma_callback_map[CH32_DMA1_CHANNEL2].arg);
319 }
320}
321#endif
322
323#if defined(DMA1_Channel3)
324// NOLINTNEXTLINE(readability-identifier-naming)
325extern "C" void DMA1_Channel3_IRQHandler(void)
326 __attribute__((interrupt("WCH-Interrupt-fast")));
327// NOLINTNEXTLINE(readability-identifier-naming)
328extern "C" void DMA1_Channel3_IRQHandler(void)
329{
330 if (ch32_dma_callback_map[CH32_DMA1_CHANNEL3].fun != nullptr)
331 {
332 ch32_dma_callback_map[CH32_DMA1_CHANNEL3].fun(
333 ch32_dma_callback_map[CH32_DMA1_CHANNEL3].arg);
334 }
335}
336#endif
337
338#if defined(DMA1_Channel4)
339// NOLINTNEXTLINE(readability-identifier-naming)
340extern "C" void DMA1_Channel4_IRQHandler(void)
341 __attribute__((interrupt("WCH-Interrupt-fast")));
342// NOLINTNEXTLINE(readability-identifier-naming)
343extern "C" void DMA1_Channel4_IRQHandler(void)
344{
345 if (ch32_dma_callback_map[CH32_DMA1_CHANNEL4].fun != nullptr)
346 {
347 ch32_dma_callback_map[CH32_DMA1_CHANNEL4].fun(
348 ch32_dma_callback_map[CH32_DMA1_CHANNEL4].arg);
349 }
350}
351#endif
352
353#if defined(DMA1_Channel5)
354// NOLINTNEXTLINE(readability-identifier-naming)
355extern "C" void DMA1_Channel5_IRQHandler(void)
356 __attribute__((interrupt("WCH-Interrupt-fast")));
357// NOLINTNEXTLINE(readability-identifier-naming)
358extern "C" void DMA1_Channel5_IRQHandler(void)
359{
360 if (ch32_dma_callback_map[CH32_DMA1_CHANNEL5].fun != nullptr)
361 {
362 ch32_dma_callback_map[CH32_DMA1_CHANNEL5].fun(
363 ch32_dma_callback_map[CH32_DMA1_CHANNEL5].arg);
364 }
365}
366#endif
367
368#if defined(DMA1_Channel6)
369// NOLINTNEXTLINE(readability-identifier-naming)
370extern "C" void DMA1_Channel6_IRQHandler(void)
371 __attribute__((interrupt("WCH-Interrupt-fast")));
372// NOLINTNEXTLINE(readability-identifier-naming)
373extern "C" void DMA1_Channel6_IRQHandler(void)
374{
375 if (ch32_dma_callback_map[CH32_DMA1_CHANNEL6].fun != nullptr)
376 {
377 ch32_dma_callback_map[CH32_DMA1_CHANNEL6].fun(
378 ch32_dma_callback_map[CH32_DMA1_CHANNEL6].arg);
379 }
380}
381#endif
382
383#if defined(DMA1_Channel7)
384// NOLINTNEXTLINE(readability-identifier-naming)
385extern "C" void DMA1_Channel7_IRQHandler(void)
386 __attribute__((interrupt("WCH-Interrupt-fast")));
387// NOLINTNEXTLINE(readability-identifier-naming)
388extern "C" void DMA1_Channel7_IRQHandler(void)
389{
390 if (ch32_dma_callback_map[CH32_DMA1_CHANNEL7].fun != nullptr)
391 {
392 ch32_dma_callback_map[CH32_DMA1_CHANNEL7].fun(
393 ch32_dma_callback_map[CH32_DMA1_CHANNEL7].arg);
394 }
395}
396#endif
397
398#if defined(DMA1_Channel8)
399// NOLINTNEXTLINE(readability-identifier-naming)
400extern "C" void DMA1_Channel8_IRQHandler(void)
401 __attribute__((interrupt("WCH-Interrupt-fast")));
402// NOLINTNEXTLINE(readability-identifier-naming)
403extern "C" void DMA1_Channel8_IRQHandler(void)
404{
405 if (ch32_dma_callback_map[CH32_DMA1_CHANNEL8].fun != nullptr)
406 {
407 ch32_dma_callback_map[CH32_DMA1_CHANNEL8].fun(
408 ch32_dma_callback_map[CH32_DMA1_CHANNEL8].arg);
409 }
410}
411#endif
412
413#if defined(DMA2_Channel1)
414// NOLINTNEXTLINE(readability-identifier-naming)
415extern "C" void DMA2_Channel1_IRQHandler(void)
416 __attribute__((interrupt("WCH-Interrupt-fast")));
417// NOLINTNEXTLINE(readability-identifier-naming)
418extern "C" void DMA2_Channel1_IRQHandler(void)
419{
420 if (ch32_dma_callback_map[CH32_DMA2_CHANNEL1].fun != nullptr)
421 {
422 ch32_dma_callback_map[CH32_DMA2_CHANNEL1].fun(
423 ch32_dma_callback_map[CH32_DMA2_CHANNEL1].arg);
424 }
425}
426#endif
427
428#if defined(DMA2_Channel2)
429// NOLINTNEXTLINE(readability-identifier-naming)
430extern "C" void DMA2_Channel2_IRQHandler(void)
431 __attribute__((interrupt("WCH-Interrupt-fast")));
432// NOLINTNEXTLINE(readability-identifier-naming)
433extern "C" void DMA2_Channel2_IRQHandler(void)
434{
435 if (ch32_dma_callback_map[CH32_DMA2_CHANNEL2].fun != nullptr)
436 {
437 ch32_dma_callback_map[CH32_DMA2_CHANNEL2].fun(
438 ch32_dma_callback_map[CH32_DMA2_CHANNEL2].arg);
439 }
440}
441#endif
442
443#if defined(DMA2_Channel3)
444// NOLINTNEXTLINE(readability-identifier-naming)
445extern "C" void DMA2_Channel3_IRQHandler(void)
446 __attribute__((interrupt("WCH-Interrupt-fast")));
447// NOLINTNEXTLINE(readability-identifier-naming)
448extern "C" void DMA2_Channel3_IRQHandler(void)
449{
450 if (ch32_dma_callback_map[CH32_DMA2_CHANNEL3].fun != nullptr)
451 {
452 ch32_dma_callback_map[CH32_DMA2_CHANNEL3].fun(
453 ch32_dma_callback_map[CH32_DMA2_CHANNEL3].arg);
454 }
455}
456#endif
457
458#if defined(DMA2_Channel4)
459// NOLINTNEXTLINE(readability-identifier-naming)
460extern "C" void DMA2_Channel4_IRQHandler(void)
461 __attribute__((interrupt("WCH-Interrupt-fast")));
462// NOLINTNEXTLINE(readability-identifier-naming)
463extern "C" void DMA2_Channel4_IRQHandler(void)
464{
465 if (ch32_dma_callback_map[CH32_DMA2_CHANNEL4].fun != nullptr)
466 {
467 ch32_dma_callback_map[CH32_DMA2_CHANNEL4].fun(
468 ch32_dma_callback_map[CH32_DMA2_CHANNEL4].arg);
469 }
470}
471#endif
472
473#if defined(DMA2_Channel5)
474// NOLINTNEXTLINE(readability-identifier-naming)
475extern "C" void DMA2_Channel5_IRQHandler(void)
476 __attribute__((interrupt("WCH-Interrupt-fast")));
477// NOLINTNEXTLINE(readability-identifier-naming)
478extern "C" void DMA2_Channel5_IRQHandler(void)
479{
480 if (ch32_dma_callback_map[CH32_DMA2_CHANNEL5].fun != nullptr)
481 {
482 ch32_dma_callback_map[CH32_DMA2_CHANNEL5].fun(
483 ch32_dma_callback_map[CH32_DMA2_CHANNEL5].arg);
484 }
485}
486#endif
487
488#if defined(DMA2_Channel6)
489// NOLINTNEXTLINE(readability-identifier-naming)
490extern "C" void DMA2_Channel6_IRQHandler(void)
491 __attribute__((interrupt("WCH-Interrupt-fast")));
492// NOLINTNEXTLINE(readability-identifier-naming)
493extern "C" void DMA2_Channel6_IRQHandler(void)
494{
495 if (ch32_dma_callback_map[CH32_DMA2_CHANNEL6].fun != nullptr)
496 {
497 ch32_dma_callback_map[CH32_DMA2_CHANNEL6].fun(
498 ch32_dma_callback_map[CH32_DMA2_CHANNEL6].arg);
499 }
500}
501#endif
502
503#if defined(DMA2_Channel7)
504// NOLINTNEXTLINE(readability-identifier-naming)
505extern "C" void DMA2_Channel7_IRQHandler(void)
506 __attribute__((interrupt("WCH-Interrupt-fast")));
507// NOLINTNEXTLINE(readability-identifier-naming)
508extern "C" void DMA2_Channel7_IRQHandler(void)
509{
510 if (ch32_dma_callback_map[CH32_DMA2_CHANNEL7].fun != nullptr)
511 {
512 ch32_dma_callback_map[CH32_DMA2_CHANNEL7].fun(
513 ch32_dma_callback_map[CH32_DMA2_CHANNEL7].arg);
514 }
515}
516#endif
517
518#if defined(DMA2_Channel8)
519// NOLINTNEXTLINE(readability-identifier-naming)
520extern "C" void DMA2_Channel8_IRQHandler(void)
521 __attribute__((interrupt("WCH-Interrupt-fast")));
522// NOLINTNEXTLINE(readability-identifier-naming)
523extern "C" void DMA2_Channel8_IRQHandler(void)
524{
525 if (ch32_dma_callback_map[CH32_DMA2_CHANNEL8].fun != nullptr)
526 {
527 ch32_dma_callback_map[CH32_DMA2_CHANNEL8].fun(
528 ch32_dma_callback_map[CH32_DMA2_CHANNEL8].arg);
529 }
530}
531#endif
532
533#if defined(DMA2_Channel9)
534// NOLINTNEXTLINE(readability-identifier-naming)
535extern "C" void DMA2_Channel9_IRQHandler(void)
536 __attribute__((interrupt("WCH-Interrupt-fast")));
537// NOLINTNEXTLINE(readability-identifier-naming)
538extern "C" void DMA2_Channel9_IRQHandler(void)
539{
540 if (ch32_dma_callback_map[CH32_DMA2_CHANNEL9].fun != nullptr)
541 {
542 ch32_dma_callback_map[CH32_DMA2_CHANNEL9].fun(
543 ch32_dma_callback_map[CH32_DMA2_CHANNEL9].arg);
544 }
545}
546#endif
547
548#if defined(DMA2_Channel10)
549// NOLINTNEXTLINE(readability-identifier-naming)
550extern "C" void DMA2_Channel10_IRQHandler(void)
551 __attribute__((interrupt("WCH-Interrupt-fast")));
552// NOLINTNEXTLINE(readability-identifier-naming)
553extern "C" void DMA2_Channel10_IRQHandler(void)
554{
555 if (ch32_dma_callback_map[CH32_DMA2_CHANNEL10].fun != nullptr)
556 {
557 ch32_dma_callback_map[CH32_DMA2_CHANNEL10].fun(
558 ch32_dma_callback_map[CH32_DMA2_CHANNEL10].arg);
559 }
560}
561#endif
562
563#if defined(DMA2_Channel11)
564// NOLINTNEXTLINE(readability-identifier-naming)
565extern "C" void DMA2_Channel11_IRQHandler(void)
566 __attribute__((interrupt("WCH-Interrupt-fast")));
567// NOLINTNEXTLINE(readability-identifier-naming)
568extern "C" void DMA2_Channel11_IRQHandler(void)
569{
570 if (ch32_dma_callback_map[CH32_DMA2_CHANNEL11].fun != nullptr)
571 {
572 ch32_dma_callback_map[CH32_DMA2_CHANNEL11].fun(
573 ch32_dma_callback_map[CH32_DMA2_CHANNEL11].arg);
574 }
575}
576#endif
577
578// NOLINTEND(cppcoreguidelines-pro-type-cstyle-cast,performance-no-int-to-ptr)