2 ******************************************************************************
\r
3 * @file stm32f7xx_hal_dma_ex.c
\r
4 * @author MCD Application Team
\r
6 * @date 24-March-2015
\r
7 * @brief DMA Extension HAL module driver
\r
8 * This file provides firmware functions to manage the following
\r
9 * functionalities of the DMA Extension peripheral:
\r
10 * + Extended features functions
\r
13 ==============================================================================
\r
14 ##### How to use this driver #####
\r
15 ==============================================================================
\r
17 The DMA Extension HAL driver can be used as follows:
\r
18 (#) Start a multi buffer transfer using the HAL_DMA_MultiBufferStart() function
\r
19 for polling mode or HAL_DMA_MultiBufferStart_IT() for interrupt mode.
\r
21 -@- In Memory-to-Memory transfer mode, Multi (Double) Buffer mode is not allowed.
\r
22 -@- When Multi (Double) Buffer mode is enabled the, transfer is circular by default.
\r
23 -@- In Multi (Double) buffer mode, it is possible to update the base address for
\r
24 the AHB memory port on the fly (DMA_SxM0AR or DMA_SxM1AR) when the stream is enabled.
\r
27 ******************************************************************************
\r
30 * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
\r
32 * Redistribution and use in source and binary forms, with or without modification,
\r
33 * are permitted provided that the following conditions are met:
\r
34 * 1. Redistributions of source code must retain the above copyright notice,
\r
35 * this list of conditions and the following disclaimer.
\r
36 * 2. Redistributions in binary form must reproduce the above copyright notice,
\r
37 * this list of conditions and the following disclaimer in the documentation
\r
38 * and/or other materials provided with the distribution.
\r
39 * 3. Neither the name of STMicroelectronics nor the names of its contributors
\r
40 * may be used to endorse or promote products derived from this software
\r
41 * without specific prior written permission.
\r
43 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
\r
44 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
\r
45 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
\r
46 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
\r
47 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
\r
48 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
\r
49 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
\r
50 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
\r
51 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
\r
52 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\r
54 ******************************************************************************
\r
57 /* Includes ------------------------------------------------------------------*/
\r
58 #include "stm32f7xx_hal.h"
\r
60 /** @addtogroup STM32F7xx_HAL_Driver
\r
64 /** @defgroup DMAEx DMAEx
\r
65 * @brief DMA Extended HAL module driver
\r
69 #ifdef HAL_DMA_MODULE_ENABLED
\r
71 /* Private types -------------------------------------------------------------*/
\r
72 /* Private variables ---------------------------------------------------------*/
\r
73 /* Private Constants ---------------------------------------------------------*/
\r
74 /* Private macros ------------------------------------------------------------*/
\r
75 /* Private functions ---------------------------------------------------------*/
\r
76 /** @addtogroup DMAEx_Private_Functions
\r
80 static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength);
\r
83 * @brief Set the DMA Transfer parameter.
\r
84 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
\r
85 * the configuration information for the specified DMA Stream.
\r
86 * @param SrcAddress: The source memory Buffer address
\r
87 * @param DstAddress: The destination memory Buffer address
\r
88 * @param DataLength: The length of data to be transferred from source to destination
\r
89 * @retval HAL status
\r
91 static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
\r
93 /* Configure DMA Stream data length */
\r
94 hdma->Instance->NDTR = DataLength;
\r
96 /* Peripheral to Memory */
\r
97 if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH)
\r
99 /* Configure DMA Stream destination address */
\r
100 hdma->Instance->PAR = DstAddress;
\r
102 /* Configure DMA Stream source address */
\r
103 hdma->Instance->M0AR = SrcAddress;
\r
105 /* Memory to Peripheral */
\r
108 /* Configure DMA Stream source address */
\r
109 hdma->Instance->PAR = SrcAddress;
\r
111 /* Configure DMA Stream destination address */
\r
112 hdma->Instance->M0AR = DstAddress;
\r
120 /* Exported functions ---------------------------------------------------------*/
\r
122 /** @addtogroup DMAEx_Exported_Functions
\r
127 /** @addtogroup DMAEx_Exported_Functions_Group1
\r
130 ===============================================================================
\r
131 ##### Extended features functions #####
\r
132 ===============================================================================
\r
133 [..] This section provides functions allowing to:
\r
134 (+) Configure the source, destination address and data length and
\r
135 Start MultiBuffer DMA transfer
\r
136 (+) Configure the source, destination address and data length and
\r
137 Start MultiBuffer DMA transfer with interrupt
\r
138 (+) Change on the fly the memory0 or memory1 address.
\r
146 * @brief Starts the multi_buffer DMA Transfer.
\r
147 * @param hdma : pointer to a DMA_HandleTypeDef structure that contains
\r
148 * the configuration information for the specified DMA Stream.
\r
149 * @param SrcAddress: The source memory Buffer address
\r
150 * @param DstAddress: The destination memory Buffer address
\r
151 * @param SecondMemAddress: The second memory Buffer address in case of multi buffer Transfer
\r
152 * @param DataLength: The length of data to be transferred from source to destination
\r
153 * @retval HAL status
\r
155 HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength)
\r
157 /* Process Locked */
\r
160 /* Current memory buffer used is Memory 0 */
\r
161 if((hdma->Instance->CR & DMA_SxCR_CT) == 0)
\r
163 hdma->State = HAL_DMA_STATE_BUSY_MEM0;
\r
165 /* Current memory buffer used is Memory 1 */
\r
166 else if((hdma->Instance->CR & DMA_SxCR_CT) != 0)
\r
168 hdma->State = HAL_DMA_STATE_BUSY_MEM1;
\r
171 /* Check the parameters */
\r
172 assert_param(IS_DMA_BUFFER_SIZE(DataLength));
\r
174 /* Disable the peripheral */
\r
175 __HAL_DMA_DISABLE(hdma);
\r
177 /* Enable the double buffer mode */
\r
178 hdma->Instance->CR |= (uint32_t)DMA_SxCR_DBM;
\r
180 /* Configure DMA Stream destination address */
\r
181 hdma->Instance->M1AR = SecondMemAddress;
\r
183 /* Configure the source, destination address and the data length */
\r
184 DMA_MultiBufferSetConfig(hdma, SrcAddress, DstAddress, DataLength);
\r
186 /* Enable the peripheral */
\r
187 __HAL_DMA_ENABLE(hdma);
\r
193 * @brief Starts the multi_buffer DMA Transfer with interrupt enabled.
\r
194 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
\r
195 * the configuration information for the specified DMA Stream.
\r
196 * @param SrcAddress: The source memory Buffer address
\r
197 * @param DstAddress: The destination memory Buffer address
\r
198 * @param SecondMemAddress: The second memory Buffer address in case of multi buffer Transfer
\r
199 * @param DataLength: The length of data to be transferred from source to destination
\r
200 * @retval HAL status
\r
202 HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength)
\r
204 /* Process Locked */
\r
207 /* Current memory buffer used is Memory 0 */
\r
208 if((hdma->Instance->CR & DMA_SxCR_CT) == 0)
\r
210 hdma->State = HAL_DMA_STATE_BUSY_MEM0;
\r
212 /* Current memory buffer used is Memory 1 */
\r
213 else if((hdma->Instance->CR & DMA_SxCR_CT) != 0)
\r
215 hdma->State = HAL_DMA_STATE_BUSY_MEM1;
\r
218 /* Check the parameters */
\r
219 assert_param(IS_DMA_BUFFER_SIZE(DataLength));
\r
221 /* Disable the peripheral */
\r
222 __HAL_DMA_DISABLE(hdma);
\r
224 /* Enable the Double buffer mode */
\r
225 hdma->Instance->CR |= (uint32_t)DMA_SxCR_DBM;
\r
227 /* Configure DMA Stream destination address */
\r
228 hdma->Instance->M1AR = SecondMemAddress;
\r
230 /* Configure the source, destination address and the data length */
\r
231 DMA_MultiBufferSetConfig(hdma, SrcAddress, DstAddress, DataLength);
\r
233 /* Enable the transfer complete interrupt */
\r
234 __HAL_DMA_ENABLE_IT(hdma, DMA_IT_TC);
\r
236 /* Enable the Half transfer interrupt */
\r
237 __HAL_DMA_ENABLE_IT(hdma, DMA_IT_HT);
\r
239 /* Enable the transfer Error interrupt */
\r
240 __HAL_DMA_ENABLE_IT(hdma, DMA_IT_TE);
\r
242 /* Enable the fifo Error interrupt */
\r
243 __HAL_DMA_ENABLE_IT(hdma, DMA_IT_FE);
\r
245 /* Enable the direct mode Error interrupt */
\r
246 __HAL_DMA_ENABLE_IT(hdma, DMA_IT_DME);
\r
248 /* Enable the peripheral */
\r
249 __HAL_DMA_ENABLE(hdma);
\r
255 * @brief Change the memory0 or memory1 address on the fly.
\r
256 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
\r
257 * the configuration information for the specified DMA Stream.
\r
258 * @param Address: The new address
\r
259 * @param memory: the memory to be changed, This parameter can be one of
\r
260 * the following values:
\r
263 * @note The MEMORY0 address can be changed only when the current transfer use
\r
264 * MEMORY1 and the MEMORY1 address can be changed only when the current
\r
265 * transfer use MEMORY0.
\r
266 * @retval HAL status
\r
268 HAL_StatusTypeDef HAL_DMAEx_ChangeMemory(DMA_HandleTypeDef *hdma, uint32_t Address, HAL_DMA_MemoryTypeDef memory)
\r
270 if(memory == MEMORY0)
\r
272 /* change the memory0 address */
\r
273 hdma->Instance->M0AR = Address;
\r
277 /* change the memory1 address */
\r
278 hdma->Instance->M1AR = Address;
\r
292 #endif /* HAL_DMA_MODULE_ENABLED */
\r
301 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
\r