135#ifdef HAL_DCMI_MODULE_ENABLED
137#if defined(STM32F407xx) || defined(STM32F417xx) || defined(STM32F427xx) || defined(STM32F437xx) ||\
138 defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) ||\
142#define HAL_TIMEOUT_DCMI_STOP 14U
187 assert_param(IS_DCMI_PCKPOLARITY(hdcmi->Init.PCKPolarity));
188 assert_param(IS_DCMI_VSPOLARITY(hdcmi->Init.VSPolarity));
189 assert_param(IS_DCMI_HSPOLARITY(hdcmi->Init.HSPolarity));
191 assert_param(IS_DCMI_CAPTURE_RATE(hdcmi->Init.CaptureRate));
192 assert_param(IS_DCMI_EXTENDED_DATA(hdcmi->Init.ExtendedDataMode));
195 if(hdcmi->State == HAL_DCMI_STATE_RESET)
201#if (USE_HAL_DCMI_REGISTER_CALLBACKS == 1)
202 hdcmi->FrameEventCallback = HAL_DCMI_FrameEventCallback;
203 hdcmi->VsyncEventCallback = HAL_DCMI_VsyncEventCallback;
204 hdcmi->LineEventCallback = HAL_DCMI_LineEventCallback;
205 hdcmi->ErrorCallback = HAL_DCMI_ErrorCallback;
207 if(hdcmi->MspInitCallback == NULL)
210 hdcmi->MspInitCallback = HAL_DCMI_MspInit;
213 hdcmi->MspInitCallback(hdcmi);
216 HAL_DCMI_MspInit(hdcmi);
221 hdcmi->State = HAL_DCMI_STATE_BUSY;
225 hdcmi->Instance->CR &= ~(DCMI_CR_PCKPOL | DCMI_CR_HSPOL | DCMI_CR_VSPOL | DCMI_CR_EDM_0 |
226 DCMI_CR_EDM_1 | DCMI_CR_FCRC_0 | DCMI_CR_FCRC_1 | DCMI_CR_JPEG |
228 hdcmi->Instance->CR |= (uint32_t)(hdcmi->Init.SynchroMode | hdcmi->Init.CaptureRate | \
229 hdcmi->Init.VSPolarity | hdcmi->Init.HSPolarity | \
230 hdcmi->Init.PCKPolarity | hdcmi->Init.ExtendedDataMode | \
231 hdcmi->Init.JPEGMode);
233 if(hdcmi->Init.SynchroMode == DCMI_SYNCHRO_EMBEDDED)
235 hdcmi->Instance->ESCR = (((uint32_t)hdcmi->Init.SyncroCode.FrameStartCode) |
236 ((uint32_t)hdcmi->Init.SyncroCode.LineStartCode << DCMI_POSITION_ESCR_LSC)|
237 ((uint32_t)hdcmi->Init.SyncroCode.LineEndCode << DCMI_POSITION_ESCR_LEC) |
238 ((uint32_t)hdcmi->Init.SyncroCode.FrameEndCode << DCMI_POSITION_ESCR_FEC));
242 __HAL_DCMI_ENABLE_IT(hdcmi, DCMI_IT_LINE | DCMI_IT_VSYNC | DCMI_IT_ERR | DCMI_IT_OVR);
245 hdcmi->ErrorCode = HAL_DCMI_ERROR_NONE;
248 hdcmi->State = HAL_DCMI_STATE_READY;
263#if (USE_HAL_DCMI_REGISTER_CALLBACKS == 1)
264 if(hdcmi->MspDeInitCallback == NULL)
266 hdcmi->MspDeInitCallback = HAL_DCMI_MspDeInit;
269 hdcmi->MspDeInitCallback(hdcmi);
272 HAL_DCMI_MspDeInit(hdcmi);
276 hdcmi->ErrorCode = HAL_DCMI_ERROR_NONE;
279 hdcmi->State = HAL_DCMI_STATE_RESET;
293__weak
void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi)
308__weak
void HAL_DCMI_MspDeInit(DCMI_HandleTypeDef* hdcmi)
346HAL_StatusTypeDef HAL_DCMI_Start_DMA(DCMI_HandleTypeDef* hdcmi, uint32_t DCMI_Mode, uint32_t pData, uint32_t Length)
351 uint32_t SecondMemAddress = 0U;
360 hdcmi->State = HAL_DCMI_STATE_BUSY;
363 __HAL_DCMI_ENABLE(hdcmi);
366 hdcmi->Instance->CR &= ~(DCMI_CR_CM);
367 hdcmi->Instance->CR |= (uint32_t)(DCMI_Mode);
370 hdcmi->DMA_Handle->XferCpltCallback = DCMI_DMAXferCplt;
373 hdcmi->DMA_Handle->XferErrorCallback = DCMI_DMAError;
376 hdcmi->DMA_Handle->XferAbortCallback = NULL;
379 hdcmi->XferCount = 0U;
380 hdcmi->XferTransferNumber = 0U;
382 if(Length <= 0xFFFFU)
385 status =
HAL_DMA_Start_IT(hdcmi->DMA_Handle, (uint32_t)&hdcmi->Instance->DR, (uint32_t)pData, Length);
390 hdcmi->DMA_Handle->XferM1CpltCallback = DCMI_DMAXferCplt;
393 hdcmi->XferCount = 1U;
394 hdcmi->XferSize = Length;
395 hdcmi->pBuffPtr = pData;
398 while(hdcmi->XferSize > 0xFFFFU)
400 hdcmi->XferSize = (hdcmi->XferSize/2U);
401 hdcmi->XferCount = hdcmi->XferCount*2U;
405 hdcmi->XferCount = (hdcmi->XferCount - 2U);
406 hdcmi->XferTransferNumber = hdcmi->XferCount;
409 SecondMemAddress = (uint32_t)(pData + (4U*hdcmi->XferSize));
412 status =
HAL_DMAEx_MultiBufferStart_IT(hdcmi->DMA_Handle, (uint32_t)&hdcmi->Instance->DR, (uint32_t)pData, SecondMemAddress, hdcmi->XferSize);
416 hdcmi->Instance->CR |= DCMI_CR_CAPTURE;
433 __IO uint32_t count = SystemCoreClock / HAL_TIMEOUT_DCMI_STOP;
440 hdcmi->State = HAL_DCMI_STATE_BUSY;
443 hdcmi->Instance->CR &= ~(DCMI_CR_CAPTURE);
451 hdcmi->ErrorCode |= HAL_DCMI_ERROR_TIMEOUT;
457 while((hdcmi->Instance->CR & DCMI_CR_CAPTURE) != 0U);
460 __HAL_DCMI_DISABLE(hdcmi);
466 hdcmi->ErrorCode |= HAL_DCMI_ERROR_NONE;
469 hdcmi->State = HAL_DCMI_STATE_READY;
486 __IO uint32_t count = SystemCoreClock / HAL_TIMEOUT_DCMI_STOP;
492 if(hdcmi->State == HAL_DCMI_STATE_BUSY)
495 hdcmi->State = HAL_DCMI_STATE_SUSPENDED;
498 hdcmi->Instance->CR &= ~(DCMI_CR_CAPTURE);
506 hdcmi->ErrorCode |= HAL_DCMI_ERROR_TIMEOUT;
509 hdcmi->State = HAL_DCMI_STATE_READY;
515 while((hdcmi->Instance->CR & DCMI_CR_CAPTURE) != 0);
535 if(hdcmi->State == HAL_DCMI_STATE_SUSPENDED)
538 hdcmi->State = HAL_DCMI_STATE_BUSY;
541 hdcmi->Instance->CR |= DCMI_CR_CAPTURE;
556void HAL_DCMI_IRQHandler(DCMI_HandleTypeDef *hdcmi)
558 uint32_t isr_value = READ_REG(hdcmi->Instance->MISR);
561 if((isr_value & DCMI_FLAG_ERRRI) == DCMI_FLAG_ERRRI)
564 __HAL_DCMI_CLEAR_FLAG(hdcmi, DCMI_FLAG_ERRRI);
567 hdcmi->ErrorCode |= HAL_DCMI_ERROR_SYNC;
570 hdcmi->State = HAL_DCMI_STATE_ERROR;
573 hdcmi->DMA_Handle->XferAbortCallback = DCMI_DMAError;
578 DCMI_DMAError(hdcmi->DMA_Handle);
582 if((isr_value & DCMI_FLAG_OVRRI) == DCMI_FLAG_OVRRI)
585 __HAL_DCMI_CLEAR_FLAG(hdcmi, DCMI_FLAG_OVRRI);
588 hdcmi->ErrorCode |= HAL_DCMI_ERROR_OVR;
591 hdcmi->State = HAL_DCMI_STATE_ERROR;
594 hdcmi->DMA_Handle->XferAbortCallback = DCMI_DMAError;
599 DCMI_DMAError(hdcmi->DMA_Handle);
603 if((isr_value & DCMI_FLAG_LINERI) == DCMI_FLAG_LINERI)
606 __HAL_DCMI_CLEAR_FLAG(hdcmi, DCMI_FLAG_LINERI);
609#if (USE_HAL_DCMI_REGISTER_CALLBACKS == 1)
611 hdcmi->LineEventCallback(hdcmi);
613 HAL_DCMI_LineEventCallback(hdcmi);
617 if((isr_value & DCMI_FLAG_VSYNCRI) == DCMI_FLAG_VSYNCRI)
620 __HAL_DCMI_CLEAR_FLAG(hdcmi, DCMI_FLAG_VSYNCRI);
623#if (USE_HAL_DCMI_REGISTER_CALLBACKS == 1)
625 hdcmi->VsyncEventCallback(hdcmi);
627 HAL_DCMI_VsyncEventCallback(hdcmi);
631 if((isr_value & DCMI_FLAG_FRAMERI) == DCMI_FLAG_FRAMERI)
634 if((hdcmi->Instance->CR & DCMI_CR_CM) == DCMI_MODE_SNAPSHOT)
637 __HAL_DCMI_DISABLE_IT(hdcmi, DCMI_IT_LINE | DCMI_IT_VSYNC | DCMI_IT_ERR | DCMI_IT_OVR);
641 __HAL_DCMI_DISABLE_IT(hdcmi, DCMI_IT_FRAME);
644#if (USE_HAL_DCMI_REGISTER_CALLBACKS == 1)
646 hdcmi->FrameEventCallback(hdcmi);
648 HAL_DCMI_FrameEventCallback(hdcmi);
659__weak
void HAL_DCMI_ErrorCallback(DCMI_HandleTypeDef *hdcmi)
674__weak
void HAL_DCMI_LineEventCallback(DCMI_HandleTypeDef *hdcmi)
689__weak
void HAL_DCMI_VsyncEventCallback(DCMI_HandleTypeDef *hdcmi)
704__weak
void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
742HAL_StatusTypeDef HAL_DCMI_ConfigCrop(DCMI_HandleTypeDef *hdcmi, uint32_t X0, uint32_t Y0, uint32_t XSize, uint32_t YSize)
748 hdcmi->State = HAL_DCMI_STATE_BUSY;
757 hdcmi->Instance->CWSIZER = (XSize | (YSize << DCMI_POSITION_CWSIZE_VLINE));
758 hdcmi->Instance->CWSTRTR = (X0 | (Y0 << DCMI_POSITION_CWSTRT_VST));
761 hdcmi->State = HAL_DCMI_STATE_READY;
781 hdcmi->State = HAL_DCMI_STATE_BUSY;
784 hdcmi->Instance->CR &= ~(uint32_t)DCMI_CR_CROP;
787 hdcmi->State = HAL_DCMI_STATE_READY;
807 hdcmi->State = HAL_DCMI_STATE_BUSY;
810 hdcmi->Instance->CR |= (uint32_t)DCMI_CR_CROP;
813 hdcmi->State = HAL_DCMI_STATE_READY;
829HAL_StatusTypeDef HAL_DCMI_ConfigSyncUnmask(DCMI_HandleTypeDef *hdcmi, DCMI_SyncUnmaskTypeDef *SyncUnmask)
835 hdcmi->State = HAL_DCMI_STATE_BUSY;
838 hdcmi->Instance->ESUR = (((uint32_t)SyncUnmask->FrameStartUnmask) |\
839 ((uint32_t)SyncUnmask->LineStartUnmask << DCMI_ESUR_LSU_Pos)|\
840 ((uint32_t)SyncUnmask->LineEndUnmask << DCMI_ESUR_LEU_Pos)|\
841 ((uint32_t)SyncUnmask->FrameEndUnmask << DCMI_ESUR_FEU_Pos));
844 hdcmi->State = HAL_DCMI_STATE_READY;
878HAL_DCMI_StateTypeDef HAL_DCMI_GetState(DCMI_HandleTypeDef *hdcmi)
889uint32_t HAL_DCMI_GetError(DCMI_HandleTypeDef *hdcmi)
891 return hdcmi->ErrorCode;
894#if (USE_HAL_DCMI_REGISTER_CALLBACKS == 1)
903HAL_StatusTypeDef HAL_DCMI_RegisterCallback(DCMI_HandleTypeDef *hdcmi, HAL_DCMI_CallbackIDTypeDef CallbackID, pDCMI_CallbackTypeDef pCallback)
907 if(pCallback == NULL)
910 hdcmi->ErrorCode |= HAL_DCMI_ERROR_INVALID_CALLBACK;
916 if(hdcmi->State == HAL_DCMI_STATE_READY)
920 case HAL_DCMI_FRAME_EVENT_CB_ID :
921 hdcmi->FrameEventCallback = pCallback;
924 case HAL_DCMI_VSYNC_EVENT_CB_ID :
925 hdcmi->VsyncEventCallback = pCallback;
928 case HAL_DCMI_LINE_EVENT_CB_ID :
929 hdcmi->LineEventCallback = pCallback;
932 case HAL_DCMI_ERROR_CB_ID :
933 hdcmi->ErrorCallback = pCallback;
936 case HAL_DCMI_MSPINIT_CB_ID :
937 hdcmi->MspInitCallback = pCallback;
940 case HAL_DCMI_MSPDEINIT_CB_ID :
941 hdcmi->MspDeInitCallback = pCallback;
950 else if(hdcmi->State == HAL_DCMI_STATE_RESET)
954 case HAL_DCMI_MSPINIT_CB_ID :
955 hdcmi->MspInitCallback = pCallback;
958 case HAL_DCMI_MSPDEINIT_CB_ID :
959 hdcmi->MspDeInitCallback = pCallback;
964 hdcmi->ErrorCode |= HAL_DCMI_ERROR_INVALID_CALLBACK;
973 hdcmi->ErrorCode |= HAL_DCMI_ERROR_INVALID_CALLBACK;
988HAL_StatusTypeDef HAL_DCMI_UnRegisterCallback(DCMI_HandleTypeDef *hdcmi, HAL_DCMI_CallbackIDTypeDef CallbackID)
992 if(hdcmi->State == HAL_DCMI_STATE_READY)
996 case HAL_DCMI_FRAME_EVENT_CB_ID :
997 hdcmi->FrameEventCallback = HAL_DCMI_FrameEventCallback;
1000 case HAL_DCMI_VSYNC_EVENT_CB_ID :
1001 hdcmi->VsyncEventCallback = HAL_DCMI_VsyncEventCallback;
1004 case HAL_DCMI_LINE_EVENT_CB_ID :
1005 hdcmi->LineEventCallback = HAL_DCMI_LineEventCallback;
1008 case HAL_DCMI_ERROR_CB_ID :
1009 hdcmi->ErrorCallback = HAL_DCMI_ErrorCallback;
1012 case HAL_DCMI_MSPINIT_CB_ID :
1013 hdcmi->MspInitCallback = HAL_DCMI_MspInit;
1016 case HAL_DCMI_MSPDEINIT_CB_ID :
1017 hdcmi->MspDeInitCallback = HAL_DCMI_MspDeInit;
1022 hdcmi->ErrorCode |= HAL_DCMI_ERROR_INVALID_CALLBACK;
1028 else if(hdcmi->State == HAL_DCMI_STATE_RESET)
1032 case HAL_DCMI_MSPINIT_CB_ID :
1033 hdcmi->MspInitCallback = HAL_DCMI_MspInit;
1036 case HAL_DCMI_MSPDEINIT_CB_ID :
1037 hdcmi->MspDeInitCallback = HAL_DCMI_MspDeInit;
1042 hdcmi->ErrorCode |= HAL_DCMI_ERROR_INVALID_CALLBACK;
1051 hdcmi->ErrorCode |= HAL_DCMI_ERROR_INVALID_CALLBACK;
1078 DCMI_HandleTypeDef* hdcmi = ( DCMI_HandleTypeDef* )((
DMA_HandleTypeDef* )hdma)->Parent;
1080 if(hdcmi->XferCount != 0U)
1083 tmp = ((hdcmi->DMA_Handle->Instance->CR) & DMA_SxCR_CT);
1084 if(((hdcmi->XferCount % 2U) == 0U) && (tmp != 0U))
1086 tmp = hdcmi->DMA_Handle->Instance->M0AR;
1091 else if((hdcmi->DMA_Handle->Instance->CR & DMA_SxCR_CT) == 0U)
1093 tmp = hdcmi->DMA_Handle->Instance->M1AR;
1099 else if((hdcmi->DMA_Handle->Instance->CR & DMA_SxCR_CT) != 0U)
1101 hdcmi->DMA_Handle->Instance->M0AR = hdcmi->pBuffPtr;
1104 else if((hdcmi->DMA_Handle->Instance->CR & DMA_SxCR_CT) == 0U)
1106 tmp = hdcmi->pBuffPtr;
1107 hdcmi->DMA_Handle->Instance->M1AR = (tmp + (4U*hdcmi->XferSize));
1108 hdcmi->XferCount = hdcmi->XferTransferNumber;
1112 if(hdcmi->XferCount == hdcmi->XferTransferNumber)
1115 __HAL_DCMI_ENABLE_IT(hdcmi, DCMI_IT_FRAME);
1118 if((hdcmi->Instance->CR & DCMI_CR_CM) == DCMI_MODE_SNAPSHOT)
1120 hdcmi->State= HAL_DCMI_STATE_READY;
1133 DCMI_HandleTypeDef* hdcmi = ( DCMI_HandleTypeDef* )((
DMA_HandleTypeDef* )hdma)->Parent;
1138 hdcmi->State = HAL_DCMI_STATE_READY;
1142#if (USE_HAL_DCMI_REGISTER_CALLBACKS == 1)
1144 hdcmi->ErrorCallback(hdcmi);
1146 HAL_DCMI_ErrorCallback(hdcmi);
HAL_StatusTypeDef HAL_DMAEx_ChangeMemory(DMA_HandleTypeDef *hdma, uint32_t Address, HAL_DMA_MemoryTypeDef memory)
HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength)
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
struct __DMA_HandleTypeDef DMA_HandleTypeDef
DMA handle Structure definition.
#define assert_param(expr)
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef
HAL Status structures definition.
#define __HAL_UNLOCK(__HANDLE__)
#define __HAL_LOCK(__HANDLE__)