]> git.sur5r.net Git - freertos/blob - Demo/CORTEX_STM32F100_Atollic/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dma.c
Added STM32 discovery board simple demo project.
[freertos] / Demo / CORTEX_STM32F100_Atollic / Libraries / STM32F10x_StdPeriph_Driver / src / stm32f10x_dma.c
1 /**\r
2   ******************************************************************************\r
3   * @file    stm32f10x_dma.c\r
4   * @author  MCD Application Team\r
5   * @version V3.4.0\r
6   * @date    10/15/2010\r
7   * @brief   This file provides all the DMA firmware functions.\r
8   ******************************************************************************\r
9   * @copy\r
10   *\r
11   * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS\r
12   * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE\r
13   * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY\r
14   * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING\r
15   * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE\r
16   * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.\r
17   *\r
18   * <h2><center>&copy; COPYRIGHT 2010 STMicroelectronics</center></h2>\r
19   */ \r
20 \r
21 /* Includes ------------------------------------------------------------------*/\r
22 #include "stm32f10x_dma.h"\r
23 #include "stm32f10x_rcc.h"\r
24 \r
25 /** @addtogroup STM32F10x_StdPeriph_Driver\r
26   * @{\r
27   */\r
28 \r
29 /** @defgroup DMA \r
30   * @brief DMA driver modules\r
31   * @{\r
32   */ \r
33 \r
34 /** @defgroup DMA_Private_TypesDefinitions\r
35   * @{\r
36   */ \r
37 /**\r
38   * @}\r
39   */\r
40 \r
41 /** @defgroup DMA_Private_Defines\r
42   * @{\r
43   */\r
44 \r
45 \r
46 /* DMA1 Channelx interrupt pending bit masks */\r
47 #define DMA1_Channel1_IT_Mask    ((uint32_t)(DMA_ISR_GIF1 | DMA_ISR_TCIF1 | DMA_ISR_HTIF1 | DMA_ISR_TEIF1))\r
48 #define DMA1_Channel2_IT_Mask    ((uint32_t)(DMA_ISR_GIF2 | DMA_ISR_TCIF2 | DMA_ISR_HTIF2 | DMA_ISR_TEIF2))\r
49 #define DMA1_Channel3_IT_Mask    ((uint32_t)(DMA_ISR_GIF3 | DMA_ISR_TCIF3 | DMA_ISR_HTIF3 | DMA_ISR_TEIF3))\r
50 #define DMA1_Channel4_IT_Mask    ((uint32_t)(DMA_ISR_GIF4 | DMA_ISR_TCIF4 | DMA_ISR_HTIF4 | DMA_ISR_TEIF4))\r
51 #define DMA1_Channel5_IT_Mask    ((uint32_t)(DMA_ISR_GIF5 | DMA_ISR_TCIF5 | DMA_ISR_HTIF5 | DMA_ISR_TEIF5))\r
52 #define DMA1_Channel6_IT_Mask    ((uint32_t)(DMA_ISR_GIF6 | DMA_ISR_TCIF6 | DMA_ISR_HTIF6 | DMA_ISR_TEIF6))\r
53 #define DMA1_Channel7_IT_Mask    ((uint32_t)(DMA_ISR_GIF7 | DMA_ISR_TCIF7 | DMA_ISR_HTIF7 | DMA_ISR_TEIF7))\r
54 \r
55 /* DMA2 Channelx interrupt pending bit masks */\r
56 #define DMA2_Channel1_IT_Mask    ((uint32_t)(DMA_ISR_GIF1 | DMA_ISR_TCIF1 | DMA_ISR_HTIF1 | DMA_ISR_TEIF1))\r
57 #define DMA2_Channel2_IT_Mask    ((uint32_t)(DMA_ISR_GIF2 | DMA_ISR_TCIF2 | DMA_ISR_HTIF2 | DMA_ISR_TEIF2))\r
58 #define DMA2_Channel3_IT_Mask    ((uint32_t)(DMA_ISR_GIF3 | DMA_ISR_TCIF3 | DMA_ISR_HTIF3 | DMA_ISR_TEIF3))\r
59 #define DMA2_Channel4_IT_Mask    ((uint32_t)(DMA_ISR_GIF4 | DMA_ISR_TCIF4 | DMA_ISR_HTIF4 | DMA_ISR_TEIF4))\r
60 #define DMA2_Channel5_IT_Mask    ((uint32_t)(DMA_ISR_GIF5 | DMA_ISR_TCIF5 | DMA_ISR_HTIF5 | DMA_ISR_TEIF5))\r
61 \r
62 /* DMA2 FLAG mask */\r
63 #define FLAG_Mask                ((uint32_t)0x10000000)\r
64 \r
65 /* DMA registers Masks */\r
66 #define CCR_CLEAR_Mask           ((uint32_t)0xFFFF800F)\r
67 \r
68 /**\r
69   * @}\r
70   */\r
71 \r
72 /** @defgroup DMA_Private_Macros\r
73   * @{\r
74   */\r
75 \r
76 /**\r
77   * @}\r
78   */\r
79 \r
80 /** @defgroup DMA_Private_Variables\r
81   * @{\r
82   */\r
83 \r
84 /**\r
85   * @}\r
86   */\r
87 \r
88 /** @defgroup DMA_Private_FunctionPrototypes\r
89   * @{\r
90   */\r
91 \r
92 /**\r
93   * @}\r
94   */\r
95 \r
96 /** @defgroup DMA_Private_Functions\r
97   * @{\r
98   */\r
99 \r
100 /**\r
101   * @brief  Deinitializes the DMAy Channelx registers to their default reset\r
102   *   values.\r
103   * @param  DMAy_Channelx: where y can be 1 or 2 to select the DMA and\r
104   *   x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel.\r
105   * @retval None\r
106   */\r
107 void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx)\r
108 {\r
109   /* Check the parameters */\r
110   assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx));\r
111   \r
112   /* Disable the selected DMAy Channelx */\r
113   DMAy_Channelx->CCR &= (uint16_t)(~DMA_CCR1_EN);\r
114   \r
115   /* Reset DMAy Channelx control register */\r
116   DMAy_Channelx->CCR  = 0;\r
117   \r
118   /* Reset DMAy Channelx remaining bytes register */\r
119   DMAy_Channelx->CNDTR = 0;\r
120   \r
121   /* Reset DMAy Channelx peripheral address register */\r
122   DMAy_Channelx->CPAR  = 0;\r
123   \r
124   /* Reset DMAy Channelx memory address register */\r
125   DMAy_Channelx->CMAR = 0;\r
126   \r
127   if (DMAy_Channelx == DMA1_Channel1)\r
128   {\r
129     /* Reset interrupt pending bits for DMA1 Channel1 */\r
130     DMA1->IFCR |= DMA1_Channel1_IT_Mask;\r
131   }\r
132   else if (DMAy_Channelx == DMA1_Channel2)\r
133   {\r
134     /* Reset interrupt pending bits for DMA1 Channel2 */\r
135     DMA1->IFCR |= DMA1_Channel2_IT_Mask;\r
136   }\r
137   else if (DMAy_Channelx == DMA1_Channel3)\r
138   {\r
139     /* Reset interrupt pending bits for DMA1 Channel3 */\r
140     DMA1->IFCR |= DMA1_Channel3_IT_Mask;\r
141   }\r
142   else if (DMAy_Channelx == DMA1_Channel4)\r
143   {\r
144     /* Reset interrupt pending bits for DMA1 Channel4 */\r
145     DMA1->IFCR |= DMA1_Channel4_IT_Mask;\r
146   }\r
147   else if (DMAy_Channelx == DMA1_Channel5)\r
148   {\r
149     /* Reset interrupt pending bits for DMA1 Channel5 */\r
150     DMA1->IFCR |= DMA1_Channel5_IT_Mask;\r
151   }\r
152   else if (DMAy_Channelx == DMA1_Channel6)\r
153   {\r
154     /* Reset interrupt pending bits for DMA1 Channel6 */\r
155     DMA1->IFCR |= DMA1_Channel6_IT_Mask;\r
156   }\r
157   else if (DMAy_Channelx == DMA1_Channel7)\r
158   {\r
159     /* Reset interrupt pending bits for DMA1 Channel7 */\r
160     DMA1->IFCR |= DMA1_Channel7_IT_Mask;\r
161   }\r
162   else if (DMAy_Channelx == DMA2_Channel1)\r
163   {\r
164     /* Reset interrupt pending bits for DMA2 Channel1 */\r
165     DMA2->IFCR |= DMA2_Channel1_IT_Mask;\r
166   }\r
167   else if (DMAy_Channelx == DMA2_Channel2)\r
168   {\r
169     /* Reset interrupt pending bits for DMA2 Channel2 */\r
170     DMA2->IFCR |= DMA2_Channel2_IT_Mask;\r
171   }\r
172   else if (DMAy_Channelx == DMA2_Channel3)\r
173   {\r
174     /* Reset interrupt pending bits for DMA2 Channel3 */\r
175     DMA2->IFCR |= DMA2_Channel3_IT_Mask;\r
176   }\r
177   else if (DMAy_Channelx == DMA2_Channel4)\r
178   {\r
179     /* Reset interrupt pending bits for DMA2 Channel4 */\r
180     DMA2->IFCR |= DMA2_Channel4_IT_Mask;\r
181   }\r
182   else\r
183   { \r
184     if (DMAy_Channelx == DMA2_Channel5)\r
185     {\r
186       /* Reset interrupt pending bits for DMA2 Channel5 */\r
187       DMA2->IFCR |= DMA2_Channel5_IT_Mask;\r
188     }\r
189   }\r
190 }\r
191 \r
192 /**\r
193   * @brief  Initializes the DMAy Channelx according to the specified\r
194   *   parameters in the DMA_InitStruct.\r
195   * @param  DMAy_Channelx: where y can be 1 or 2 to select the DMA and \r
196   *   x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel.\r
197   * @param  DMA_InitStruct: pointer to a DMA_InitTypeDef structure that\r
198   *   contains the configuration information for the specified DMA Channel.\r
199   * @retval None\r
200   */\r
201 void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct)\r
202 {\r
203   uint32_t tmpreg = 0;\r
204 \r
205   /* Check the parameters */\r
206   assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx));\r
207   assert_param(IS_DMA_DIR(DMA_InitStruct->DMA_DIR));\r
208   assert_param(IS_DMA_BUFFER_SIZE(DMA_InitStruct->DMA_BufferSize));\r
209   assert_param(IS_DMA_PERIPHERAL_INC_STATE(DMA_InitStruct->DMA_PeripheralInc));\r
210   assert_param(IS_DMA_MEMORY_INC_STATE(DMA_InitStruct->DMA_MemoryInc));   \r
211   assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(DMA_InitStruct->DMA_PeripheralDataSize));\r
212   assert_param(IS_DMA_MEMORY_DATA_SIZE(DMA_InitStruct->DMA_MemoryDataSize));\r
213   assert_param(IS_DMA_MODE(DMA_InitStruct->DMA_Mode));\r
214   assert_param(IS_DMA_PRIORITY(DMA_InitStruct->DMA_Priority));\r
215   assert_param(IS_DMA_M2M_STATE(DMA_InitStruct->DMA_M2M));\r
216 \r
217 /*--------------------------- DMAy Channelx CCR Configuration -----------------*/\r
218   /* Get the DMAy_Channelx CCR value */\r
219   tmpreg = DMAy_Channelx->CCR;\r
220   /* Clear MEM2MEM, PL, MSIZE, PSIZE, MINC, PINC, CIRC and DIR bits */\r
221   tmpreg &= CCR_CLEAR_Mask;\r
222   /* Configure DMAy Channelx: data transfer, data size, priority level and mode */\r
223   /* Set DIR bit according to DMA_DIR value */\r
224   /* Set CIRC bit according to DMA_Mode value */\r
225   /* Set PINC bit according to DMA_PeripheralInc value */\r
226   /* Set MINC bit according to DMA_MemoryInc value */\r
227   /* Set PSIZE bits according to DMA_PeripheralDataSize value */\r
228   /* Set MSIZE bits according to DMA_MemoryDataSize value */\r
229   /* Set PL bits according to DMA_Priority value */\r
230   /* Set the MEM2MEM bit according to DMA_M2M value */\r
231   tmpreg |= DMA_InitStruct->DMA_DIR | DMA_InitStruct->DMA_Mode |\r
232             DMA_InitStruct->DMA_PeripheralInc | DMA_InitStruct->DMA_MemoryInc |\r
233             DMA_InitStruct->DMA_PeripheralDataSize | DMA_InitStruct->DMA_MemoryDataSize |\r
234             DMA_InitStruct->DMA_Priority | DMA_InitStruct->DMA_M2M;\r
235 \r
236   /* Write to DMAy Channelx CCR */\r
237   DMAy_Channelx->CCR = tmpreg;\r
238 \r
239 /*--------------------------- DMAy Channelx CNDTR Configuration ---------------*/\r
240   /* Write to DMAy Channelx CNDTR */\r
241   DMAy_Channelx->CNDTR = DMA_InitStruct->DMA_BufferSize;\r
242 \r
243 /*--------------------------- DMAy Channelx CPAR Configuration ----------------*/\r
244   /* Write to DMAy Channelx CPAR */\r
245   DMAy_Channelx->CPAR = DMA_InitStruct->DMA_PeripheralBaseAddr;\r
246 \r
247 /*--------------------------- DMAy Channelx CMAR Configuration ----------------*/\r
248   /* Write to DMAy Channelx CMAR */\r
249   DMAy_Channelx->CMAR = DMA_InitStruct->DMA_MemoryBaseAddr;\r
250 }\r
251 \r
252 /**\r
253   * @brief  Fills each DMA_InitStruct member with its default value.\r
254   * @param  DMA_InitStruct : pointer to a DMA_InitTypeDef structure which will\r
255   *   be initialized.\r
256   * @retval None\r
257   */\r
258 void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct)\r
259 {\r
260 /*-------------- Reset DMA init structure parameters values ------------------*/\r
261   /* Initialize the DMA_PeripheralBaseAddr member */\r
262   DMA_InitStruct->DMA_PeripheralBaseAddr = 0;\r
263   /* Initialize the DMA_MemoryBaseAddr member */\r
264   DMA_InitStruct->DMA_MemoryBaseAddr = 0;\r
265   /* Initialize the DMA_DIR member */\r
266   DMA_InitStruct->DMA_DIR = DMA_DIR_PeripheralSRC;\r
267   /* Initialize the DMA_BufferSize member */\r
268   DMA_InitStruct->DMA_BufferSize = 0;\r
269   /* Initialize the DMA_PeripheralInc member */\r
270   DMA_InitStruct->DMA_PeripheralInc = DMA_PeripheralInc_Disable;\r
271   /* Initialize the DMA_MemoryInc member */\r
272   DMA_InitStruct->DMA_MemoryInc = DMA_MemoryInc_Disable;\r
273   /* Initialize the DMA_PeripheralDataSize member */\r
274   DMA_InitStruct->DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;\r
275   /* Initialize the DMA_MemoryDataSize member */\r
276   DMA_InitStruct->DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;\r
277   /* Initialize the DMA_Mode member */\r
278   DMA_InitStruct->DMA_Mode = DMA_Mode_Normal;\r
279   /* Initialize the DMA_Priority member */\r
280   DMA_InitStruct->DMA_Priority = DMA_Priority_Low;\r
281   /* Initialize the DMA_M2M member */\r
282   DMA_InitStruct->DMA_M2M = DMA_M2M_Disable;\r
283 }\r
284 \r
285 /**\r
286   * @brief  Enables or disables the specified DMAy Channelx.\r
287   * @param  DMAy_Channelx: where y can be 1 or 2 to select the DMA and \r
288   *   x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel.\r
289   * @param  NewState: new state of the DMAy Channelx. \r
290   *   This parameter can be: ENABLE or DISABLE.\r
291   * @retval None\r
292   */\r
293 void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState)\r
294 {\r
295   /* Check the parameters */\r
296   assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx));\r
297   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
298 \r
299   if (NewState != DISABLE)\r
300   {\r
301     /* Enable the selected DMAy Channelx */\r
302     DMAy_Channelx->CCR |= DMA_CCR1_EN;\r
303   }\r
304   else\r
305   {\r
306     /* Disable the selected DMAy Channelx */\r
307     DMAy_Channelx->CCR &= (uint16_t)(~DMA_CCR1_EN);\r
308   }\r
309 }\r
310 \r
311 /**\r
312   * @brief  Enables or disables the specified DMAy Channelx interrupts.\r
313   * @param  DMAy_Channelx: where y can be 1 or 2 to select the DMA and \r
314   *   x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel.\r
315   * @param  DMA_IT: specifies the DMA interrupts sources to be enabled\r
316   *   or disabled. \r
317   *   This parameter can be any combination of the following values:\r
318   *     @arg DMA_IT_TC:  Transfer complete interrupt mask\r
319   *     @arg DMA_IT_HT:  Half transfer interrupt mask\r
320   *     @arg DMA_IT_TE:  Transfer error interrupt mask\r
321   * @param  NewState: new state of the specified DMA interrupts.\r
322   *   This parameter can be: ENABLE or DISABLE.\r
323   * @retval None\r
324   */\r
325 void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState)\r
326 {\r
327   /* Check the parameters */\r
328   assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx));\r
329   assert_param(IS_DMA_CONFIG_IT(DMA_IT));\r
330   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
331   if (NewState != DISABLE)\r
332   {\r
333     /* Enable the selected DMA interrupts */\r
334     DMAy_Channelx->CCR |= DMA_IT;\r
335   }\r
336   else\r
337   {\r
338     /* Disable the selected DMA interrupts */\r
339     DMAy_Channelx->CCR &= ~DMA_IT;\r
340   }\r
341 }\r
342 \r
343 /**\r
344   * @brief  Sets the number of data units in the current DMAy Channelx transfer.\r
345   * @param  DMAy_Channelx: where y can be 1 or 2 to select the DMA and \r
346   *         x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel.\r
347   * @param  DataNumber: The number of data units in the current DMAy Channelx\r
348   *         transfer.   \r
349   * @note   This function can only be used when the DMAy_Channelx is disabled.                 \r
350   * @retval None.\r
351   */\r
352 void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber)\r
353 {\r
354   /* Check the parameters */\r
355   assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx));\r
356   \r
357 /*--------------------------- DMAy Channelx CNDTR Configuration ---------------*/\r
358   /* Write to DMAy Channelx CNDTR */\r
359   DMAy_Channelx->CNDTR = DataNumber;  \r
360 }\r
361 \r
362 /**\r
363   * @brief  Returns the number of remaining data units in the current\r
364   *   DMAy Channelx transfer.\r
365   * @param  DMAy_Channelx: where y can be 1 or 2 to select the DMA and \r
366   *   x can be 1 to 7 for DMA1 and 1 to 5 for DMA2 to select the DMA Channel.\r
367   * @retval The number of remaining data units in the current DMAy Channelx\r
368   *   transfer.\r
369   */\r
370 uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx)\r
371 {\r
372   /* Check the parameters */\r
373   assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx));\r
374   /* Return the number of remaining data units for DMAy Channelx */\r
375   return ((uint16_t)(DMAy_Channelx->CNDTR));\r
376 }\r
377 \r
378 /**\r
379   * @brief  Checks whether the specified DMAy Channelx flag is set or not.\r
380   * @param  DMA_FLAG: specifies the flag to check.\r
381   *   This parameter can be one of the following values:\r
382   *     @arg DMA1_FLAG_GL1: DMA1 Channel1 global flag.\r
383   *     @arg DMA1_FLAG_TC1: DMA1 Channel1 transfer complete flag.\r
384   *     @arg DMA1_FLAG_HT1: DMA1 Channel1 half transfer flag.\r
385   *     @arg DMA1_FLAG_TE1: DMA1 Channel1 transfer error flag.\r
386   *     @arg DMA1_FLAG_GL2: DMA1 Channel2 global flag.\r
387   *     @arg DMA1_FLAG_TC2: DMA1 Channel2 transfer complete flag.\r
388   *     @arg DMA1_FLAG_HT2: DMA1 Channel2 half transfer flag.\r
389   *     @arg DMA1_FLAG_TE2: DMA1 Channel2 transfer error flag.\r
390   *     @arg DMA1_FLAG_GL3: DMA1 Channel3 global flag.\r
391   *     @arg DMA1_FLAG_TC3: DMA1 Channel3 transfer complete flag.\r
392   *     @arg DMA1_FLAG_HT3: DMA1 Channel3 half transfer flag.\r
393   *     @arg DMA1_FLAG_TE3: DMA1 Channel3 transfer error flag.\r
394   *     @arg DMA1_FLAG_GL4: DMA1 Channel4 global flag.\r
395   *     @arg DMA1_FLAG_TC4: DMA1 Channel4 transfer complete flag.\r
396   *     @arg DMA1_FLAG_HT4: DMA1 Channel4 half transfer flag.\r
397   *     @arg DMA1_FLAG_TE4: DMA1 Channel4 transfer error flag.\r
398   *     @arg DMA1_FLAG_GL5: DMA1 Channel5 global flag.\r
399   *     @arg DMA1_FLAG_TC5: DMA1 Channel5 transfer complete flag.\r
400   *     @arg DMA1_FLAG_HT5: DMA1 Channel5 half transfer flag.\r
401   *     @arg DMA1_FLAG_TE5: DMA1 Channel5 transfer error flag.\r
402   *     @arg DMA1_FLAG_GL6: DMA1 Channel6 global flag.\r
403   *     @arg DMA1_FLAG_TC6: DMA1 Channel6 transfer complete flag.\r
404   *     @arg DMA1_FLAG_HT6: DMA1 Channel6 half transfer flag.\r
405   *     @arg DMA1_FLAG_TE6: DMA1 Channel6 transfer error flag.\r
406   *     @arg DMA1_FLAG_GL7: DMA1 Channel7 global flag.\r
407   *     @arg DMA1_FLAG_TC7: DMA1 Channel7 transfer complete flag.\r
408   *     @arg DMA1_FLAG_HT7: DMA1 Channel7 half transfer flag.\r
409   *     @arg DMA1_FLAG_TE7: DMA1 Channel7 transfer error flag.\r
410   *     @arg DMA2_FLAG_GL1: DMA2 Channel1 global flag.\r
411   *     @arg DMA2_FLAG_TC1: DMA2 Channel1 transfer complete flag.\r
412   *     @arg DMA2_FLAG_HT1: DMA2 Channel1 half transfer flag.\r
413   *     @arg DMA2_FLAG_TE1: DMA2 Channel1 transfer error flag.\r
414   *     @arg DMA2_FLAG_GL2: DMA2 Channel2 global flag.\r
415   *     @arg DMA2_FLAG_TC2: DMA2 Channel2 transfer complete flag.\r
416   *     @arg DMA2_FLAG_HT2: DMA2 Channel2 half transfer flag.\r
417   *     @arg DMA2_FLAG_TE2: DMA2 Channel2 transfer error flag.\r
418   *     @arg DMA2_FLAG_GL3: DMA2 Channel3 global flag.\r
419   *     @arg DMA2_FLAG_TC3: DMA2 Channel3 transfer complete flag.\r
420   *     @arg DMA2_FLAG_HT3: DMA2 Channel3 half transfer flag.\r
421   *     @arg DMA2_FLAG_TE3: DMA2 Channel3 transfer error flag.\r
422   *     @arg DMA2_FLAG_GL4: DMA2 Channel4 global flag.\r
423   *     @arg DMA2_FLAG_TC4: DMA2 Channel4 transfer complete flag.\r
424   *     @arg DMA2_FLAG_HT4: DMA2 Channel4 half transfer flag.\r
425   *     @arg DMA2_FLAG_TE4: DMA2 Channel4 transfer error flag.\r
426   *     @arg DMA2_FLAG_GL5: DMA2 Channel5 global flag.\r
427   *     @arg DMA2_FLAG_TC5: DMA2 Channel5 transfer complete flag.\r
428   *     @arg DMA2_FLAG_HT5: DMA2 Channel5 half transfer flag.\r
429   *     @arg DMA2_FLAG_TE5: DMA2 Channel5 transfer error flag.\r
430   * @retval The new state of DMA_FLAG (SET or RESET).\r
431   */\r
432 FlagStatus DMA_GetFlagStatus(uint32_t DMA_FLAG)\r
433 {\r
434   FlagStatus bitstatus = RESET;\r
435   uint32_t tmpreg = 0;\r
436   /* Check the parameters */\r
437   assert_param(IS_DMA_GET_FLAG(DMA_FLAG));\r
438 \r
439   /* Calculate the used DMA */\r
440   if ((DMA_FLAG & FLAG_Mask) != (uint32_t)RESET)\r
441   {\r
442     /* Get DMA2 ISR register value */\r
443     tmpreg = DMA2->ISR ;\r
444   }\r
445   else\r
446   {\r
447     /* Get DMA1 ISR register value */\r
448     tmpreg = DMA1->ISR ;\r
449   }\r
450 \r
451   /* Check the status of the specified DMA flag */\r
452   if ((tmpreg & DMA_FLAG) != (uint32_t)RESET)\r
453   {\r
454     /* DMA_FLAG is set */\r
455     bitstatus = SET;\r
456   }\r
457   else\r
458   {\r
459     /* DMA_FLAG is reset */\r
460     bitstatus = RESET;\r
461   }\r
462   \r
463   /* Return the DMA_FLAG status */\r
464   return  bitstatus;\r
465 }\r
466 \r
467 /**\r
468   * @brief  Clears the DMAy Channelx's pending flags.\r
469   * @param  DMA_FLAG: specifies the flag to clear.\r
470   *   This parameter can be any combination (for the same DMA) of the following values:\r
471   *     @arg DMA1_FLAG_GL1: DMA1 Channel1 global flag.\r
472   *     @arg DMA1_FLAG_TC1: DMA1 Channel1 transfer complete flag.\r
473   *     @arg DMA1_FLAG_HT1: DMA1 Channel1 half transfer flag.\r
474   *     @arg DMA1_FLAG_TE1: DMA1 Channel1 transfer error flag.\r
475   *     @arg DMA1_FLAG_GL2: DMA1 Channel2 global flag.\r
476   *     @arg DMA1_FLAG_TC2: DMA1 Channel2 transfer complete flag.\r
477   *     @arg DMA1_FLAG_HT2: DMA1 Channel2 half transfer flag.\r
478   *     @arg DMA1_FLAG_TE2: DMA1 Channel2 transfer error flag.\r
479   *     @arg DMA1_FLAG_GL3: DMA1 Channel3 global flag.\r
480   *     @arg DMA1_FLAG_TC3: DMA1 Channel3 transfer complete flag.\r
481   *     @arg DMA1_FLAG_HT3: DMA1 Channel3 half transfer flag.\r
482   *     @arg DMA1_FLAG_TE3: DMA1 Channel3 transfer error flag.\r
483   *     @arg DMA1_FLAG_GL4: DMA1 Channel4 global flag.\r
484   *     @arg DMA1_FLAG_TC4: DMA1 Channel4 transfer complete flag.\r
485   *     @arg DMA1_FLAG_HT4: DMA1 Channel4 half transfer flag.\r
486   *     @arg DMA1_FLAG_TE4: DMA1 Channel4 transfer error flag.\r
487   *     @arg DMA1_FLAG_GL5: DMA1 Channel5 global flag.\r
488   *     @arg DMA1_FLAG_TC5: DMA1 Channel5 transfer complete flag.\r
489   *     @arg DMA1_FLAG_HT5: DMA1 Channel5 half transfer flag.\r
490   *     @arg DMA1_FLAG_TE5: DMA1 Channel5 transfer error flag.\r
491   *     @arg DMA1_FLAG_GL6: DMA1 Channel6 global flag.\r
492   *     @arg DMA1_FLAG_TC6: DMA1 Channel6 transfer complete flag.\r
493   *     @arg DMA1_FLAG_HT6: DMA1 Channel6 half transfer flag.\r
494   *     @arg DMA1_FLAG_TE6: DMA1 Channel6 transfer error flag.\r
495   *     @arg DMA1_FLAG_GL7: DMA1 Channel7 global flag.\r
496   *     @arg DMA1_FLAG_TC7: DMA1 Channel7 transfer complete flag.\r
497   *     @arg DMA1_FLAG_HT7: DMA1 Channel7 half transfer flag.\r
498   *     @arg DMA1_FLAG_TE7: DMA1 Channel7 transfer error flag.\r
499   *     @arg DMA2_FLAG_GL1: DMA2 Channel1 global flag.\r
500   *     @arg DMA2_FLAG_TC1: DMA2 Channel1 transfer complete flag.\r
501   *     @arg DMA2_FLAG_HT1: DMA2 Channel1 half transfer flag.\r
502   *     @arg DMA2_FLAG_TE1: DMA2 Channel1 transfer error flag.\r
503   *     @arg DMA2_FLAG_GL2: DMA2 Channel2 global flag.\r
504   *     @arg DMA2_FLAG_TC2: DMA2 Channel2 transfer complete flag.\r
505   *     @arg DMA2_FLAG_HT2: DMA2 Channel2 half transfer flag.\r
506   *     @arg DMA2_FLAG_TE2: DMA2 Channel2 transfer error flag.\r
507   *     @arg DMA2_FLAG_GL3: DMA2 Channel3 global flag.\r
508   *     @arg DMA2_FLAG_TC3: DMA2 Channel3 transfer complete flag.\r
509   *     @arg DMA2_FLAG_HT3: DMA2 Channel3 half transfer flag.\r
510   *     @arg DMA2_FLAG_TE3: DMA2 Channel3 transfer error flag.\r
511   *     @arg DMA2_FLAG_GL4: DMA2 Channel4 global flag.\r
512   *     @arg DMA2_FLAG_TC4: DMA2 Channel4 transfer complete flag.\r
513   *     @arg DMA2_FLAG_HT4: DMA2 Channel4 half transfer flag.\r
514   *     @arg DMA2_FLAG_TE4: DMA2 Channel4 transfer error flag.\r
515   *     @arg DMA2_FLAG_GL5: DMA2 Channel5 global flag.\r
516   *     @arg DMA2_FLAG_TC5: DMA2 Channel5 transfer complete flag.\r
517   *     @arg DMA2_FLAG_HT5: DMA2 Channel5 half transfer flag.\r
518   *     @arg DMA2_FLAG_TE5: DMA2 Channel5 transfer error flag.\r
519   * @retval None\r
520   */\r
521 void DMA_ClearFlag(uint32_t DMA_FLAG)\r
522 {\r
523   /* Check the parameters */\r
524   assert_param(IS_DMA_CLEAR_FLAG(DMA_FLAG));\r
525   /* Calculate the used DMA */\r
526 \r
527   if ((DMA_FLAG & FLAG_Mask) != (uint32_t)RESET)\r
528   {\r
529     /* Clear the selected DMA flags */\r
530     DMA2->IFCR = DMA_FLAG;\r
531   }\r
532   else\r
533   {\r
534     /* Clear the selected DMA flags */\r
535     DMA1->IFCR = DMA_FLAG;\r
536   }\r
537 }\r
538 \r
539 /**\r
540   * @brief  Checks whether the specified DMAy Channelx interrupt has occurred or not.\r
541   * @param  DMA_IT: specifies the DMA interrupt source to check. \r
542   *   This parameter can be one of the following values:\r
543   *     @arg DMA1_IT_GL1: DMA1 Channel1 global interrupt.\r
544   *     @arg DMA1_IT_TC1: DMA1 Channel1 transfer complete interrupt.\r
545   *     @arg DMA1_IT_HT1: DMA1 Channel1 half transfer interrupt.\r
546   *     @arg DMA1_IT_TE1: DMA1 Channel1 transfer error interrupt.\r
547   *     @arg DMA1_IT_GL2: DMA1 Channel2 global interrupt.\r
548   *     @arg DMA1_IT_TC2: DMA1 Channel2 transfer complete interrupt.\r
549   *     @arg DMA1_IT_HT2: DMA1 Channel2 half transfer interrupt.\r
550   *     @arg DMA1_IT_TE2: DMA1 Channel2 transfer error interrupt.\r
551   *     @arg DMA1_IT_GL3: DMA1 Channel3 global interrupt.\r
552   *     @arg DMA1_IT_TC3: DMA1 Channel3 transfer complete interrupt.\r
553   *     @arg DMA1_IT_HT3: DMA1 Channel3 half transfer interrupt.\r
554   *     @arg DMA1_IT_TE3: DMA1 Channel3 transfer error interrupt.\r
555   *     @arg DMA1_IT_GL4: DMA1 Channel4 global interrupt.\r
556   *     @arg DMA1_IT_TC4: DMA1 Channel4 transfer complete interrupt.\r
557   *     @arg DMA1_IT_HT4: DMA1 Channel4 half transfer interrupt.\r
558   *     @arg DMA1_IT_TE4: DMA1 Channel4 transfer error interrupt.\r
559   *     @arg DMA1_IT_GL5: DMA1 Channel5 global interrupt.\r
560   *     @arg DMA1_IT_TC5: DMA1 Channel5 transfer complete interrupt.\r
561   *     @arg DMA1_IT_HT5: DMA1 Channel5 half transfer interrupt.\r
562   *     @arg DMA1_IT_TE5: DMA1 Channel5 transfer error interrupt.\r
563   *     @arg DMA1_IT_GL6: DMA1 Channel6 global interrupt.\r
564   *     @arg DMA1_IT_TC6: DMA1 Channel6 transfer complete interrupt.\r
565   *     @arg DMA1_IT_HT6: DMA1 Channel6 half transfer interrupt.\r
566   *     @arg DMA1_IT_TE6: DMA1 Channel6 transfer error interrupt.\r
567   *     @arg DMA1_IT_GL7: DMA1 Channel7 global interrupt.\r
568   *     @arg DMA1_IT_TC7: DMA1 Channel7 transfer complete interrupt.\r
569   *     @arg DMA1_IT_HT7: DMA1 Channel7 half transfer interrupt.\r
570   *     @arg DMA1_IT_TE7: DMA1 Channel7 transfer error interrupt.\r
571   *     @arg DMA2_IT_GL1: DMA2 Channel1 global interrupt.\r
572   *     @arg DMA2_IT_TC1: DMA2 Channel1 transfer complete interrupt.\r
573   *     @arg DMA2_IT_HT1: DMA2 Channel1 half transfer interrupt.\r
574   *     @arg DMA2_IT_TE1: DMA2 Channel1 transfer error interrupt.\r
575   *     @arg DMA2_IT_GL2: DMA2 Channel2 global interrupt.\r
576   *     @arg DMA2_IT_TC2: DMA2 Channel2 transfer complete interrupt.\r
577   *     @arg DMA2_IT_HT2: DMA2 Channel2 half transfer interrupt.\r
578   *     @arg DMA2_IT_TE2: DMA2 Channel2 transfer error interrupt.\r
579   *     @arg DMA2_IT_GL3: DMA2 Channel3 global interrupt.\r
580   *     @arg DMA2_IT_TC3: DMA2 Channel3 transfer complete interrupt.\r
581   *     @arg DMA2_IT_HT3: DMA2 Channel3 half transfer interrupt.\r
582   *     @arg DMA2_IT_TE3: DMA2 Channel3 transfer error interrupt.\r
583   *     @arg DMA2_IT_GL4: DMA2 Channel4 global interrupt.\r
584   *     @arg DMA2_IT_TC4: DMA2 Channel4 transfer complete interrupt.\r
585   *     @arg DMA2_IT_HT4: DMA2 Channel4 half transfer interrupt.\r
586   *     @arg DMA2_IT_TE4: DMA2 Channel4 transfer error interrupt.\r
587   *     @arg DMA2_IT_GL5: DMA2 Channel5 global interrupt.\r
588   *     @arg DMA2_IT_TC5: DMA2 Channel5 transfer complete interrupt.\r
589   *     @arg DMA2_IT_HT5: DMA2 Channel5 half transfer interrupt.\r
590   *     @arg DMA2_IT_TE5: DMA2 Channel5 transfer error interrupt.\r
591   * @retval The new state of DMA_IT (SET or RESET).\r
592   */\r
593 ITStatus DMA_GetITStatus(uint32_t DMA_IT)\r
594 {\r
595   ITStatus bitstatus = RESET;\r
596   uint32_t tmpreg = 0;\r
597   /* Check the parameters */\r
598   assert_param(IS_DMA_GET_IT(DMA_IT));\r
599 \r
600   /* Calculate the used DMA */\r
601   if ((DMA_IT & FLAG_Mask) != (uint32_t)RESET)\r
602   {\r
603     /* Get DMA2 ISR register value */\r
604     tmpreg = DMA2->ISR ;\r
605   }\r
606   else\r
607   {\r
608     /* Get DMA1 ISR register value */\r
609     tmpreg = DMA1->ISR ;\r
610   }\r
611 \r
612   /* Check the status of the specified DMA interrupt */\r
613   if ((tmpreg & DMA_IT) != (uint32_t)RESET)\r
614   {\r
615     /* DMA_IT is set */\r
616     bitstatus = SET;\r
617   }\r
618   else\r
619   {\r
620     /* DMA_IT is reset */\r
621     bitstatus = RESET;\r
622   }\r
623   /* Return the DMA_IT status */\r
624   return  bitstatus;\r
625 }\r
626 \r
627 /**\r
628   * @brief  Clears the DMAy Channelx\92s interrupt pending bits.\r
629   * @param  DMA_IT: specifies the DMA interrupt pending bit to clear.\r
630   *   This parameter can be any combination (for the same DMA) of the following values:\r
631   *     @arg DMA1_IT_GL1: DMA1 Channel1 global interrupt.\r
632   *     @arg DMA1_IT_TC1: DMA1 Channel1 transfer complete interrupt.\r
633   *     @arg DMA1_IT_HT1: DMA1 Channel1 half transfer interrupt.\r
634   *     @arg DMA1_IT_TE1: DMA1 Channel1 transfer error interrupt.\r
635   *     @arg DMA1_IT_GL2: DMA1 Channel2 global interrupt.\r
636   *     @arg DMA1_IT_TC2: DMA1 Channel2 transfer complete interrupt.\r
637   *     @arg DMA1_IT_HT2: DMA1 Channel2 half transfer interrupt.\r
638   *     @arg DMA1_IT_TE2: DMA1 Channel2 transfer error interrupt.\r
639   *     @arg DMA1_IT_GL3: DMA1 Channel3 global interrupt.\r
640   *     @arg DMA1_IT_TC3: DMA1 Channel3 transfer complete interrupt.\r
641   *     @arg DMA1_IT_HT3: DMA1 Channel3 half transfer interrupt.\r
642   *     @arg DMA1_IT_TE3: DMA1 Channel3 transfer error interrupt.\r
643   *     @arg DMA1_IT_GL4: DMA1 Channel4 global interrupt.\r
644   *     @arg DMA1_IT_TC4: DMA1 Channel4 transfer complete interrupt.\r
645   *     @arg DMA1_IT_HT4: DMA1 Channel4 half transfer interrupt.\r
646   *     @arg DMA1_IT_TE4: DMA1 Channel4 transfer error interrupt.\r
647   *     @arg DMA1_IT_GL5: DMA1 Channel5 global interrupt.\r
648   *     @arg DMA1_IT_TC5: DMA1 Channel5 transfer complete interrupt.\r
649   *     @arg DMA1_IT_HT5: DMA1 Channel5 half transfer interrupt.\r
650   *     @arg DMA1_IT_TE5: DMA1 Channel5 transfer error interrupt.\r
651   *     @arg DMA1_IT_GL6: DMA1 Channel6 global interrupt.\r
652   *     @arg DMA1_IT_TC6: DMA1 Channel6 transfer complete interrupt.\r
653   *     @arg DMA1_IT_HT6: DMA1 Channel6 half transfer interrupt.\r
654   *     @arg DMA1_IT_TE6: DMA1 Channel6 transfer error interrupt.\r
655   *     @arg DMA1_IT_GL7: DMA1 Channel7 global interrupt.\r
656   *     @arg DMA1_IT_TC7: DMA1 Channel7 transfer complete interrupt.\r
657   *     @arg DMA1_IT_HT7: DMA1 Channel7 half transfer interrupt.\r
658   *     @arg DMA1_IT_TE7: DMA1 Channel7 transfer error interrupt.\r
659   *     @arg DMA2_IT_GL1: DMA2 Channel1 global interrupt.\r
660   *     @arg DMA2_IT_TC1: DMA2 Channel1 transfer complete interrupt.\r
661   *     @arg DMA2_IT_HT1: DMA2 Channel1 half transfer interrupt.\r
662   *     @arg DMA2_IT_TE1: DMA2 Channel1 transfer error interrupt.\r
663   *     @arg DMA2_IT_GL2: DMA2 Channel2 global interrupt.\r
664   *     @arg DMA2_IT_TC2: DMA2 Channel2 transfer complete interrupt.\r
665   *     @arg DMA2_IT_HT2: DMA2 Channel2 half transfer interrupt.\r
666   *     @arg DMA2_IT_TE2: DMA2 Channel2 transfer error interrupt.\r
667   *     @arg DMA2_IT_GL3: DMA2 Channel3 global interrupt.\r
668   *     @arg DMA2_IT_TC3: DMA2 Channel3 transfer complete interrupt.\r
669   *     @arg DMA2_IT_HT3: DMA2 Channel3 half transfer interrupt.\r
670   *     @arg DMA2_IT_TE3: DMA2 Channel3 transfer error interrupt.\r
671   *     @arg DMA2_IT_GL4: DMA2 Channel4 global interrupt.\r
672   *     @arg DMA2_IT_TC4: DMA2 Channel4 transfer complete interrupt.\r
673   *     @arg DMA2_IT_HT4: DMA2 Channel4 half transfer interrupt.\r
674   *     @arg DMA2_IT_TE4: DMA2 Channel4 transfer error interrupt.\r
675   *     @arg DMA2_IT_GL5: DMA2 Channel5 global interrupt.\r
676   *     @arg DMA2_IT_TC5: DMA2 Channel5 transfer complete interrupt.\r
677   *     @arg DMA2_IT_HT5: DMA2 Channel5 half transfer interrupt.\r
678   *     @arg DMA2_IT_TE5: DMA2 Channel5 transfer error interrupt.\r
679   * @retval None\r
680   */\r
681 void DMA_ClearITPendingBit(uint32_t DMA_IT)\r
682 {\r
683   /* Check the parameters */\r
684   assert_param(IS_DMA_CLEAR_IT(DMA_IT));\r
685 \r
686   /* Calculate the used DMA */\r
687   if ((DMA_IT & FLAG_Mask) != (uint32_t)RESET)\r
688   {\r
689     /* Clear the selected DMA interrupt pending bits */\r
690     DMA2->IFCR = DMA_IT;\r
691   }\r
692   else\r
693   {\r
694     /* Clear the selected DMA interrupt pending bits */\r
695     DMA1->IFCR = DMA_IT;\r
696   }\r
697 }\r
698 \r
699 /**\r
700   * @}\r
701   */\r
702 \r
703 /**\r
704   * @}\r
705   */\r
706 \r
707 /**\r
708   * @}\r
709   */\r
710 \r
711 /******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/\r