xref: /btstack/port/stm32-f4discovery-usb/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dcmi.c (revision a8f7f3fcbcd51f8d2e92aca076b6a9f812db358c)
1 /**
2   ******************************************************************************
3   * @file    stm32f4xx_hal_dcmi.c
4   * @author  MCD Application Team
5   * @brief   DCMI HAL module driver
6   *          This file provides firmware functions to manage the following
7   *          functionalities of the Digital Camera Interface (DCMI) peripheral:
8   *           + Initialization and de-initialization functions
9   *           + IO operation functions
10   *           + Peripheral Control functions
11   *           + Peripheral State and Error functions
12   *
13   @verbatim
14   ==============================================================================
15                         ##### How to use this driver #####
16   ==============================================================================
17   [..]
18       The sequence below describes how to use this driver to capture image
19       from a camera module connected to the DCMI Interface.
20       This sequence does not take into account the configuration of the
21       camera module, which should be made before to configure and enable
22       the DCMI to capture images.
23 
24     (#) Program the required configuration through following parameters:
25         horizontal and vertical polarity, pixel clock polarity, Capture Rate,
26         Synchronization Mode, code of the frame delimiter and data width
27         using HAL_DCMI_Init() function.
28 
29     (#) Configure the DMA2_Stream1 channel1 to transfer Data from DCMI DR
30         register to the destination memory buffer.
31 
32     (#) Program the required configuration through following parameters:
33         DCMI mode, destination memory Buffer address and the data length
34         and enable capture using HAL_DCMI_Start_DMA() function.
35 
36     (#) Optionally, configure and Enable the CROP feature to select a rectangular
37         window from the received image using HAL_DCMI_ConfigCrop()
38         and HAL_DCMI_EnableCROP() functions
39 
40     (#) The capture can be stopped using HAL_DCMI_Stop() function.
41 
42     (#) To control DCMI state you can use the function HAL_DCMI_GetState().
43 
44      *** DCMI HAL driver macros list ***
45      =============================================
46      [..]
47        Below the list of most used macros in DCMI HAL driver.
48 
49       (+) __HAL_DCMI_ENABLE: Enable the DCMI peripheral.
50       (+) __HAL_DCMI_DISABLE: Disable the DCMI peripheral.
51       (+) __HAL_DCMI_GET_FLAG: Get the DCMI pending flags.
52       (+) __HAL_DCMI_CLEAR_FLAG: Clear the DCMI pending flags.
53       (+) __HAL_DCMI_ENABLE_IT: Enable the specified DCMI interrupts.
54       (+) __HAL_DCMI_DISABLE_IT: Disable the specified DCMI interrupts.
55       (+) __HAL_DCMI_GET_IT_SOURCE: Check whether the specified DCMI interrupt has occurred or not.
56 
57      [..]
58        (@) You can refer to the DCMI HAL driver header file for more useful macros
59 
60     *** Callback registration ***
61     =============================
62 
63     The compilation define USE_HAL_DCMI_REGISTER_CALLBACKS when set to 1
64     allows the user to configure dynamically the driver callbacks.
65     Use functions @ref HAL_DCMI_RegisterCallback() to register a user callback.
66 
67     Function @ref HAL_DCMI_RegisterCallback() allows to register following callbacks:
68       (+) FrameEventCallback : DCMI Frame Event.
69       (+) VsyncEventCallback : DCMI Vsync Event.
70       (+) LineEventCallback  : DCMI Line Event.
71       (+) ErrorCallback      : DCMI error.
72       (+) MspInitCallback    : DCMI MspInit.
73       (+) MspDeInitCallback  : DCMI MspDeInit.
74     This function takes as parameters the HAL peripheral handle, the callback ID
75     and a pointer to the user callback function.
76 
77     Use function @ref HAL_DCMI_UnRegisterCallback() to reset a callback to the default
78     weak (surcharged) function.
79     @ref HAL_DCMI_UnRegisterCallback() takes as parameters the HAL peripheral handle,
80     and the callback ID.
81     This function allows to reset following callbacks:
82       (+) FrameEventCallback : DCMI Frame Event.
83       (+) VsyncEventCallback : DCMI Vsync Event.
84       (+) LineEventCallback  : DCMI Line Event.
85       (+) ErrorCallback      : DCMI error.
86       (+) MspInitCallback    : DCMI MspInit.
87       (+) MspDeInitCallback  : DCMI MspDeInit.
88 
89     By default, after the @ref HAL_DCMI_Init and if the state is HAL_DCMI_STATE_RESET
90     all callbacks are reset to the corresponding legacy weak (surcharged) functions:
91     examples @ref FrameEventCallback(), @ref HAL_DCMI_ErrorCallback().
92     Exception done for MspInit and MspDeInit callbacks that are respectively
93     reset to the legacy weak (surcharged) functions in the @ref HAL_DCMI_Init
94     and @ref  HAL_DCMI_DeInit only when these callbacks are null (not registered beforehand).
95     If not, MspInit or MspDeInit are not null, the @ref HAL_DCMI_Init and @ref HAL_DCMI_DeInit
96     keep and use the user MspInit/MspDeInit callbacks (registered beforehand).
97 
98     Callbacks can be registered/unregistered in READY state only.
99     Exception done for MspInit/MspDeInit callbacks that can be registered/unregistered
100     in READY or RESET state, thus registered (user) MspInit/DeInit callbacks can be used
101     during the Init/DeInit.
102     In that case first register the MspInit/MspDeInit user callbacks
103     using @ref HAL_DCMI_RegisterCallback before calling @ref HAL_DCMI_DeInit
104     or @ref HAL_DCMI_Init function.
105 
106     When the compilation define USE_HAL_DCMI_REGISTER_CALLBACKS is set to 0 or
107     not defined, the callback registering feature is not available
108     and weak (surcharged) callbacks are used.
109 
110   @endverbatim
111   ******************************************************************************
112   * @attention
113   *
114   * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
115   * All rights reserved.</center></h2>
116   *
117   * This software component is licensed by ST under BSD 3-Clause license,
118   * the "License"; You may not use this file except in compliance with the
119   * License. You may obtain a copy of the License at:
120   *                        opensource.org/licenses/BSD-3-Clause
121   *
122   ******************************************************************************
123   */
124 
125 /* Includes ------------------------------------------------------------------*/
126 #include "stm32f4xx_hal.h"
127 
128 /** @addtogroup STM32F4xx_HAL_Driver
129   * @{
130   */
131 /** @defgroup DCMI DCMI
132   * @brief DCMI HAL module driver
133   * @{
134   */
135 
136 #ifdef HAL_DCMI_MODULE_ENABLED
137 
138 #if defined(STM32F407xx) || defined(STM32F417xx) || defined(STM32F427xx) || defined(STM32F437xx) ||\
139     defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) ||\
140     defined(STM32F479xx)
141 /* Private typedef -----------------------------------------------------------*/
142 /* Private define ------------------------------------------------------------*/
143 #define HAL_TIMEOUT_DCMI_STOP    14U  /* Set timeout to 1s  */
144 /* Private macro -------------------------------------------------------------*/
145 /* Private variables ---------------------------------------------------------*/
146 /* Private function prototypes -----------------------------------------------*/
147 static void       DCMI_DMAXferCplt(DMA_HandleTypeDef *hdma);
148 static void       DCMI_DMAError(DMA_HandleTypeDef *hdma);
149 
150 /* Exported functions --------------------------------------------------------*/
151 
152 /** @defgroup DCMI_Exported_Functions DCMI Exported Functions
153   * @{
154   */
155 
156 /** @defgroup DCMI_Exported_Functions_Group1 Initialization and Configuration functions
157   *  @brief   Initialization and Configuration functions
158   *
159 @verbatim
160  ===============================================================================
161                 ##### Initialization and Configuration functions #####
162  ===============================================================================
163     [..]  This section provides functions allowing to:
164       (+) Initialize and configure the DCMI
165       (+) De-initialize the DCMI
166 
167 @endverbatim
168   * @{
169   */
170 
171 /**
172   * @brief  Initializes the DCMI according to the specified
173   *         parameters in the DCMI_InitTypeDef and create the associated handle.
174   * @param  hdcmi pointer to a DCMI_HandleTypeDef structure that contains
175   *                the configuration information for DCMI.
176   * @retval HAL status
177   */
HAL_DCMI_Init(DCMI_HandleTypeDef * hdcmi)178 __weak HAL_StatusTypeDef HAL_DCMI_Init(DCMI_HandleTypeDef *hdcmi)
179 {
180   /* Check the DCMI peripheral state */
181   if(hdcmi == NULL)
182   {
183      return HAL_ERROR;
184   }
185 
186   /* Check function parameters */
187   assert_param(IS_DCMI_ALL_INSTANCE(hdcmi->Instance));
188   assert_param(IS_DCMI_PCKPOLARITY(hdcmi->Init.PCKPolarity));
189   assert_param(IS_DCMI_VSPOLARITY(hdcmi->Init.VSPolarity));
190   assert_param(IS_DCMI_HSPOLARITY(hdcmi->Init.HSPolarity));
191   assert_param(IS_DCMI_SYNCHRO(hdcmi->Init.SynchroMode));
192   assert_param(IS_DCMI_CAPTURE_RATE(hdcmi->Init.CaptureRate));
193   assert_param(IS_DCMI_EXTENDED_DATA(hdcmi->Init.ExtendedDataMode));
194   assert_param(IS_DCMI_MODE_JPEG(hdcmi->Init.JPEGMode));
195 
196   if(hdcmi->State == HAL_DCMI_STATE_RESET)
197   {
198     /* Allocate lock resource and initialize it */
199     hdcmi->Lock = HAL_UNLOCKED;
200     /* Init the low level hardware */
201   /* Init the DCMI Callback settings */
202 #if (USE_HAL_DCMI_REGISTER_CALLBACKS == 1)
203     hdcmi->FrameEventCallback = HAL_DCMI_FrameEventCallback; /* Legacy weak FrameEventCallback  */
204     hdcmi->VsyncEventCallback = HAL_DCMI_VsyncEventCallback; /* Legacy weak VsyncEventCallback  */
205     hdcmi->LineEventCallback  = HAL_DCMI_LineEventCallback;  /* Legacy weak LineEventCallback   */
206     hdcmi->ErrorCallback      = HAL_DCMI_ErrorCallback;      /* Legacy weak ErrorCallback       */
207 
208     if(hdcmi->MspInitCallback == NULL)
209     {
210       /* Legacy weak MspInit Callback        */
211       hdcmi->MspInitCallback = HAL_DCMI_MspInit;
212     }
213     /* Initialize the low level hardware (MSP) */
214     hdcmi->MspInitCallback(hdcmi);
215 #else
216     /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */
217     HAL_DCMI_MspInit(hdcmi);
218 #endif /* (USE_HAL_DCMI_REGISTER_CALLBACKS) */
219     HAL_DCMI_MspInit(hdcmi);
220   }
221 
222   /* Change the DCMI state */
223   hdcmi->State = HAL_DCMI_STATE_BUSY;
224 
225   /* Set DCMI parameters */
226   /* Configures the HS, VS, DE and PC polarity */
227   hdcmi->Instance->CR &= ~(DCMI_CR_PCKPOL | DCMI_CR_HSPOL  | DCMI_CR_VSPOL  | DCMI_CR_EDM_0 |
228                            DCMI_CR_EDM_1  | DCMI_CR_FCRC_0 | DCMI_CR_FCRC_1 | DCMI_CR_JPEG  |
229                            DCMI_CR_ESS);
230   hdcmi->Instance->CR |=  (uint32_t)(hdcmi->Init.SynchroMode | hdcmi->Init.CaptureRate | \
231                                      hdcmi->Init.VSPolarity  | hdcmi->Init.HSPolarity  | \
232                                      hdcmi->Init.PCKPolarity | hdcmi->Init.ExtendedDataMode | \
233                                      hdcmi->Init.JPEGMode);
234 
235   if(hdcmi->Init.SynchroMode == DCMI_SYNCHRO_EMBEDDED)
236   {
237     hdcmi->Instance->ESCR = (((uint32_t)hdcmi->Init.SyncroCode.FrameStartCode)    |
238                              ((uint32_t)hdcmi->Init.SyncroCode.LineStartCode << DCMI_POSITION_ESCR_LSC)|
239                              ((uint32_t)hdcmi->Init.SyncroCode.LineEndCode << DCMI_POSITION_ESCR_LEC) |
240                              ((uint32_t)hdcmi->Init.SyncroCode.FrameEndCode << DCMI_POSITION_ESCR_FEC));
241   }
242 
243   /* Enable the Line, Vsync, Error and Overrun interrupts */
244   __HAL_DCMI_ENABLE_IT(hdcmi, DCMI_IT_LINE | DCMI_IT_VSYNC | DCMI_IT_ERR | DCMI_IT_OVR);
245 
246   /* Update error code */
247   hdcmi->ErrorCode = HAL_DCMI_ERROR_NONE;
248 
249   /* Initialize the DCMI state*/
250   hdcmi->State  = HAL_DCMI_STATE_READY;
251 
252   return HAL_OK;
253 }
254 
255 /**
256   * @brief  Deinitializes the DCMI peripheral registers to their default reset
257   *         values.
258   * @param  hdcmi pointer to a DCMI_HandleTypeDef structure that contains
259   *                the configuration information for DCMI.
260   * @retval HAL status
261   */
262 
HAL_DCMI_DeInit(DCMI_HandleTypeDef * hdcmi)263 HAL_StatusTypeDef HAL_DCMI_DeInit(DCMI_HandleTypeDef *hdcmi)
264 {
265 #if (USE_HAL_DCMI_REGISTER_CALLBACKS == 1)
266   if(hdcmi->MspDeInitCallback == NULL)
267   {
268     hdcmi->MspDeInitCallback = HAL_DCMI_MspDeInit;
269   }
270   /* De-Initialize the low level hardware (MSP) */
271   hdcmi->MspDeInitCallback(hdcmi);
272 #else
273   /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */
274   HAL_DCMI_MspDeInit(hdcmi);
275 #endif /* (USE_HAL_DCMI_REGISTER_CALLBACKS) */
276 
277   /* Update error code */
278   hdcmi->ErrorCode = HAL_DCMI_ERROR_NONE;
279 
280   /* Initialize the DCMI state*/
281   hdcmi->State = HAL_DCMI_STATE_RESET;
282 
283   /* Release Lock */
284   __HAL_UNLOCK(hdcmi);
285 
286   return HAL_OK;
287 }
288 
289 /**
290   * @brief  Initializes the DCMI MSP.
291   * @param  hdcmi pointer to a DCMI_HandleTypeDef structure that contains
292   *                the configuration information for DCMI.
293   * @retval None
294   */
HAL_DCMI_MspInit(DCMI_HandleTypeDef * hdcmi)295 __weak void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi)
296 {
297   /* Prevent unused argument(s) compilation warning */
298   UNUSED(hdcmi);
299   /* NOTE : This function Should not be modified, when the callback is needed,
300             the HAL_DCMI_MspInit could be implemented in the user file
301    */
302 }
303 
304 /**
305   * @brief  DeInitializes the DCMI MSP.
306   * @param  hdcmi pointer to a DCMI_HandleTypeDef structure that contains
307   *                the configuration information for DCMI.
308   * @retval None
309   */
HAL_DCMI_MspDeInit(DCMI_HandleTypeDef * hdcmi)310 __weak void HAL_DCMI_MspDeInit(DCMI_HandleTypeDef* hdcmi)
311 {
312   /* Prevent unused argument(s) compilation warning */
313   UNUSED(hdcmi);
314   /* NOTE : This function Should not be modified, when the callback is needed,
315             the HAL_DCMI_MspDeInit could be implemented in the user file
316    */
317 }
318 
319 /**
320   * @}
321   */
322 /** @defgroup DCMI_Exported_Functions_Group2 IO operation functions
323   *  @brief   IO operation functions
324   *
325 @verbatim
326  ===============================================================================
327                       #####  IO operation functions  #####
328  ===============================================================================
329     [..]  This section provides functions allowing to:
330       (+) Configure destination address and data length and
331           Enables DCMI DMA request and enables DCMI capture
332       (+) Stop the DCMI capture.
333       (+) Handles DCMI interrupt request.
334 
335 @endverbatim
336   * @{
337   */
338 
339 /**
340   * @brief  Enables DCMI DMA request and enables DCMI capture
341   * @param  hdcmi     pointer to a DCMI_HandleTypeDef structure that contains
342   *                    the configuration information for DCMI.
343   * @param  DCMI_Mode DCMI capture mode snapshot or continuous grab.
344   * @param  pData     The destination memory Buffer address (LCD Frame buffer).
345   * @param  Length    The length of capture to be transferred.
346   * @retval HAL status
347   */
HAL_DCMI_Start_DMA(DCMI_HandleTypeDef * hdcmi,uint32_t DCMI_Mode,uint32_t pData,uint32_t Length)348 HAL_StatusTypeDef HAL_DCMI_Start_DMA(DCMI_HandleTypeDef* hdcmi, uint32_t DCMI_Mode, uint32_t pData, uint32_t Length)
349 {
350   /* Initialize the second memory address */
351   uint32_t SecondMemAddress = 0U;
352 
353   /* Check function parameters */
354   assert_param(IS_DCMI_CAPTURE_MODE(DCMI_Mode));
355 
356   /* Process Locked */
357   __HAL_LOCK(hdcmi);
358 
359   /* Lock the DCMI peripheral state */
360   hdcmi->State = HAL_DCMI_STATE_BUSY;
361 
362   /* Enable DCMI by setting DCMIEN bit */
363   __HAL_DCMI_ENABLE(hdcmi);
364 
365   /* Configure the DCMI Mode */
366   hdcmi->Instance->CR &= ~(DCMI_CR_CM);
367   hdcmi->Instance->CR |=  (uint32_t)(DCMI_Mode);
368 
369   /* Set the DMA memory0 conversion complete callback */
370   hdcmi->DMA_Handle->XferCpltCallback = DCMI_DMAXferCplt;
371 
372   /* Set the DMA error callback */
373   hdcmi->DMA_Handle->XferErrorCallback = DCMI_DMAError;
374 
375   /* Set the dma abort callback */
376   hdcmi->DMA_Handle->XferAbortCallback = NULL;
377 
378   /* Reset transfer counters value */
379   hdcmi->XferCount = 0U;
380   hdcmi->XferTransferNumber = 0U;
381 
382   if(Length <= 0xFFFFU)
383   {
384     /* Enable the DMA Stream */
385     HAL_DMA_Start_IT(hdcmi->DMA_Handle, (uint32_t)&hdcmi->Instance->DR, (uint32_t)pData, Length);
386   }
387   else /* DCMI_DOUBLE_BUFFER Mode */
388   {
389     /* Set the DMA memory1 conversion complete callback */
390     hdcmi->DMA_Handle->XferM1CpltCallback = DCMI_DMAXferCplt;
391 
392     /* Initialize transfer parameters */
393     hdcmi->XferCount = 1U;
394     hdcmi->XferSize = Length;
395     hdcmi->pBuffPtr = pData;
396 
397     /* Get the number of buffer */
398     while(hdcmi->XferSize > 0xFFFFU)
399     {
400       hdcmi->XferSize = (hdcmi->XferSize/2U);
401       hdcmi->XferCount = hdcmi->XferCount*2U;
402     }
403 
404     /* Update DCMI counter  and transfer number*/
405     hdcmi->XferCount = (hdcmi->XferCount - 2U);
406     hdcmi->XferTransferNumber = hdcmi->XferCount;
407 
408     /* Update second memory address */
409     SecondMemAddress = (uint32_t)(pData + (4U*hdcmi->XferSize));
410 
411     /* Start DMA multi buffer transfer */
412     HAL_DMAEx_MultiBufferStart_IT(hdcmi->DMA_Handle, (uint32_t)&hdcmi->Instance->DR, (uint32_t)pData, SecondMemAddress, hdcmi->XferSize);
413   }
414 
415   /* Enable Capture */
416   hdcmi->Instance->CR |= DCMI_CR_CAPTURE;
417 
418   /* Release Lock */
419   __HAL_UNLOCK(hdcmi);
420 
421   /* Return function status */
422   return HAL_OK;
423 }
424 
425 /**
426   * @brief  Disable DCMI DMA request and Disable DCMI capture
427   * @param  hdcmi pointer to a DCMI_HandleTypeDef structure that contains
428   *                the configuration information for DCMI.
429   * @retval HAL status
430   */
HAL_DCMI_Stop(DCMI_HandleTypeDef * hdcmi)431 HAL_StatusTypeDef HAL_DCMI_Stop(DCMI_HandleTypeDef* hdcmi)
432 {
433   __IO uint32_t count = SystemCoreClock / HAL_TIMEOUT_DCMI_STOP;
434   HAL_StatusTypeDef status = HAL_OK;
435 
436   /* Process locked */
437   __HAL_LOCK(hdcmi);
438 
439   /* Lock the DCMI peripheral state */
440   hdcmi->State = HAL_DCMI_STATE_BUSY;
441 
442   /* Disable Capture */
443   hdcmi->Instance->CR &= ~(DCMI_CR_CAPTURE);
444 
445   /* Check if the DCMI capture effectively disabled */
446   do
447   {
448     if (count-- == 0U)
449     {
450       /* Update error code */
451       hdcmi->ErrorCode |= HAL_DCMI_ERROR_TIMEOUT;
452 
453       status = HAL_TIMEOUT;
454       break;
455     }
456   }
457   while((hdcmi->Instance->CR & DCMI_CR_CAPTURE) != 0U);
458 
459   /* Disable the DCMI */
460   __HAL_DCMI_DISABLE(hdcmi);
461 
462   /* Disable the DMA */
463   HAL_DMA_Abort(hdcmi->DMA_Handle);
464 
465   /* Update error code */
466   hdcmi->ErrorCode |= HAL_DCMI_ERROR_NONE;
467 
468   /* Change DCMI state */
469   hdcmi->State = HAL_DCMI_STATE_READY;
470 
471   /* Process Unlocked */
472   __HAL_UNLOCK(hdcmi);
473 
474   /* Return function status */
475   return status;
476 }
477 
478 /**
479   * @brief  Suspend DCMI capture
480   * @param  hdcmi pointer to a DCMI_HandleTypeDef structure that contains
481   *                the configuration information for DCMI.
482   * @retval HAL status
483   */
HAL_DCMI_Suspend(DCMI_HandleTypeDef * hdcmi)484 HAL_StatusTypeDef HAL_DCMI_Suspend(DCMI_HandleTypeDef* hdcmi)
485 {
486   __IO uint32_t count = SystemCoreClock / HAL_TIMEOUT_DCMI_STOP;
487   HAL_StatusTypeDef status = HAL_OK;
488 
489   /* Process locked */
490   __HAL_LOCK(hdcmi);
491 
492   if(hdcmi->State == HAL_DCMI_STATE_BUSY)
493   {
494     /* Change DCMI state */
495     hdcmi->State = HAL_DCMI_STATE_SUSPENDED;
496 
497     /* Disable Capture */
498     hdcmi->Instance->CR &= ~(DCMI_CR_CAPTURE);
499 
500     /* Check if the DCMI capture effectively disabled */
501     do
502     {
503       if (count-- == 0U)
504       {
505         /* Update error code */
506         hdcmi->ErrorCode |= HAL_DCMI_ERROR_TIMEOUT;
507 
508         /* Change DCMI state */
509         hdcmi->State = HAL_DCMI_STATE_READY;
510 
511         status = HAL_TIMEOUT;
512         break;
513       }
514     }
515     while((hdcmi->Instance->CR & DCMI_CR_CAPTURE) != 0);
516   }
517   /* Process Unlocked */
518   __HAL_UNLOCK(hdcmi);
519 
520   /* Return function status */
521   return status;
522 }
523 
524 /**
525   * @brief  Resume DCMI capture
526   * @param  hdcmi pointer to a DCMI_HandleTypeDef structure that contains
527   *                the configuration information for DCMI.
528   * @retval HAL status
529   */
HAL_DCMI_Resume(DCMI_HandleTypeDef * hdcmi)530 HAL_StatusTypeDef HAL_DCMI_Resume(DCMI_HandleTypeDef* hdcmi)
531 {
532   /* Process locked */
533   __HAL_LOCK(hdcmi);
534 
535   if(hdcmi->State == HAL_DCMI_STATE_SUSPENDED)
536   {
537     /* Change DCMI state */
538     hdcmi->State = HAL_DCMI_STATE_BUSY;
539 
540     /* Disable Capture */
541     hdcmi->Instance->CR |= DCMI_CR_CAPTURE;
542   }
543   /* Process Unlocked */
544   __HAL_UNLOCK(hdcmi);
545 
546   /* Return function status */
547   return HAL_OK;
548 }
549 
550 /**
551   * @brief  Handles DCMI interrupt request.
552   * @param  hdcmi pointer to a DCMI_HandleTypeDef structure that contains
553   *                the configuration information for the DCMI.
554   * @retval None
555   */
HAL_DCMI_IRQHandler(DCMI_HandleTypeDef * hdcmi)556 void HAL_DCMI_IRQHandler(DCMI_HandleTypeDef *hdcmi)
557 {
558   uint32_t isr_value = READ_REG(hdcmi->Instance->MISR);
559 
560   /* Synchronization error interrupt management *******************************/
561   if((isr_value & DCMI_FLAG_ERRRI) == DCMI_FLAG_ERRRI)
562   {
563     /* Clear the Synchronization error flag */
564     __HAL_DCMI_CLEAR_FLAG(hdcmi, DCMI_FLAG_ERRRI);
565 
566     /* Update error code */
567     hdcmi->ErrorCode |= HAL_DCMI_ERROR_SYNC;
568 
569     /* Change DCMI state */
570     hdcmi->State = HAL_DCMI_STATE_ERROR;
571 
572     /* Set the synchronization error callback */
573     hdcmi->DMA_Handle->XferAbortCallback = DCMI_DMAError;
574 
575     /* Abort the DMA Transfer */
576     HAL_DMA_Abort_IT(hdcmi->DMA_Handle);
577   }
578   /* Overflow interrupt management ********************************************/
579   if((isr_value & DCMI_FLAG_OVRRI) == DCMI_FLAG_OVRRI)
580   {
581     /* Clear the Overflow flag */
582     __HAL_DCMI_CLEAR_FLAG(hdcmi, DCMI_FLAG_OVRRI);
583 
584     /* Update error code */
585     hdcmi->ErrorCode |= HAL_DCMI_ERROR_OVR;
586 
587     /* Change DCMI state */
588     hdcmi->State = HAL_DCMI_STATE_ERROR;
589 
590     /* Set the overflow callback */
591     hdcmi->DMA_Handle->XferAbortCallback = DCMI_DMAError;
592 
593     /* Abort the DMA Transfer */
594     HAL_DMA_Abort_IT(hdcmi->DMA_Handle);
595   }
596   /* Line Interrupt management ************************************************/
597   if((isr_value & DCMI_FLAG_LINERI) == DCMI_FLAG_LINERI)
598   {
599     /* Clear the Line interrupt flag */
600     __HAL_DCMI_CLEAR_FLAG(hdcmi, DCMI_FLAG_LINERI);
601 
602     /* Line interrupt Callback */
603 #if (USE_HAL_DCMI_REGISTER_CALLBACKS == 1)
604     /*Call registered DCMI line event callback*/
605     hdcmi->LineEventCallback(hdcmi);
606 #else
607     HAL_DCMI_LineEventCallback(hdcmi);
608 #endif /* USE_HAL_DCMI_REGISTER_CALLBACKS */
609   }
610   /* VSYNC interrupt management ***********************************************/
611   if((isr_value & DCMI_FLAG_VSYNCRI) == DCMI_FLAG_VSYNCRI)
612   {
613     /* Clear the VSYNC flag */
614     __HAL_DCMI_CLEAR_FLAG(hdcmi, DCMI_FLAG_VSYNCRI);
615 
616     /* VSYNC Callback */
617 #if (USE_HAL_DCMI_REGISTER_CALLBACKS == 1)
618     /*Call registered DCMI vsync event callback*/
619     hdcmi->VsyncEventCallback(hdcmi);
620 #else
621     HAL_DCMI_VsyncEventCallback(hdcmi);
622 #endif /* USE_HAL_DCMI_REGISTER_CALLBACKS */
623   }
624   /* FRAME interrupt management ***********************************************/
625   if((isr_value & DCMI_FLAG_FRAMERI) == DCMI_FLAG_FRAMERI)
626   {
627     /* When snapshot mode, disable Vsync, Error and Overrun interrupts */
628     if((hdcmi->Instance->CR & DCMI_CR_CM) == DCMI_MODE_SNAPSHOT)
629     {
630       /* Disable the Line, Vsync, Error and Overrun interrupts */
631       __HAL_DCMI_DISABLE_IT(hdcmi, DCMI_IT_LINE | DCMI_IT_VSYNC | DCMI_IT_ERR | DCMI_IT_OVR);
632     }
633 
634     /* Disable the Frame interrupt */
635     __HAL_DCMI_DISABLE_IT(hdcmi, DCMI_IT_FRAME);
636 
637     /* Frame Callback */
638 #if (USE_HAL_DCMI_REGISTER_CALLBACKS == 1)
639     /*Call registered DCMI frame event callback*/
640     hdcmi->FrameEventCallback(hdcmi);
641 #else
642     HAL_DCMI_FrameEventCallback(hdcmi);
643 #endif /* USE_HAL_DCMI_REGISTER_CALLBACKS */
644   }
645 }
646 
647 /**
648   * @brief  Error DCMI callback.
649   * @param  hdcmi pointer to a DCMI_HandleTypeDef structure that contains
650   *                the configuration information for DCMI.
651   * @retval None
652   */
HAL_DCMI_ErrorCallback(DCMI_HandleTypeDef * hdcmi)653 __weak void HAL_DCMI_ErrorCallback(DCMI_HandleTypeDef *hdcmi)
654 {
655   /* Prevent unused argument(s) compilation warning */
656   UNUSED(hdcmi);
657   /* NOTE : This function Should not be modified, when the callback is needed,
658             the HAL_DCMI_ErrorCallback could be implemented in the user file
659    */
660 }
661 
662 /**
663   * @brief  Line Event callback.
664   * @param  hdcmi pointer to a DCMI_HandleTypeDef structure that contains
665   *                the configuration information for DCMI.
666   * @retval None
667   */
HAL_DCMI_LineEventCallback(DCMI_HandleTypeDef * hdcmi)668 __weak void HAL_DCMI_LineEventCallback(DCMI_HandleTypeDef *hdcmi)
669 {
670   /* Prevent unused argument(s) compilation warning */
671   UNUSED(hdcmi);
672   /* NOTE : This function Should not be modified, when the callback is needed,
673             the HAL_DCMI_LineEventCallback could be implemented in the user file
674    */
675 }
676 
677 /**
678   * @brief  VSYNC Event callback.
679   * @param  hdcmi pointer to a DCMI_HandleTypeDef structure that contains
680   *                the configuration information for DCMI.
681   * @retval None
682   */
HAL_DCMI_VsyncEventCallback(DCMI_HandleTypeDef * hdcmi)683 __weak void HAL_DCMI_VsyncEventCallback(DCMI_HandleTypeDef *hdcmi)
684 {
685   /* Prevent unused argument(s) compilation warning */
686   UNUSED(hdcmi);
687   /* NOTE : This function Should not be modified, when the callback is needed,
688             the HAL_DCMI_VsyncEventCallback could be implemented in the user file
689    */
690 }
691 
692 /**
693   * @brief  Frame Event callback.
694   * @param  hdcmi pointer to a DCMI_HandleTypeDef structure that contains
695   *                the configuration information for DCMI.
696   * @retval None
697   */
HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef * hdcmi)698 __weak void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
699 {
700   /* Prevent unused argument(s) compilation warning */
701   UNUSED(hdcmi);
702   /* NOTE : This function Should not be modified, when the callback is needed,
703             the HAL_DCMI_FrameEventCallback could be implemented in the user file
704    */
705 }
706 
707 /**
708   * @}
709   */
710 
711 /** @defgroup DCMI_Exported_Functions_Group3 Peripheral Control functions
712   *  @brief    Peripheral Control functions
713   *
714 @verbatim
715  ===============================================================================
716                     ##### Peripheral Control functions #####
717  ===============================================================================
718 [..]  This section provides functions allowing to:
719       (+) Configure the CROP feature.
720       (+) Enable/Disable the CROP feature.
721 
722 @endverbatim
723   * @{
724   */
725 
726 /**
727   * @brief  Configure the DCMI CROP coordinate.
728   * @param  hdcmi pointer to a DCMI_HandleTypeDef structure that contains
729   *                the configuration information for DCMI.
730   * @param  X0    DCMI window X offset
731   * @param  Y0    DCMI window Y offset
732   * @param  XSize DCMI Pixel per line
733   * @param  YSize DCMI Line number
734   * @retval HAL status
735   */
HAL_DCMI_ConfigCrop(DCMI_HandleTypeDef * hdcmi,uint32_t X0,uint32_t Y0,uint32_t XSize,uint32_t YSize)736 HAL_StatusTypeDef HAL_DCMI_ConfigCrop(DCMI_HandleTypeDef *hdcmi, uint32_t X0, uint32_t Y0, uint32_t XSize, uint32_t YSize)
737 {
738   /* Process Locked */
739   __HAL_LOCK(hdcmi);
740 
741   /* Lock the DCMI peripheral state */
742   hdcmi->State = HAL_DCMI_STATE_BUSY;
743 
744   /* Check the parameters */
745   assert_param(IS_DCMI_WINDOW_COORDINATE(X0));
746   assert_param(IS_DCMI_WINDOW_COORDINATE(YSize));
747   assert_param(IS_DCMI_WINDOW_COORDINATE(XSize));
748   assert_param(IS_DCMI_WINDOW_HEIGHT(Y0));
749 
750   /* Configure CROP */
751   hdcmi->Instance->CWSIZER = (XSize | (YSize << DCMI_POSITION_CWSIZE_VLINE));
752   hdcmi->Instance->CWSTRTR = (X0 | (Y0 << DCMI_POSITION_CWSTRT_VST));
753 
754   /* Initialize the DCMI state*/
755   hdcmi->State  = HAL_DCMI_STATE_READY;
756 
757   /* Process Unlocked */
758   __HAL_UNLOCK(hdcmi);
759 
760   return HAL_OK;
761 }
762 
763 /**
764   * @brief  Disable the Crop feature.
765   * @param  hdcmi pointer to a DCMI_HandleTypeDef structure that contains
766   *                the configuration information for DCMI.
767   * @retval HAL status
768   */
HAL_DCMI_DisableCrop(DCMI_HandleTypeDef * hdcmi)769 HAL_StatusTypeDef HAL_DCMI_DisableCrop(DCMI_HandleTypeDef *hdcmi)
770 {
771   /* Process Locked */
772   __HAL_LOCK(hdcmi);
773 
774   /* Lock the DCMI peripheral state */
775   hdcmi->State = HAL_DCMI_STATE_BUSY;
776 
777   /* Disable DCMI Crop feature */
778   hdcmi->Instance->CR &= ~(uint32_t)DCMI_CR_CROP;
779 
780   /* Change the DCMI state*/
781   hdcmi->State = HAL_DCMI_STATE_READY;
782 
783   /* Process Unlocked */
784   __HAL_UNLOCK(hdcmi);
785 
786   return HAL_OK;
787 }
788 
789 /**
790   * @brief  Enable the Crop feature.
791   * @param  hdcmi pointer to a DCMI_HandleTypeDef structure that contains
792   *                the configuration information for DCMI.
793   * @retval HAL status
794   */
HAL_DCMI_EnableCrop(DCMI_HandleTypeDef * hdcmi)795 HAL_StatusTypeDef HAL_DCMI_EnableCrop(DCMI_HandleTypeDef *hdcmi)
796 {
797   /* Process Locked */
798   __HAL_LOCK(hdcmi);
799 
800   /* Lock the DCMI peripheral state */
801   hdcmi->State = HAL_DCMI_STATE_BUSY;
802 
803   /* Enable DCMI Crop feature */
804   hdcmi->Instance->CR |= (uint32_t)DCMI_CR_CROP;
805 
806   /* Change the DCMI state*/
807   hdcmi->State = HAL_DCMI_STATE_READY;
808 
809   /* Process Unlocked */
810   __HAL_UNLOCK(hdcmi);
811 
812   return HAL_OK;
813 }
814 
815 /**
816   * @brief  Set embedded synchronization delimiters unmasks.
817   * @param  hdcmi pointer to a DCMI_HandleTypeDef structure that contains
818   *               the configuration information for DCMI.
819   * @param  SyncUnmask pointer to a DCMI_SyncUnmaskTypeDef structure that contains
820   *                    the embedded synchronization delimiters unmasks.
821   * @retval HAL status
822   */
HAL_DCMI_ConfigSyncUnmask(DCMI_HandleTypeDef * hdcmi,DCMI_SyncUnmaskTypeDef * SyncUnmask)823 HAL_StatusTypeDef  HAL_DCMI_ConfigSyncUnmask(DCMI_HandleTypeDef *hdcmi, DCMI_SyncUnmaskTypeDef *SyncUnmask)
824 {
825   /* Process Locked */
826   __HAL_LOCK(hdcmi);
827 
828   /* Lock the DCMI peripheral state */
829   hdcmi->State = HAL_DCMI_STATE_BUSY;
830 
831   /* Write DCMI embedded synchronization unmask register */
832   hdcmi->Instance->ESUR = (((uint32_t)SyncUnmask->FrameStartUnmask) |\
833                            ((uint32_t)SyncUnmask->LineStartUnmask << DCMI_ESUR_LSU_Pos)|\
834                            ((uint32_t)SyncUnmask->LineEndUnmask << DCMI_ESUR_LEU_Pos)|\
835                            ((uint32_t)SyncUnmask->FrameEndUnmask << DCMI_ESUR_FEU_Pos));
836 
837   /* Change the DCMI state*/
838   hdcmi->State = HAL_DCMI_STATE_READY;
839 
840   /* Process Unlocked */
841   __HAL_UNLOCK(hdcmi);
842 
843   return HAL_OK;
844 }
845 
846 /**
847   * @}
848   */
849 
850 /** @defgroup DCMI_Exported_Functions_Group4 Peripheral State functions
851   *  @brief    Peripheral State functions
852   *
853 @verbatim
854  ===============================================================================
855                ##### Peripheral State and Errors functions #####
856  ===============================================================================
857     [..]
858     This subsection provides functions allowing to
859       (+) Check the DCMI state.
860       (+) Get the specific DCMI error flag.
861 
862 @endverbatim
863   * @{
864   */
865 
866 /**
867   * @brief  Return the DCMI state
868   * @param  hdcmi pointer to a DCMI_HandleTypeDef structure that contains
869   *                the configuration information for DCMI.
870   * @retval HAL state
871   */
HAL_DCMI_GetState(DCMI_HandleTypeDef * hdcmi)872 HAL_DCMI_StateTypeDef HAL_DCMI_GetState(DCMI_HandleTypeDef *hdcmi)
873 {
874   return hdcmi->State;
875 }
876 
877 /**
878   * @brief  Return the DCMI error code
879   * @param  hdcmi  pointer to a DCMI_HandleTypeDef structure that contains
880   *               the configuration information for DCMI.
881   * @retval DCMI Error Code
882   */
HAL_DCMI_GetError(DCMI_HandleTypeDef * hdcmi)883 uint32_t HAL_DCMI_GetError(DCMI_HandleTypeDef *hdcmi)
884 {
885   return hdcmi->ErrorCode;
886 }
887 
888 #if (USE_HAL_DCMI_REGISTER_CALLBACKS == 1)
889 /**
890   * @brief DCMI Callback registering
891   * @param hdcmi        pointer to a DCMI_HandleTypeDef structure that contains
892   *                     the configuration information for DCMI.
893   * @param CallbackID   dcmi Callback ID
894   * @param pCallback    pointer to DCMI_CallbackTypeDef structure
895   * @retval status
896   */
HAL_DCMI_RegisterCallback(DCMI_HandleTypeDef * hdcmi,HAL_DCMI_CallbackIDTypeDef CallbackID,pDCMI_CallbackTypeDef pCallback)897 HAL_StatusTypeDef HAL_DCMI_RegisterCallback(DCMI_HandleTypeDef *hdcmi, HAL_DCMI_CallbackIDTypeDef CallbackID, pDCMI_CallbackTypeDef pCallback)
898 {
899   HAL_StatusTypeDef status = HAL_OK;
900 
901   if(pCallback == NULL)
902   {
903     /* update the error code */
904     hdcmi->ErrorCode |= HAL_DCMI_ERROR_INVALID_CALLBACK;
905     /* update return status */
906     status = HAL_ERROR;
907   }
908   else
909   {
910     if(hdcmi->State == HAL_DCMI_STATE_READY)
911     {
912       switch (CallbackID)
913       {
914       case HAL_DCMI_FRAME_EVENT_CB_ID :
915         hdcmi->FrameEventCallback = pCallback;
916         break;
917 
918       case HAL_DCMI_VSYNC_EVENT_CB_ID :
919         hdcmi->VsyncEventCallback = pCallback;
920         break;
921 
922       case HAL_DCMI_LINE_EVENT_CB_ID :
923         hdcmi->LineEventCallback = pCallback;
924         break;
925 
926       case HAL_DCMI_ERROR_CB_ID :
927         hdcmi->ErrorCallback = pCallback;
928         break;
929 
930       case HAL_DCMI_MSPINIT_CB_ID :
931         hdcmi->MspInitCallback = pCallback;
932         break;
933 
934       case HAL_DCMI_MSPDEINIT_CB_ID :
935         hdcmi->MspDeInitCallback = pCallback;
936         break;
937 
938       default :
939         /* Return error status */
940         status =  HAL_ERROR;
941         break;
942       }
943     }
944     else if(hdcmi->State == HAL_DCMI_STATE_RESET)
945     {
946       switch (CallbackID)
947       {
948       case HAL_DCMI_MSPINIT_CB_ID :
949         hdcmi->MspInitCallback = pCallback;
950         break;
951 
952       case HAL_DCMI_MSPDEINIT_CB_ID :
953         hdcmi->MspDeInitCallback = pCallback;
954         break;
955 
956       default :
957         /* update the error code */
958         hdcmi->ErrorCode |= HAL_DCMI_ERROR_INVALID_CALLBACK;
959         /* update return status */
960         status = HAL_ERROR;
961         break;
962       }
963     }
964     else
965     {
966       /* update the error code */
967       hdcmi->ErrorCode |= HAL_DCMI_ERROR_INVALID_CALLBACK;
968       /* update return status */
969       status = HAL_ERROR;
970     }
971   }
972 
973   return status;
974 }
975 
976 /**
977   * @brief DCMI Callback Unregistering
978   * @param hdcmi       dcmi handle
979   * @param CallbackID  dcmi Callback ID
980   * @retval status
981   */
HAL_DCMI_UnRegisterCallback(DCMI_HandleTypeDef * hdcmi,HAL_DCMI_CallbackIDTypeDef CallbackID)982 HAL_StatusTypeDef HAL_DCMI_UnRegisterCallback(DCMI_HandleTypeDef *hdcmi, HAL_DCMI_CallbackIDTypeDef CallbackID)
983 {
984   HAL_StatusTypeDef status = HAL_OK;
985 
986   if(hdcmi->State == HAL_DCMI_STATE_READY)
987   {
988     switch (CallbackID)
989     {
990     case HAL_DCMI_FRAME_EVENT_CB_ID :
991       hdcmi->FrameEventCallback = HAL_DCMI_FrameEventCallback;  /* Legacy weak  FrameEventCallback  */
992       break;
993 
994     case HAL_DCMI_VSYNC_EVENT_CB_ID :
995       hdcmi->VsyncEventCallback = HAL_DCMI_VsyncEventCallback;  /* Legacy weak VsyncEventCallback       */
996       break;
997 
998     case HAL_DCMI_LINE_EVENT_CB_ID :
999       hdcmi->LineEventCallback = HAL_DCMI_LineEventCallback;    /* Legacy weak LineEventCallback   */
1000       break;
1001 
1002     case HAL_DCMI_ERROR_CB_ID :
1003       hdcmi->ErrorCallback = HAL_DCMI_ErrorCallback;           /* Legacy weak ErrorCallback        */
1004       break;
1005 
1006     case HAL_DCMI_MSPINIT_CB_ID :
1007       hdcmi->MspInitCallback = HAL_DCMI_MspInit;
1008       break;
1009 
1010     case HAL_DCMI_MSPDEINIT_CB_ID :
1011       hdcmi->MspDeInitCallback = HAL_DCMI_MspDeInit;
1012       break;
1013 
1014     default :
1015       /* update the error code */
1016       hdcmi->ErrorCode |= HAL_DCMI_ERROR_INVALID_CALLBACK;
1017       /* update return status */
1018       status = HAL_ERROR;
1019       break;
1020     }
1021   }
1022   else if(hdcmi->State == HAL_DCMI_STATE_RESET)
1023   {
1024     switch (CallbackID)
1025     {
1026     case HAL_DCMI_MSPINIT_CB_ID :
1027       hdcmi->MspInitCallback = HAL_DCMI_MspInit;
1028       break;
1029 
1030     case HAL_DCMI_MSPDEINIT_CB_ID :
1031       hdcmi->MspDeInitCallback = HAL_DCMI_MspDeInit;
1032       break;
1033 
1034     default :
1035       /* update the error code */
1036       hdcmi->ErrorCode |= HAL_DCMI_ERROR_INVALID_CALLBACK;
1037       /* update return status */
1038       status = HAL_ERROR;
1039       break;
1040     }
1041   }
1042   else
1043   {
1044     /* update the error code */
1045     hdcmi->ErrorCode |= HAL_DCMI_ERROR_INVALID_CALLBACK;
1046     /* update return status */
1047     status = HAL_ERROR;
1048   }
1049 
1050   return status;
1051 }
1052 #endif /* USE_HAL_DCMI_REGISTER_CALLBACKS */
1053 
1054 /**
1055   * @}
1056   */
1057 /* Private functions ---------------------------------------------------------*/
1058 /** @defgroup DCMI_Private_Functions DCMI Private Functions
1059   * @{
1060   */
1061 
1062 /**
1063   * @brief  DMA conversion complete callback.
1064   * @param  hdma pointer to a DMA_HandleTypeDef structure that contains
1065   *               the configuration information for the specified DMA module.
1066   * @retval None
1067   */
DCMI_DMAXferCplt(DMA_HandleTypeDef * hdma)1068 static void DCMI_DMAXferCplt(DMA_HandleTypeDef *hdma)
1069 {
1070   uint32_t tmp = 0U;
1071 
1072   DCMI_HandleTypeDef* hdcmi = ( DCMI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
1073 
1074   if(hdcmi->XferCount != 0U)
1075   {
1076     /* Update memory 0 address location */
1077     tmp = ((hdcmi->DMA_Handle->Instance->CR) & DMA_SxCR_CT);
1078     if(((hdcmi->XferCount % 2U) == 0U) && (tmp != 0U))
1079     {
1080       tmp = hdcmi->DMA_Handle->Instance->M0AR;
1081       HAL_DMAEx_ChangeMemory(hdcmi->DMA_Handle, (tmp + (8U*hdcmi->XferSize)), MEMORY0);
1082       hdcmi->XferCount--;
1083     }
1084     /* Update memory 1 address location */
1085     else if((hdcmi->DMA_Handle->Instance->CR & DMA_SxCR_CT) == 0U)
1086     {
1087       tmp = hdcmi->DMA_Handle->Instance->M1AR;
1088       HAL_DMAEx_ChangeMemory(hdcmi->DMA_Handle, (tmp + (8U*hdcmi->XferSize)), MEMORY1);
1089       hdcmi->XferCount--;
1090     }
1091   }
1092   /* Update memory 0 address location */
1093   else if((hdcmi->DMA_Handle->Instance->CR & DMA_SxCR_CT) != 0U)
1094   {
1095     hdcmi->DMA_Handle->Instance->M0AR = hdcmi->pBuffPtr;
1096   }
1097   /* Update memory 1 address location */
1098   else if((hdcmi->DMA_Handle->Instance->CR & DMA_SxCR_CT) == 0U)
1099   {
1100     tmp = hdcmi->pBuffPtr;
1101     hdcmi->DMA_Handle->Instance->M1AR = (tmp + (4U*hdcmi->XferSize));
1102     hdcmi->XferCount = hdcmi->XferTransferNumber;
1103   }
1104 
1105   /* Check if the frame is transferred */
1106   if(hdcmi->XferCount == hdcmi->XferTransferNumber)
1107   {
1108     /* Enable the Frame interrupt */
1109     __HAL_DCMI_ENABLE_IT(hdcmi, DCMI_IT_FRAME);
1110 
1111     /* When snapshot mode, set dcmi state to ready */
1112     if((hdcmi->Instance->CR & DCMI_CR_CM) == DCMI_MODE_SNAPSHOT)
1113     {
1114       hdcmi->State= HAL_DCMI_STATE_READY;
1115     }
1116   }
1117 }
1118 
1119 /**
1120   * @brief  DMA error callback
1121   * @param  hdma pointer to a DMA_HandleTypeDef structure that contains
1122   *                the configuration information for the specified DMA module.
1123   * @retval None
1124   */
DCMI_DMAError(DMA_HandleTypeDef * hdma)1125 static void DCMI_DMAError(DMA_HandleTypeDef *hdma)
1126 {
1127   DCMI_HandleTypeDef* hdcmi = ( DCMI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
1128 
1129   if(hdcmi->DMA_Handle->ErrorCode != HAL_DMA_ERROR_FE)
1130   {
1131     /* Initialize the DCMI state*/
1132     hdcmi->State = HAL_DCMI_STATE_READY;
1133   }
1134 
1135   /* DCMI error Callback */
1136 #if (USE_HAL_DCMI_REGISTER_CALLBACKS == 1)
1137     /*Call registered DCMI error callback*/
1138     hdcmi->ErrorCallback(hdcmi);
1139 #else
1140   HAL_DCMI_ErrorCallback(hdcmi);
1141 #endif /* USE_HAL_DCMI_REGISTER_CALLBACKS */
1142 
1143 }
1144 
1145 /**
1146   * @}
1147   */
1148 
1149 /**
1150   * @}
1151   */
1152 #endif /* STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\
1153           STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\
1154           STM32F479xx */
1155 #endif /* HAL_DCMI_MODULE_ENABLED */
1156 /**
1157   * @}
1158   */
1159 
1160 /**
1161   * @}
1162   */
1163 
1164 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
1165