comparison Common/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dcmi.c @ 160:e3ca52b8e7fa

Merge with FlipDisplay
author heinrichsweikamp
date Thu, 07 Mar 2019 15:06:43 +0100
parents c78bcbd5deda
children
comparison
equal deleted inserted replaced
80:cc2bb7bb8456 160:e3ca52b8e7fa
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 @endverbatim
61 ******************************************************************************
62 * @attention
63 *
64 * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
65 *
66 * Redistribution and use in source and binary forms, with or without modification,
67 * are permitted provided that the following conditions are met:
68 * 1. Redistributions of source code must retain the above copyright notice,
69 * this list of conditions and the following disclaimer.
70 * 2. Redistributions in binary form must reproduce the above copyright notice,
71 * this list of conditions and the following disclaimer in the documentation
72 * and/or other materials provided with the distribution.
73 * 3. Neither the name of STMicroelectronics nor the names of its contributors
74 * may be used to endorse or promote products derived from this software
75 * without specific prior written permission.
76 *
77 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
78 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
79 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
80 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
81 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
82 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
83 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
84 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
85 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
86 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
87 *
88 ******************************************************************************
89 */
90
91 /* Includes ------------------------------------------------------------------*/
92 #include "stm32f4xx_hal.h"
93
94 /** @addtogroup STM32F4xx_HAL_Driver
95 * @{
96 */
97 /** @defgroup DCMI DCMI
98 * @brief DCMI HAL module driver
99 * @{
100 */
101
102 #ifdef HAL_DCMI_MODULE_ENABLED
103
104 #if defined(STM32F407xx) || defined(STM32F417xx) || defined(STM32F427xx) || defined(STM32F437xx) ||\
105 defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) ||\
106 defined(STM32F479xx)
107 /* Private typedef -----------------------------------------------------------*/
108 /* Private define ------------------------------------------------------------*/
109 #define HAL_TIMEOUT_DCMI_STOP 14U /* Set timeout to 1s */
110 /* Private macro -------------------------------------------------------------*/
111 /* Private variables ---------------------------------------------------------*/
112 /* Private function prototypes -----------------------------------------------*/
113 static void DCMI_DMAXferCplt(DMA_HandleTypeDef *hdma);
114 static void DCMI_DMAError(DMA_HandleTypeDef *hdma);
115
116 /* Exported functions --------------------------------------------------------*/
117
118 /** @defgroup DCMI_Exported_Functions DCMI Exported Functions
119 * @{
120 */
121
122 /** @defgroup DCMI_Exported_Functions_Group1 Initialization and Configuration functions
123 * @brief Initialization and Configuration functions
124 *
125 @verbatim
126 ===============================================================================
127 ##### Initialization and Configuration functions #####
128 ===============================================================================
129 [..] This section provides functions allowing to:
130 (+) Initialize and configure the DCMI
131 (+) De-initialize the DCMI
132
133 @endverbatim
134 * @{
135 */
136
137 /**
138 * @brief Initializes the DCMI according to the specified
139 * parameters in the DCMI_InitTypeDef and create the associated handle.
140 * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains
141 * the configuration information for DCMI.
142 * @retval HAL status
143 */
144 __weak HAL_StatusTypeDef HAL_DCMI_Init(DCMI_HandleTypeDef *hdcmi)
145 {
146 /* Check the DCMI peripheral state */
147 if(hdcmi == NULL)
148 {
149 return HAL_ERROR;
150 }
151
152 /* Check function parameters */
153 assert_param(IS_DCMI_ALL_INSTANCE(hdcmi->Instance));
154 assert_param(IS_DCMI_PCKPOLARITY(hdcmi->Init.PCKPolarity));
155 assert_param(IS_DCMI_VSPOLARITY(hdcmi->Init.VSPolarity));
156 assert_param(IS_DCMI_HSPOLARITY(hdcmi->Init.HSPolarity));
157 assert_param(IS_DCMI_SYNCHRO(hdcmi->Init.SynchroMode));
158 assert_param(IS_DCMI_CAPTURE_RATE(hdcmi->Init.CaptureRate));
159 assert_param(IS_DCMI_EXTENDED_DATA(hdcmi->Init.ExtendedDataMode));
160 assert_param(IS_DCMI_MODE_JPEG(hdcmi->Init.JPEGMode));
161
162 if(hdcmi->State == HAL_DCMI_STATE_RESET)
163 {
164 /* Allocate lock resource and initialize it */
165 hdcmi->Lock = HAL_UNLOCKED;
166 /* Init the low level hardware */
167 HAL_DCMI_MspInit(hdcmi);
168 }
169
170 /* Change the DCMI state */
171 hdcmi->State = HAL_DCMI_STATE_BUSY;
172
173 /* Set DCMI parameters */
174 /* Configures the HS, VS, DE and PC polarity */
175 hdcmi->Instance->CR &= ~(DCMI_CR_PCKPOL | DCMI_CR_HSPOL | DCMI_CR_VSPOL | DCMI_CR_EDM_0 |
176 DCMI_CR_EDM_1 | DCMI_CR_FCRC_0 | DCMI_CR_FCRC_1 | DCMI_CR_JPEG |
177 DCMI_CR_ESS);
178 hdcmi->Instance->CR |= (uint32_t)(hdcmi->Init.SynchroMode | hdcmi->Init.CaptureRate | \
179 hdcmi->Init.VSPolarity | hdcmi->Init.HSPolarity | \
180 hdcmi->Init.PCKPolarity | hdcmi->Init.ExtendedDataMode | \
181 hdcmi->Init.JPEGMode);
182
183 if(hdcmi->Init.SynchroMode == DCMI_SYNCHRO_EMBEDDED)
184 {
185 hdcmi->Instance->ESCR = (((uint32_t)hdcmi->Init.SyncroCode.FrameStartCode) |
186 ((uint32_t)hdcmi->Init.SyncroCode.LineStartCode << DCMI_POSITION_ESCR_LSC)|
187 ((uint32_t)hdcmi->Init.SyncroCode.LineEndCode << DCMI_POSITION_ESCR_LEC) |
188 ((uint32_t)hdcmi->Init.SyncroCode.FrameEndCode << DCMI_POSITION_ESCR_FEC));
189 }
190
191 /* Enable the Line, Vsync, Error and Overrun interrupts */
192 __HAL_DCMI_ENABLE_IT(hdcmi, DCMI_IT_LINE | DCMI_IT_VSYNC | DCMI_IT_ERR | DCMI_IT_OVR);
193
194 /* Update error code */
195 hdcmi->ErrorCode = HAL_DCMI_ERROR_NONE;
196
197 /* Initialize the DCMI state*/
198 hdcmi->State = HAL_DCMI_STATE_READY;
199
200 return HAL_OK;
201 }
202
203 /**
204 * @brief Deinitializes the DCMI peripheral registers to their default reset
205 * values.
206 * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains
207 * the configuration information for DCMI.
208 * @retval HAL status
209 */
210
211 HAL_StatusTypeDef HAL_DCMI_DeInit(DCMI_HandleTypeDef *hdcmi)
212 {
213 /* DeInit the low level hardware */
214 HAL_DCMI_MspDeInit(hdcmi);
215
216 /* Update error code */
217 hdcmi->ErrorCode = HAL_DCMI_ERROR_NONE;
218
219 /* Initialize the DCMI state*/
220 hdcmi->State = HAL_DCMI_STATE_RESET;
221
222 /* Release Lock */
223 __HAL_UNLOCK(hdcmi);
224
225 return HAL_OK;
226 }
227
228 /**
229 * @brief Initializes the DCMI MSP.
230 * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains
231 * the configuration information for DCMI.
232 * @retval None
233 */
234 __weak void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi)
235 {
236 /* Prevent unused argument(s) compilation warning */
237 UNUSED(hdcmi);
238 /* NOTE : This function Should not be modified, when the callback is needed,
239 the HAL_DCMI_MspInit could be implemented in the user file
240 */
241 }
242
243 /**
244 * @brief DeInitializes the DCMI MSP.
245 * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains
246 * the configuration information for DCMI.
247 * @retval None
248 */
249 __weak void HAL_DCMI_MspDeInit(DCMI_HandleTypeDef* hdcmi)
250 {
251 /* Prevent unused argument(s) compilation warning */
252 UNUSED(hdcmi);
253 /* NOTE : This function Should not be modified, when the callback is needed,
254 the HAL_DCMI_MspDeInit could be implemented in the user file
255 */
256 }
257
258 /**
259 * @}
260 */
261 /** @defgroup DCMI_Exported_Functions_Group2 IO operation functions
262 * @brief IO operation functions
263 *
264 @verbatim
265 ===============================================================================
266 ##### IO operation functions #####
267 ===============================================================================
268 [..] This section provides functions allowing to:
269 (+) Configure destination address and data length and
270 Enables DCMI DMA request and enables DCMI capture
271 (+) Stop the DCMI capture.
272 (+) Handles DCMI interrupt request.
273
274 @endverbatim
275 * @{
276 */
277
278 /**
279 * @brief Enables DCMI DMA request and enables DCMI capture
280 * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains
281 * the configuration information for DCMI.
282 * @param DCMI_Mode DCMI capture mode snapshot or continuous grab.
283 * @param pData The destination memory Buffer address (LCD Frame buffer).
284 * @param Length The length of capture to be transferred.
285 * @retval HAL status
286 */
287 HAL_StatusTypeDef HAL_DCMI_Start_DMA(DCMI_HandleTypeDef* hdcmi, uint32_t DCMI_Mode, uint32_t pData, uint32_t Length)
288 {
289 /* Initialize the second memory address */
290 uint32_t SecondMemAddress = 0U;
291
292 /* Check function parameters */
293 assert_param(IS_DCMI_CAPTURE_MODE(DCMI_Mode));
294
295 /* Process Locked */
296 __HAL_LOCK(hdcmi);
297
298 /* Lock the DCMI peripheral state */
299 hdcmi->State = HAL_DCMI_STATE_BUSY;
300
301 /* Enable DCMI by setting DCMIEN bit */
302 __HAL_DCMI_ENABLE(hdcmi);
303
304 /* Configure the DCMI Mode */
305 hdcmi->Instance->CR &= ~(DCMI_CR_CM);
306 hdcmi->Instance->CR |= (uint32_t)(DCMI_Mode);
307
308 /* Set the DMA memory0 conversion complete callback */
309 hdcmi->DMA_Handle->XferCpltCallback = DCMI_DMAXferCplt;
310
311 /* Set the DMA error callback */
312 hdcmi->DMA_Handle->XferErrorCallback = DCMI_DMAError;
313
314 /* Set the dma abort callback */
315 hdcmi->DMA_Handle->XferAbortCallback = NULL;
316
317 /* Reset transfer counters value */
318 hdcmi->XferCount = 0U;
319 hdcmi->XferTransferNumber = 0U;
320
321 if(Length <= 0xFFFFU)
322 {
323 /* Enable the DMA Stream */
324 HAL_DMA_Start_IT(hdcmi->DMA_Handle, (uint32_t)&hdcmi->Instance->DR, (uint32_t)pData, Length);
325 }
326 else /* DCMI_DOUBLE_BUFFER Mode */
327 {
328 /* Set the DMA memory1 conversion complete callback */
329 hdcmi->DMA_Handle->XferM1CpltCallback = DCMI_DMAXferCplt;
330
331 /* Initialize transfer parameters */
332 hdcmi->XferCount = 1U;
333 hdcmi->XferSize = Length;
334 hdcmi->pBuffPtr = pData;
335
336 /* Get the number of buffer */
337 while(hdcmi->XferSize > 0xFFFFU)
338 {
339 hdcmi->XferSize = (hdcmi->XferSize/2U);
340 hdcmi->XferCount = hdcmi->XferCount*2U;
341 }
342
343 /* Update DCMI counter and transfer number*/
344 hdcmi->XferCount = (hdcmi->XferCount - 2U);
345 hdcmi->XferTransferNumber = hdcmi->XferCount;
346
347 /* Update second memory address */
348 SecondMemAddress = (uint32_t)(pData + (4U*hdcmi->XferSize));
349
350 /* Start DMA multi buffer transfer */
351 HAL_DMAEx_MultiBufferStart_IT(hdcmi->DMA_Handle, (uint32_t)&hdcmi->Instance->DR, (uint32_t)pData, SecondMemAddress, hdcmi->XferSize);
352 }
353
354 /* Enable Capture */
355 hdcmi->Instance->CR |= DCMI_CR_CAPTURE;
356
357 /* Release Lock */
358 __HAL_UNLOCK(hdcmi);
359
360 /* Return function status */
361 return HAL_OK;
362 }
363
364 /**
365 * @brief Disable DCMI DMA request and Disable DCMI capture
366 * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains
367 * the configuration information for DCMI.
368 * @retval HAL status
369 */
370 HAL_StatusTypeDef HAL_DCMI_Stop(DCMI_HandleTypeDef* hdcmi)
371 {
372 __IO uint32_t count = SystemCoreClock / HAL_TIMEOUT_DCMI_STOP;
373 HAL_StatusTypeDef status = HAL_OK;
374
375 /* Process locked */
376 __HAL_LOCK(hdcmi);
377
378 /* Lock the DCMI peripheral state */
379 hdcmi->State = HAL_DCMI_STATE_BUSY;
380
381 /* Disable Capture */
382 hdcmi->Instance->CR &= ~(DCMI_CR_CAPTURE);
383
384 /* Check if the DCMI capture effectively disabled */
385 do
386 {
387 if (count-- == 0U)
388 {
389 /* Update error code */
390 hdcmi->ErrorCode |= HAL_DCMI_ERROR_TIMEOUT;
391
392 status = HAL_TIMEOUT;
393 }
394 }
395 while((hdcmi->Instance->CR & DCMI_CR_CAPTURE) != 0U);
396
397 /* Disable the DCMI */
398 __HAL_DCMI_DISABLE(hdcmi);
399
400 /* Disable the DMA */
401 HAL_DMA_Abort(hdcmi->DMA_Handle);
402
403 /* Update error code */
404 hdcmi->ErrorCode |= HAL_DCMI_ERROR_NONE;
405
406 /* Change DCMI state */
407 hdcmi->State = HAL_DCMI_STATE_READY;
408
409 /* Process Unlocked */
410 __HAL_UNLOCK(hdcmi);
411
412 /* Return function status */
413 return status;
414 }
415
416 /**
417 * @brief Suspend DCMI capture
418 * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains
419 * the configuration information for DCMI.
420 * @retval HAL status
421 */
422 HAL_StatusTypeDef HAL_DCMI_Suspend(DCMI_HandleTypeDef* hdcmi)
423 {
424 __IO uint32_t count = SystemCoreClock / HAL_TIMEOUT_DCMI_STOP;
425 HAL_StatusTypeDef status = HAL_OK;
426
427 /* Process locked */
428 __HAL_LOCK(hdcmi);
429
430 if(hdcmi->State == HAL_DCMI_STATE_BUSY)
431 {
432 /* Change DCMI state */
433 hdcmi->State = HAL_DCMI_STATE_SUSPENDED;
434
435 /* Disable Capture */
436 hdcmi->Instance->CR &= ~(DCMI_CR_CAPTURE);
437
438 /* Check if the DCMI capture effectively disabled */
439 do
440 {
441 if (count-- == 0U)
442 {
443 /* Update error code */
444 hdcmi->ErrorCode |= HAL_DCMI_ERROR_TIMEOUT;
445
446 /* Change DCMI state */
447 hdcmi->State = HAL_DCMI_STATE_READY;
448
449 status = HAL_TIMEOUT;
450 break;
451 }
452 }
453 while((hdcmi->Instance->CR & DCMI_CR_CAPTURE) != 0);
454 }
455 /* Process Unlocked */
456 __HAL_UNLOCK(hdcmi);
457
458 /* Return function status */
459 return status;
460 }
461
462 /**
463 * @brief Resume DCMI capture
464 * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains
465 * the configuration information for DCMI.
466 * @retval HAL status
467 */
468 HAL_StatusTypeDef HAL_DCMI_Resume(DCMI_HandleTypeDef* hdcmi)
469 {
470 /* Process locked */
471 __HAL_LOCK(hdcmi);
472
473 if(hdcmi->State == HAL_DCMI_STATE_SUSPENDED)
474 {
475 /* Change DCMI state */
476 hdcmi->State = HAL_DCMI_STATE_BUSY;
477
478 /* Disable Capture */
479 hdcmi->Instance->CR |= DCMI_CR_CAPTURE;
480 }
481 /* Process Unlocked */
482 __HAL_UNLOCK(hdcmi);
483
484 /* Return function status */
485 return HAL_OK;
486 }
487
488 /**
489 * @brief Handles DCMI interrupt request.
490 * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains
491 * the configuration information for the DCMI.
492 * @retval None
493 */
494 void HAL_DCMI_IRQHandler(DCMI_HandleTypeDef *hdcmi)
495 {
496 uint32_t isr_value = READ_REG(hdcmi->Instance->MISR);
497
498 /* Synchronization error interrupt management *******************************/
499 if((isr_value & DCMI_FLAG_ERRRI) == DCMI_FLAG_ERRRI)
500 {
501 /* Clear the Synchronization error flag */
502 __HAL_DCMI_CLEAR_FLAG(hdcmi, DCMI_FLAG_ERRRI);
503
504 /* Update error code */
505 hdcmi->ErrorCode |= HAL_DCMI_ERROR_SYNC;
506
507 /* Change DCMI state */
508 hdcmi->State = HAL_DCMI_STATE_ERROR;
509
510 /* Set the synchronization error callback */
511 hdcmi->DMA_Handle->XferAbortCallback = DCMI_DMAError;
512
513 /* Abort the DMA Transfer */
514 HAL_DMA_Abort_IT(hdcmi->DMA_Handle);
515 }
516 /* Overflow interrupt management ********************************************/
517 if((isr_value & DCMI_FLAG_OVRRI) == DCMI_FLAG_OVRRI)
518 {
519 /* Clear the Overflow flag */
520 __HAL_DCMI_CLEAR_FLAG(hdcmi, DCMI_FLAG_OVRRI);
521
522 /* Update error code */
523 hdcmi->ErrorCode |= HAL_DCMI_ERROR_OVR;
524
525 /* Change DCMI state */
526 hdcmi->State = HAL_DCMI_STATE_ERROR;
527
528 /* Set the overflow callback */
529 hdcmi->DMA_Handle->XferAbortCallback = DCMI_DMAError;
530
531 /* Abort the DMA Transfer */
532 HAL_DMA_Abort_IT(hdcmi->DMA_Handle);
533 }
534 /* Line Interrupt management ************************************************/
535 if((isr_value & DCMI_FLAG_LINERI) == DCMI_FLAG_LINERI)
536 {
537 /* Clear the Line interrupt flag */
538 __HAL_DCMI_CLEAR_FLAG(hdcmi, DCMI_FLAG_LINERI);
539
540 /* Line interrupt Callback */
541 HAL_DCMI_LineEventCallback(hdcmi);
542 }
543 /* VSYNC interrupt management ***********************************************/
544 if((isr_value & DCMI_FLAG_VSYNCRI) == DCMI_FLAG_VSYNCRI)
545 {
546 /* Clear the VSYNC flag */
547 __HAL_DCMI_CLEAR_FLAG(hdcmi, DCMI_FLAG_VSYNCRI);
548
549 /* VSYNC Callback */
550 HAL_DCMI_VsyncEventCallback(hdcmi);
551 }
552 /* FRAME interrupt management ***********************************************/
553 if((isr_value & DCMI_FLAG_FRAMERI) == DCMI_FLAG_FRAMERI)
554 {
555 /* When snapshot mode, disable Vsync, Error and Overrun interrupts */
556 if((hdcmi->Instance->CR & DCMI_CR_CM) == DCMI_MODE_SNAPSHOT)
557 {
558 /* Disable the Line, Vsync, Error and Overrun interrupts */
559 __HAL_DCMI_DISABLE_IT(hdcmi, DCMI_IT_LINE | DCMI_IT_VSYNC | DCMI_IT_ERR | DCMI_IT_OVR);
560 }
561
562 /* Disable the Frame interrupt */
563 __HAL_DCMI_DISABLE_IT(hdcmi, DCMI_IT_FRAME);
564
565 /* Frame Callback */
566 HAL_DCMI_FrameEventCallback(hdcmi);
567 }
568 }
569
570 /**
571 * @brief Error DCMI callback.
572 * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains
573 * the configuration information for DCMI.
574 * @retval None
575 */
576 __weak void HAL_DCMI_ErrorCallback(DCMI_HandleTypeDef *hdcmi)
577 {
578 /* Prevent unused argument(s) compilation warning */
579 UNUSED(hdcmi);
580 /* NOTE : This function Should not be modified, when the callback is needed,
581 the HAL_DCMI_ErrorCallback could be implemented in the user file
582 */
583 }
584
585 /**
586 * @brief Line Event callback.
587 * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains
588 * the configuration information for DCMI.
589 * @retval None
590 */
591 __weak void HAL_DCMI_LineEventCallback(DCMI_HandleTypeDef *hdcmi)
592 {
593 /* Prevent unused argument(s) compilation warning */
594 UNUSED(hdcmi);
595 /* NOTE : This function Should not be modified, when the callback is needed,
596 the HAL_DCMI_LineEventCallback could be implemented in the user file
597 */
598 }
599
600 /**
601 * @brief VSYNC Event callback.
602 * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains
603 * the configuration information for DCMI.
604 * @retval None
605 */
606 __weak void HAL_DCMI_VsyncEventCallback(DCMI_HandleTypeDef *hdcmi)
607 {
608 /* Prevent unused argument(s) compilation warning */
609 UNUSED(hdcmi);
610 /* NOTE : This function Should not be modified, when the callback is needed,
611 the HAL_DCMI_VsyncEventCallback could be implemented in the user file
612 */
613 }
614
615 /**
616 * @brief Frame Event callback.
617 * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains
618 * the configuration information for DCMI.
619 * @retval None
620 */
621 __weak void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
622 {
623 /* Prevent unused argument(s) compilation warning */
624 UNUSED(hdcmi);
625 /* NOTE : This function Should not be modified, when the callback is needed,
626 the HAL_DCMI_FrameEventCallback could be implemented in the user file
627 */
628 }
629
630 /**
631 * @}
632 */
633
634 /** @defgroup DCMI_Exported_Functions_Group3 Peripheral Control functions
635 * @brief Peripheral Control functions
636 *
637 @verbatim
638 ===============================================================================
639 ##### Peripheral Control functions #####
640 ===============================================================================
641 [..] This section provides functions allowing to:
642 (+) Configure the CROP feature.
643 (+) Enable/Disable the CROP feature.
644
645 @endverbatim
646 * @{
647 */
648
649 /**
650 * @brief Configure the DCMI CROP coordinate.
651 * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains
652 * the configuration information for DCMI.
653 * @param X0 DCMI window X offset
654 * @param Y0 DCMI window Y offset
655 * @param XSize DCMI Pixel per line
656 * @param YSize DCMI Line number
657 * @retval HAL status
658 */
659 HAL_StatusTypeDef HAL_DCMI_ConfigCrop(DCMI_HandleTypeDef *hdcmi, uint32_t X0, uint32_t Y0, uint32_t XSize, uint32_t YSize)
660 {
661 /* Process Locked */
662 __HAL_LOCK(hdcmi);
663
664 /* Lock the DCMI peripheral state */
665 hdcmi->State = HAL_DCMI_STATE_BUSY;
666
667 /* Check the parameters */
668 assert_param(IS_DCMI_WINDOW_COORDINATE(X0));
669 assert_param(IS_DCMI_WINDOW_COORDINATE(YSize));
670 assert_param(IS_DCMI_WINDOW_COORDINATE(XSize));
671 assert_param(IS_DCMI_WINDOW_HEIGHT(Y0));
672
673 /* Configure CROP */
674 hdcmi->Instance->CWSIZER = (XSize | (YSize << DCMI_POSITION_CWSIZE_VLINE));
675 hdcmi->Instance->CWSTRTR = (X0 | (Y0 << DCMI_POSITION_CWSTRT_VST));
676
677 /* Initialize the DCMI state*/
678 hdcmi->State = HAL_DCMI_STATE_READY;
679
680 /* Process Unlocked */
681 __HAL_UNLOCK(hdcmi);
682
683 return HAL_OK;
684 }
685
686 /**
687 * @brief Disable the Crop feature.
688 * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains
689 * the configuration information for DCMI.
690 * @retval HAL status
691 */
692 HAL_StatusTypeDef HAL_DCMI_DisableCrop(DCMI_HandleTypeDef *hdcmi)
693 {
694 /* Process Locked */
695 __HAL_LOCK(hdcmi);
696
697 /* Lock the DCMI peripheral state */
698 hdcmi->State = HAL_DCMI_STATE_BUSY;
699
700 /* Disable DCMI Crop feature */
701 hdcmi->Instance->CR &= ~(uint32_t)DCMI_CR_CROP;
702
703 /* Change the DCMI state*/
704 hdcmi->State = HAL_DCMI_STATE_READY;
705
706 /* Process Unlocked */
707 __HAL_UNLOCK(hdcmi);
708
709 return HAL_OK;
710 }
711
712 /**
713 * @brief Enable the Crop feature.
714 * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains
715 * the configuration information for DCMI.
716 * @retval HAL status
717 */
718 HAL_StatusTypeDef HAL_DCMI_EnableCrop(DCMI_HandleTypeDef *hdcmi)
719 {
720 /* Process Locked */
721 __HAL_LOCK(hdcmi);
722
723 /* Lock the DCMI peripheral state */
724 hdcmi->State = HAL_DCMI_STATE_BUSY;
725
726 /* Enable DCMI Crop feature */
727 hdcmi->Instance->CR |= (uint32_t)DCMI_CR_CROP;
728
729 /* Change the DCMI state*/
730 hdcmi->State = HAL_DCMI_STATE_READY;
731
732 /* Process Unlocked */
733 __HAL_UNLOCK(hdcmi);
734
735 return HAL_OK;
736 }
737
738 /**
739 * @}
740 */
741
742 /** @defgroup DCMI_Exported_Functions_Group4 Peripheral State functions
743 * @brief Peripheral State functions
744 *
745 @verbatim
746 ===============================================================================
747 ##### Peripheral State and Errors functions #####
748 ===============================================================================
749 [..]
750 This subsection provides functions allowing to
751 (+) Check the DCMI state.
752 (+) Get the specific DCMI error flag.
753
754 @endverbatim
755 * @{
756 */
757
758 /**
759 * @brief Return the DCMI state
760 * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains
761 * the configuration information for DCMI.
762 * @retval HAL state
763 */
764 HAL_DCMI_StateTypeDef HAL_DCMI_GetState(DCMI_HandleTypeDef *hdcmi)
765 {
766 return hdcmi->State;
767 }
768
769 /**
770 * @brief Return the DCMI error code
771 * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains
772 * the configuration information for DCMI.
773 * @retval DCMI Error Code
774 */
775 uint32_t HAL_DCMI_GetError(DCMI_HandleTypeDef *hdcmi)
776 {
777 return hdcmi->ErrorCode;
778 }
779
780 /**
781 * @}
782 */
783
784 /* Private functions ---------------------------------------------------------*/
785 /** @defgroup DCMI_Private_Functions DCMI Private Functions
786 * @{
787 */
788
789 /**
790 * @brief DMA conversion complete callback.
791 * @param hdma pointer to a DMA_HandleTypeDef structure that contains
792 * the configuration information for the specified DMA module.
793 * @retval None
794 */
795 static void DCMI_DMAXferCplt(DMA_HandleTypeDef *hdma)
796 {
797 uint32_t tmp = 0U;
798
799 DCMI_HandleTypeDef* hdcmi = ( DCMI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
800
801 if(hdcmi->XferCount != 0U)
802 {
803 /* Update memory 0 address location */
804 tmp = ((hdcmi->DMA_Handle->Instance->CR) & DMA_SxCR_CT);
805 if(((hdcmi->XferCount % 2U) == 0U) && (tmp != 0U))
806 {
807 tmp = hdcmi->DMA_Handle->Instance->M0AR;
808 HAL_DMAEx_ChangeMemory(hdcmi->DMA_Handle, (tmp + (8U*hdcmi->XferSize)), MEMORY0);
809 hdcmi->XferCount--;
810 }
811 /* Update memory 1 address location */
812 else if((hdcmi->DMA_Handle->Instance->CR & DMA_SxCR_CT) == 0U)
813 {
814 tmp = hdcmi->DMA_Handle->Instance->M1AR;
815 HAL_DMAEx_ChangeMemory(hdcmi->DMA_Handle, (tmp + (8U*hdcmi->XferSize)), MEMORY1);
816 hdcmi->XferCount--;
817 }
818 }
819 /* Update memory 0 address location */
820 else if((hdcmi->DMA_Handle->Instance->CR & DMA_SxCR_CT) != 0U)
821 {
822 hdcmi->DMA_Handle->Instance->M0AR = hdcmi->pBuffPtr;
823 }
824 /* Update memory 1 address location */
825 else if((hdcmi->DMA_Handle->Instance->CR & DMA_SxCR_CT) == 0U)
826 {
827 tmp = hdcmi->pBuffPtr;
828 hdcmi->DMA_Handle->Instance->M1AR = (tmp + (4U*hdcmi->XferSize));
829 hdcmi->XferCount = hdcmi->XferTransferNumber;
830 }
831
832 /* Check if the frame is transferred */
833 if(hdcmi->XferCount == hdcmi->XferTransferNumber)
834 {
835 /* Enable the Frame interrupt */
836 __HAL_DCMI_ENABLE_IT(hdcmi, DCMI_IT_FRAME);
837
838 /* When snapshot mode, set dcmi state to ready */
839 if((hdcmi->Instance->CR & DCMI_CR_CM) == DCMI_MODE_SNAPSHOT)
840 {
841 hdcmi->State= HAL_DCMI_STATE_READY;
842 }
843 }
844 }
845
846 /**
847 * @brief DMA error callback
848 * @param hdma pointer to a DMA_HandleTypeDef structure that contains
849 * the configuration information for the specified DMA module.
850 * @retval None
851 */
852 static void DCMI_DMAError(DMA_HandleTypeDef *hdma)
853 {
854 DCMI_HandleTypeDef* hdcmi = ( DCMI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
855
856 if(hdcmi->DMA_Handle->ErrorCode != HAL_DMA_ERROR_FE)
857 {
858 /* Initialize the DCMI state*/
859 hdcmi->State = HAL_DCMI_STATE_READY;
860 }
861
862 /* DCMI error Callback */
863 HAL_DCMI_ErrorCallback(hdcmi);
864 }
865
866 /**
867 * @}
868 */
869
870 /**
871 * @}
872 */
873 #endif /* STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\
874 STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\
875 STM32F479xx */
876 #endif /* HAL_DCMI_MODULE_ENABLED */
877 /**
878 * @}
879 */
880
881 /**
882 * @}
883 */
884
885 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/