Skip to content

Commit 9adfb6a

Browse files
committed
Add basic DMA handlers.
1 parent c670e31 commit 9adfb6a

File tree

2 files changed

+429
-0
lines changed

2 files changed

+429
-0
lines changed

cores/arduino/stm32/dma.c

Lines changed: 370 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,370 @@
1+
/**
2+
******************************************************************************
3+
* @file dma.c
4+
* @author xC0000005
5+
* @version V1.0.0
6+
* @date 12-July-2019
7+
* @brief provide dma callbacks for dma
8+
*
9+
******************************************************************************
10+
* @attention
11+
*
12+
* <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
13+
*
14+
* Redistribution and use in source and binary forms, with or without modification,
15+
* are permitted provided that the following conditions are met:
16+
* 1. Redistributions of source code must retain the above copyright notice,
17+
* this list of conditions and the following disclaimer.
18+
* 2. Redistributions in binary form must reproduce the above copyright notice,
19+
* this list of conditions and the following disclaimer in the documentation
20+
* and/or other materials provided with the distribution.
21+
* 3. Neither the name of STMicroelectronics nor the names of its contributors
22+
* may be used to endorse or promote products derived from this software
23+
* without specific prior written permission.
24+
*
25+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
28+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
29+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
31+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
33+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35+
*
36+
******************************************************************************
37+
*/
38+
#include <stddef.h>
39+
#include "dma.h"
40+
41+
#define NC -1
42+
43+
typedef enum
44+
{
45+
#ifdef DMA1_Channel1
46+
DMA1_CHANNEL1_INDEX,
47+
#endif
48+
#ifdef DMA1_Channel2
49+
DMA1_CHANNEL2_INDEX,
50+
#endif
51+
#ifdef DMA1_Channel3
52+
DMA1_CHANNEL3_INDEX,
53+
#endif
54+
#ifdef DMA1_Channel4
55+
DMA1_CHANNEL4_INDEX,
56+
#endif
57+
#ifdef DMA1_Channel5
58+
DMA1_CHANNEL5_INDEX,
59+
#endif
60+
#ifdef DMA1_Channel6
61+
DMA1_CHANNEL6_INDEX,
62+
#endif
63+
#ifdef DMA1_Channel7
64+
DMA1_CHANNEL7_INDEX,
65+
#endif
66+
#ifdef DMA2_Channel1
67+
DMA2_CHANNEL1_INDEX,
68+
#endif
69+
#ifdef DMA2_Channel2
70+
DMA2_CHANNEL2_INDEX,
71+
#endif
72+
#ifdef DMA2_Channel3
73+
DMA2_CHANNEL3_INDEX,
74+
#endif
75+
#ifdef DMA2_Channel4
76+
DMA2_CHANNEL4_INDEX,
77+
#endif
78+
#ifdef DMA2_Channel5
79+
DMA2_CHANNEL5_INDEX,
80+
#endif
81+
#ifdef DMA2_Channel6
82+
DMA2_CHANNEL6_INDEX,
83+
#endif
84+
#ifdef DMA2_Channel7
85+
DMA2_CHANNEL7_INDEX,
86+
#endif
87+
#ifdef DMA2_Channel8
88+
DMA2_CHANNEL8_INDEX,
89+
#endif
90+
DMA_CHANNEL_NUM
91+
} dma_index_t;
92+
93+
static DMA_HandleTypeDef *dma_handles[DMA_CHANNEL_NUM] = {NULL};
94+
95+
/**
96+
* @brief This function determines the dma index
97+
* @param instance : dma instance
98+
* @retval None
99+
*/
100+
static dma_index_t get_dma_index(DMA_Channel_TypeDef *instance) {
101+
switch ((uint32_t)instance) {
102+
#ifdef DMA1_Channel1
103+
case (uint32_t)DMA1_Channel1:
104+
return DMA1_CHANNEL1_INDEX;
105+
#endif
106+
#ifdef DMA1_Channel2
107+
case (uint32_t)DMA1_Channel2:
108+
return DMA1_CHANNEL2_INDEX;
109+
#endif
110+
#ifdef DMA1_Channel3
111+
case (uint32_t)DMA1_Channel3:
112+
return DMA1_CHANNEL3_INDEX;
113+
#endif
114+
#ifdef DMA1_Channel4
115+
case (uint32_t)DMA1_Channel4:
116+
return DMA1_CHANNEL4_INDEX;
117+
#endif
118+
#ifdef DMA1_Channel5
119+
case (uint32_t)DMA1_Channel5:
120+
return DMA1_CHANNEL5_INDEX;
121+
#endif
122+
#ifdef DMA1_Channel6
123+
case (uint32_t)DMA1_Channel6:
124+
return DMA1_CHANNEL6_INDEX;
125+
#endif
126+
#ifdef DMA1_Channel7
127+
case (uint32_t)DMA1_Channel7:
128+
return DMA1_CHANNEL7_INDEX;
129+
#endif
130+
#ifdef DMA2_Channel1
131+
case (uint32_t)DMA2_Channel1:
132+
return DMA2_CHANNEL1_INDEX;
133+
#endif
134+
#ifdef DMA2_Channel2
135+
case (uint32_t)DMA2_Channel2:
136+
return DMA2_CHANNEL2_INDEX;
137+
#endif
138+
#ifdef DMA2_Channel3
139+
case (uint32_t)DMA2_Channel3:
140+
return DMA2_CHANNEL3_INDEX;
141+
#endif
142+
#ifdef DMA2_Channel4
143+
case (uint32_t)DMA2_Channel4:
144+
return DMA2_CHANNEL4_INDEX;
145+
#endif
146+
#ifdef DMA2_Channel5
147+
case (uint32_t)DMA2_Channel5:
148+
return DMA2_CHANNEL5_INDEX;
149+
#endif
150+
#ifdef DMA2_Channel6
151+
case (uint32_t)DMA2_Channel6:
152+
return DMA2_CHANNEL6_INDEX;
153+
#endif
154+
#ifdef DMA2_Channel7
155+
case (uint32_t)DMA2_Channel7:
156+
return DMA2_CHANNEL7_INDEX;
157+
#endif
158+
#ifdef DMA2_Channel8
159+
case (uint32_t)DMA2_Channel8:
160+
return DMA2_CHANNEL8_INDEX;
161+
#endif
162+
default:
163+
return NC;
164+
}
165+
}
166+
167+
/**
168+
* @brief This function will store the DMA handle in the appropriate slot
169+
* @param dma_handle : dma handle
170+
* @retval None
171+
*/
172+
void prepare_dma(DMA_HandleTypeDef *dma_handle) {
173+
dma_index_t dma_index = get_dma_index(dma_handle->Instance);
174+
if (dma_index == NC) {
175+
return;
176+
}
177+
dma_handles[dma_index] = dma_handle;
178+
}
179+
180+
/**
181+
* @brief This function will remove the DMA handle from the appropriate slot
182+
* @param dma_handle : dma handle
183+
* @retval None
184+
*/
185+
void end_dma(DMA_HandleTypeDef *dma_handle) {
186+
dma_index_t dma_index = get_dma_index(dma_handle->Instance);
187+
if (dma_index == NC) {
188+
return;
189+
}
190+
dma_handles[dma_index] = NULL;
191+
}
192+
193+
#ifdef DMA1_Channel1
194+
/**
195+
* @brief DMA1 Channel1 IRQHandler
196+
* @param None
197+
* @retval None
198+
*/
199+
void DMA1_Channel1_IRQHandler() {
200+
if (dma_handles[DMA1_CHANNEL1_INDEX] != NULL)
201+
HAL_DMA_IRQHandler(dma_handles[DMA1_CHANNEL1_INDEX]);
202+
}
203+
#endif
204+
205+
#ifdef DMA1_Channel2
206+
/**
207+
* @brief DMA1 Channel2 IRQHandler
208+
* @param None
209+
* @retval None
210+
*/
211+
void DMA1_Channel2_IRQHandler() {
212+
if (dma_handles[DMA1_CHANNEL2_INDEX] != NULL)
213+
HAL_DMA_IRQHandler(dma_handles[DMA1_CHANNEL2_INDEX]);
214+
}
215+
#endif
216+
217+
#ifdef DMA1_Channel3
218+
/**
219+
* @brief DMA1 Channel3 IRQHandler
220+
* @param None
221+
* @retval None
222+
*/
223+
void DMA1_Channel3_IRQHandler() {
224+
if (dma_handles[DMA1_CHANNEL3_INDEX] != NULL)
225+
HAL_DMA_IRQHandler(dma_handles[DMA1_CHANNEL3_INDEX]);
226+
}
227+
#endif
228+
229+
#ifdef DMA1_Channel4
230+
/**
231+
* @brief DMA1 Channel4 IRQHandler
232+
* @param None
233+
* @retval None
234+
*/
235+
void DMA1_Channel4_IRQHandler() {
236+
if (dma_handles[DMA1_CHANNEL4_INDEX] != NULL)
237+
HAL_DMA_IRQHandler(dma_handles[DMA1_CHANNEL4_INDEX]);
238+
}
239+
#endif
240+
241+
#ifdef DMA1_Channel5
242+
/**
243+
* @brief DMA1 Channel5 IRQHandler
244+
* @param None
245+
* @retval None
246+
*/
247+
void DMA1_Channel5_IRQHandler() {
248+
if (dma_handles[DMA1_CHANNEL5_INDEX] != NULL)
249+
HAL_DMA_IRQHandler(dma_handles[DMA1_CHANNEL5_INDEX]);
250+
}
251+
#endif
252+
253+
#ifdef DMA1_Channel6/**
254+
* @brief DMA1 Channel6 IRQHandler
255+
* @param None
256+
* @retval None
257+
*/
258+
void DMA1_Channel6_IRQHandler() {
259+
if (dma_handles[DMA1_CHANNEL6_INDEX] != NULL)
260+
HAL_DMA_IRQHandler(dma_handles[DMA1_CHANNEL6_INDEX]);
261+
}
262+
#endif
263+
264+
#ifdef DMA1_Channel7
265+
/**
266+
* @brief DMA1 Channel3 IRQHandler
267+
* @param None
268+
* @retval None
269+
*/
270+
void DMA1_Channel7_IRQHandler() {
271+
if (dma_handles[DMA1_CHANNEL7_INDEX] != NULL)
272+
HAL_DMA_IRQHandler(dma_handles[DMA1_CHANNEL7_INDEX]);
273+
}
274+
#endif
275+
276+
#ifdef DMA2_Channel1
277+
/**
278+
* @brief DMA2 Channel1 IRQHandler
279+
* @param None
280+
* @retval None
281+
*/
282+
void DMA2_Channel1_IRQHandler() {
283+
if (dma_handles[DMA2_CHANNEL1_INDEX] != NULL)
284+
HAL_DMA_IRQHandler(dma_handles[DMA2_CHANNEL1_INDEX]);
285+
}
286+
#endif
287+
288+
#ifdef DMA2_Channel2
289+
/**
290+
* @brief DMA2 Channel2 IRQHandler
291+
* @param None
292+
* @retval None
293+
*/
294+
void DMA2_Channel1_IRQHandler() {
295+
if (dma_handles[DMA2_CHANNEL2_INDEX] != NULL)
296+
HAL_DMA_IRQHandler(dma_handles[DMA2_CHANNEL2_INDEX]);
297+
}
298+
#endif
299+
300+
#ifdef DMA2_Channel3
301+
/**
302+
* @brief DMA2 Channel3 IRQHandler
303+
* @param None
304+
* @retval None
305+
*/
306+
void DMA2_Channel3_IRQHandler() {
307+
if (dma_handles[DMA2_CHANNEL3_INDEX] != NULL)
308+
HAL_DMA_IRQHandler(dma_handles[DMA2_CHANNEL3_INDEX]);
309+
}
310+
#endif
311+
312+
#ifdef DMA2_Channel4
313+
/**
314+
* @brief DMA2 Channel4 IRQHandler
315+
* @param None
316+
* @retval None
317+
*/
318+
void DMA2_Channel4_IRQHandler() {
319+
if (dma_handles[DMA2_CHANNEL4_INDEX] != NULL)
320+
HAL_DMA_IRQHandler(dma_handles[DMA2_CHANNEL4_INDEX]);
321+
}
322+
#endif
323+
324+
#ifdef DMA2_Channel5
325+
/**
326+
* @brief DMA2 Channel5 IRQHandler
327+
* @param None
328+
* @retval None
329+
*/
330+
void DMA2_Channel5_IRQHandler() {
331+
if (dma_handles[DMA2_CHANNEL5_INDEX] != NULL)
332+
HAL_DMA_IRQHandler(dma_handles[DMA2_CHANNEL5_INDEX]);
333+
}
334+
#endif
335+
336+
#ifdef DMA2_Channel6
337+
/**
338+
* @brief DMA2 Channel6 IRQHandler
339+
* @param None
340+
* @retval None
341+
*/
342+
void DMA2_Channel6_IRQHandler() {
343+
if (dma_handles[DMA2_CHANNEL6_INDEX] != NULL)
344+
HAL_DMA_IRQHandler(dma_handles[DMA2_CHANNEL6_INDEX]);
345+
}
346+
#endif
347+
348+
#ifdef DMA2_Channel7
349+
/**
350+
* @brief DMA2 Channel7 IRQHandler
351+
* @param None
352+
* @retval None
353+
*/
354+
void DMA2_Channel7_IRQHandler() {
355+
if (dma_handles[DMA2_CHANNEL7_INDEX] != NULL)
356+
HAL_DMA_IRQHandler(dma_handles[DMA2_CHANNEL7_INDEX]);
357+
}
358+
#endif
359+
360+
#ifdef DMA2_Channel8
361+
/**
362+
* @brief DMA2 Channel8 IRQHandler
363+
* @param None
364+
* @retval None
365+
*/
366+
void DMA2_Channel8_IRQHandler() {
367+
if (dma_handles[DMA2_CHANNEL8_INDEX] != NULL)
368+
HAL_DMA_IRQHandler(dma_handles[DMA2_CHANNEL8_INDEX]);
369+
}
370+
#endif

0 commit comments

Comments
 (0)