Release v1.3.1
diff --git a/Src/stm32f7xx_hal_dcmi.c b/Src/stm32f7xx_hal_dcmi.c
index 1267ebd..2ce3477 100644
--- a/Src/stm32f7xx_hal_dcmi.c
+++ b/Src/stm32f7xx_hal_dcmi.c
@@ -37,7 +37,7 @@
Synchronization Mode, code of the frame delimiter and data width
using HAL_DCMI_Init() function.
- (#) Configure the DMA2_Stream1 channel1 to transfer Data from DCMI DR
+ (#) Configure the selected DMA stream to transfer Data from DCMI DR
register to the destination memory buffer.
(#) Program the required configuration through following parameters:
@@ -46,7 +46,7 @@
(#) Optionally, configure and Enable the CROP feature to select a rectangular
window from the received image using HAL_DCMI_ConfigCrop()
- and HAL_DCMI_EnableCROP() functions
+ and HAL_DCMI_EnableCrop() functions
(#) The capture can be stopped using HAL_DCMI_Stop() function.
@@ -76,13 +76,13 @@
Use functions HAL_DCMI_RegisterCallback() to register a user callback.
Function HAL_DCMI_RegisterCallback() allows to register following callbacks:
- (+) FrameEventCallback : DCMI Frame Event.
- (+) VsyncEventCallback : DCMI Vsync Event.
- (+) LineEventCallback : DCMI Line Event.
- (+) ErrorCallback : DCMI error.
- (+) MspInitCallback : DCMI MspInit.
- (+) MspDeInitCallback : DCMI MspDeInit.
- This function takes as parameters the HAL peripheral handle, the callback ID
+ (+) FrameEventCallback : callback for DCMI Frame Event.
+ (+) VsyncEventCallback : callback for DCMI Vsync Event.
+ (+) LineEventCallback : callback for DCMI Line Event.
+ (+) ErrorCallback : callback for DCMI error detection.
+ (+) MspInitCallback : callback for DCMI MspInit.
+ (+) MspDeInitCallback : callback for DCMI MspDeInit.
+ This function takes as parameters the HAL peripheral handle, the Callback ID
and a pointer to the user callback function.
Use function HAL_DCMI_UnRegisterCallback() to reset a callback to the default
@@ -90,19 +90,19 @@
HAL_DCMI_UnRegisterCallback() takes as parameters the HAL peripheral handle,
and the callback ID.
This function allows to reset following callbacks:
- (+) FrameEventCallback : DCMI Frame Event.
- (+) VsyncEventCallback : DCMI Vsync Event.
- (+) LineEventCallback : DCMI Line Event.
- (+) ErrorCallback : DCMI error.
- (+) MspInitCallback : DCMI MspInit.
- (+) MspDeInitCallback : DCMI MspDeInit.
+ (+) FrameEventCallback : callback for DCMI Frame Event.
+ (+) VsyncEventCallback : callback for DCMI Vsync Event.
+ (+) LineEventCallback : callback for DCMI Line Event.
+ (+) ErrorCallback : callback for DCMI error.
+ (+) MspInitCallback : callback for DCMI MspInit.
+ (+) MspDeInitCallback : callback for DCMI MspDeInit.
By default, after the HAL_DCMI_Init and if the state is HAL_DCMI_STATE_RESET
all callbacks are reset to the corresponding legacy weak (surcharged) functions:
examples FrameEventCallback(), HAL_DCMI_ErrorCallback().
Exception done for MspInit and MspDeInit callbacks that are respectively
reset to the legacy weak (surcharged) functions in the HAL_DCMI_Init
- and HAL_DCMI_DeInit only when these callbacks are null (not registered beforehand).
+ and HAL_DCMI_DeInit only when these callbacks are null (not registered beforehand).
If not, MspInit or MspDeInit are not null, the HAL_DCMI_Init and HAL_DCMI_DeInit
keep and use the user MspInit/MspDeInit callbacks (registered beforehand).
@@ -124,6 +124,8 @@
/* Includes ------------------------------------------------------------------*/
#include "stm32f7xx_hal.h"
+#ifdef HAL_DCMI_MODULE_ENABLED
+#if defined (DCMI)
/** @addtogroup STM32F7xx_HAL_Driver
* @{
@@ -133,19 +135,35 @@
* @{
*/
-#ifdef HAL_DCMI_MODULE_ENABLED
-#if defined (DCMI)
-
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
-#define HAL_TIMEOUT_DCMI_STOP ((uint32_t)1000) /* Set timeout to 1s */
+/** @defgroup DCMI_Private_Constants DCMI Private Constants
+ * @{
+ */
+/** @defgroup DCMI_Stop_TimeOut DCMI Stop Time Out
+ * @{
+ */
+#define HAL_TIMEOUT_DCMI_STOP ((uint32_t)1000) /* Set timeout to 1s */
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
+/** @addtogroup DCMI_Private_Functions DCMI Private Functions
+ * @{
+ */
static void DCMI_DMAXferCplt(DMA_HandleTypeDef *hdma);
static void DCMI_DMAError(DMA_HandleTypeDef *hdma);
+/**
+ * @}
+ */
/* Exported functions --------------------------------------------------------*/
/** @defgroup DCMI_Exported_Functions DCMI Exported Functions
@@ -153,8 +171,8 @@
*/
/** @defgroup DCMI_Exported_Functions_Group1 Initialization and Configuration functions
- * @brief Initialization and Configuration functions
- *
+ * @brief Initialization and Configuration functions
+ *
@verbatim
===============================================================================
##### Initialization and Configuration functions #####
@@ -203,6 +221,7 @@
{
/* Init the DCMI Callback settings */
#if (USE_HAL_DCMI_REGISTER_CALLBACKS == 1)
+ /* Reset callback pointers to the weak predefined callbacks */
hdcmi->FrameEventCallback = HAL_DCMI_FrameEventCallback; /* Legacy weak FrameEventCallback */
hdcmi->VsyncEventCallback = HAL_DCMI_VsyncEventCallback; /* Legacy weak VsyncEventCallback */
hdcmi->LineEventCallback = HAL_DCMI_LineEventCallback; /* Legacy weak LineEventCallback */
@@ -346,8 +365,8 @@
* @}
*/
/** @defgroup DCMI_Exported_Functions_Group2 IO operation functions
- * @brief IO operation functions
- *
+ * @brief IO operation functions
+ *
@verbatim
===============================================================================
##### IO operation functions #####
@@ -373,8 +392,9 @@
*/
HAL_StatusTypeDef HAL_DCMI_Start_DMA(DCMI_HandleTypeDef *hdcmi, uint32_t DCMI_Mode, uint32_t pData, uint32_t Length)
{
+ uint32_t tmp_length = Length;
/* Initialize the second memory address */
- uint32_t SecondMemAddress = 0;
+ uint32_t SecondMemAddress;
/* Check function parameters */
assert_param(IS_DCMI_CAPTURE_MODE(DCMI_Mode));
@@ -407,11 +427,18 @@
hdcmi->XferSize = 0;
hdcmi->pBuffPtr = 0;
- if (Length <= 0xFFFFU)
+ if (tmp_length <= 0xFFFFU)
{
/* Enable the DMA Stream */
- if (HAL_DMA_Start_IT(hdcmi->DMA_Handle, (uint32_t)&hdcmi->Instance->DR, (uint32_t)pData, Length) != HAL_OK)
+ if (HAL_DMA_Start_IT(hdcmi->DMA_Handle, (uint32_t)&hdcmi->Instance->DR, (uint32_t)pData, tmp_length) != HAL_OK)
{
+ /* Set Error Code */
+ hdcmi->ErrorCode = HAL_DCMI_ERROR_DMA;
+ /* Change DCMI state */
+ hdcmi->State = HAL_DCMI_STATE_READY;
+ /* Release Lock */
+ __HAL_UNLOCK(hdcmi);
+ /* Return function status */
return HAL_ERROR;
}
}
@@ -422,7 +449,7 @@
/* Initialize transfer parameters */
hdcmi->XferCount = 1;
- hdcmi->XferSize = Length;
+ hdcmi->XferSize = tmp_length;
hdcmi->pBuffPtr = pData;
/* Get the number of buffer */
@@ -437,11 +464,18 @@
hdcmi->XferTransferNumber = hdcmi->XferCount;
/* Update second memory address */
- SecondMemAddress = (uint32_t)(pData + (4 * hdcmi->XferSize));
+ SecondMemAddress = (uint32_t)(pData + (4U * hdcmi->XferSize));
/* Start DMA multi buffer transfer */
if (HAL_DMAEx_MultiBufferStart_IT(hdcmi->DMA_Handle, (uint32_t)&hdcmi->Instance->DR, (uint32_t)pData, SecondMemAddress, hdcmi->XferSize) != HAL_OK)
{
+ /* Set Error Code */
+ hdcmi->ErrorCode = HAL_DCMI_ERROR_DMA;
+ /* Change DCMI state */
+ hdcmi->State = HAL_DCMI_STATE_READY;
+ /* Release Lock */
+ __HAL_UNLOCK(hdcmi);
+ /* Return function status */
return HAL_ERROR;
}
}
@@ -464,7 +498,7 @@
*/
HAL_StatusTypeDef HAL_DCMI_Stop(DCMI_HandleTypeDef *hdcmi)
{
- register uint32_t count = HAL_TIMEOUT_DCMI_STOP * (SystemCoreClock / 8U / 1000U);
+ uint32_t count = HAL_TIMEOUT_DCMI_STOP * (SystemCoreClock / 8U / 1000U);
HAL_StatusTypeDef status = HAL_OK;
/* Process locked */
@@ -479,7 +513,8 @@
/* Check if the DCMI capture effectively disabled */
do
{
- if (count-- == 0U)
+ count-- ;
+ if (count == 0U)
{
/* Update error code */
hdcmi->ErrorCode |= HAL_DCMI_ERROR_TIMEOUT;
@@ -487,8 +522,7 @@
status = HAL_TIMEOUT;
break;
}
- }
- while ((hdcmi->Instance->CR & DCMI_CR_CAPTURE) != 0U);
+ } while ((hdcmi->Instance->CR & DCMI_CR_CAPTURE) != 0U);
/* Disable the DCMI */
__HAL_DCMI_DISABLE(hdcmi);
@@ -517,7 +551,7 @@
*/
HAL_StatusTypeDef HAL_DCMI_Suspend(DCMI_HandleTypeDef *hdcmi)
{
- register uint32_t count = HAL_TIMEOUT_DCMI_STOP * (SystemCoreClock / 8U / 1000U);
+ uint32_t count = HAL_TIMEOUT_DCMI_STOP * (SystemCoreClock / 8U / 1000U);
HAL_StatusTypeDef status = HAL_OK;
/* Process locked */
@@ -534,7 +568,8 @@
/* Check if the DCMI capture effectively disabled */
do
{
- if (count-- == 0U)
+ count-- ;
+ if (count == 0U)
{
/* Update error code */
hdcmi->ErrorCode |= HAL_DCMI_ERROR_TIMEOUT;
@@ -545,8 +580,7 @@
status = HAL_TIMEOUT;
break;
}
- }
- while ((hdcmi->Instance->CR & DCMI_CR_CAPTURE) != 0U);
+ } while ((hdcmi->Instance->CR & DCMI_CR_CAPTURE) != 0U);
}
/* Process Unlocked */
__HAL_UNLOCK(hdcmi);
@@ -571,7 +605,7 @@
/* Change DCMI state */
hdcmi->State = HAL_DCMI_STATE_BUSY;
- /* Disable Capture */
+ /* Enable Capture */
hdcmi->Instance->CR |= DCMI_CR_CAPTURE;
}
/* Process Unlocked */
@@ -607,7 +641,10 @@
hdcmi->DMA_Handle->XferAbortCallback = DCMI_DMAError;
/* Abort the DMA Transfer */
- (void)HAL_DMA_Abort_IT(hdcmi->DMA_Handle);
+ if (HAL_DMA_Abort_IT(hdcmi->DMA_Handle) != HAL_OK)
+ {
+ DCMI_DMAError(hdcmi->DMA_Handle);
+ }
}
/* Overflow interrupt management ********************************************/
if ((isr_value & DCMI_FLAG_OVRRI) == DCMI_FLAG_OVRRI)
@@ -708,6 +745,8 @@
*/
__weak void HAL_DCMI_LineEventCallback(DCMI_HandleTypeDef *hdcmi)
{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(hdcmi);
/* NOTE : This function Should not be modified, when the callback is needed,
the HAL_DCMI_LineEventCallback could be implemented in the user file
*/
@@ -750,8 +789,8 @@
*/
/** @defgroup DCMI_Exported_Functions_Group3 Peripheral Control functions
- * @brief Peripheral Control functions
- *
+ * @brief Peripheral Control functions
+ *
@verbatim
===============================================================================
##### Peripheral Control functions #####
@@ -775,7 +814,8 @@
* @param Y0 DCMI window Y offset
* @retval HAL status
*/
-HAL_StatusTypeDef HAL_DCMI_ConfigCrop(DCMI_HandleTypeDef *hdcmi, uint32_t X0, uint32_t Y0, uint32_t XSize, uint32_t YSize)
+HAL_StatusTypeDef HAL_DCMI_ConfigCrop(DCMI_HandleTypeDef *hdcmi, uint32_t X0, uint32_t Y0, uint32_t XSize,
+ uint32_t YSize)
{
/* Process Locked */
__HAL_LOCK(hdcmi);
@@ -890,8 +930,8 @@
*/
/** @defgroup DCMI_Exported_Functions_Group4 Peripheral State functions
- * @brief Peripheral State functions
- *
+ * @brief Peripheral State functions
+ *
@verbatim
===============================================================================
##### Peripheral State and Errors functions #####
@@ -911,32 +951,40 @@
* the configuration information for DCMI.
* @retval HAL state
*/
-HAL_DCMI_StateTypeDef HAL_DCMI_GetState(DCMI_HandleTypeDef *hdcmi)
+HAL_DCMI_StateTypeDef HAL_DCMI_GetState(const DCMI_HandleTypeDef *hdcmi)
{
return hdcmi->State;
}
/**
-* @brief Return the DCMI error code
-* @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains
+ * @brief Return the DCMI error code
+ * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains
* the configuration information for DCMI.
-* @retval DCMI Error Code
-*/
-uint32_t HAL_DCMI_GetError(DCMI_HandleTypeDef *hdcmi)
+ * @retval DCMI Error Code
+ */
+uint32_t HAL_DCMI_GetError(const DCMI_HandleTypeDef *hdcmi)
{
return hdcmi->ErrorCode;
}
#if (USE_HAL_DCMI_REGISTER_CALLBACKS == 1)
/**
- * @brief DCMI Callback registering
- * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains
- * the configuration information for DCMI.
- * @param CallbackID dcmi Callback ID
- * @param pCallback pointer to DCMI_CallbackTypeDef structure
- * @retval status
+ * @brief Register a User DCMI Callback
+ * To be used instead of the weak predefined callback
+ * @param hdcmi DCMI handle
+ * @param CallbackID ID of the callback to be registered
+ * This parameter can be one of the following values:
+ * @arg @ref HAL_DCMI_LINE_EVENT_CB_ID Line Event callback ID
+ * @arg @ref HAL_DCMI_FRAME_EVENT_CB_ID Frame Event callback ID
+ * @arg @ref HAL_DCMI_VSYNC_EVENT_CB_ID Vsync Event callback ID
+ * @arg @ref HAL_DCMI_ERROR_CB_ID Error callback ID
+ * @arg @ref HAL_DCMI_MSPINIT_CB_ID MspInit callback ID
+ * @arg @ref HAL_DCMI_MSPDEINIT_CB_ID MspDeInit callback ID
+ * @param pCallback pointer to the Callback function
+ * @retval HAL status
*/
-HAL_StatusTypeDef HAL_DCMI_RegisterCallback(DCMI_HandleTypeDef *hdcmi, HAL_DCMI_CallbackIDTypeDef CallbackID, pDCMI_CallbackTypeDef pCallback)
+HAL_StatusTypeDef HAL_DCMI_RegisterCallback(DCMI_HandleTypeDef *hdcmi, HAL_DCMI_CallbackIDTypeDef CallbackID,
+ pDCMI_CallbackTypeDef pCallback)
{
HAL_StatusTypeDef status = HAL_OK;
@@ -1016,10 +1064,18 @@
}
/**
- * @brief DCMI Callback Unregistering
- * @param hdcmi dcmi handle
- * @param CallbackID dcmi Callback ID
- * @retval status
+ * @brief Unregister a DCMI Callback
+ * DCMI callback is redirected to the weak predefined callback
+ * @param hdcmi DCMI handle
+ * @param CallbackID ID of the callback to be registered
+ * This parameter can be one of the following values:
+ * @arg @ref HAL_DCMI_LINE_EVENT_CB_ID Line Event callback ID
+ * @arg @ref HAL_DCMI_FRAME_EVENT_CB_ID Frame Event callback ID
+ * @arg @ref HAL_DCMI_VSYNC_EVENT_CB_ID Vsync Event callback ID
+ * @arg @ref HAL_DCMI_ERROR_CB_ID Error callback ID
+ * @arg @ref HAL_DCMI_MSPINIT_CB_ID MspInit callback ID
+ * @arg @ref HAL_DCMI_MSPDEINIT_CB_ID MspDeInit callback ID
+ * @retval HAL status
*/
HAL_StatusTypeDef HAL_DCMI_UnRegisterCallback(DCMI_HandleTypeDef *hdcmi, HAL_DCMI_CallbackIDTypeDef CallbackID)
{
@@ -1034,15 +1090,15 @@
break;
case HAL_DCMI_VSYNC_EVENT_CB_ID :
- hdcmi->VsyncEventCallback = HAL_DCMI_VsyncEventCallback; /* Legacy weak VsyncEventCallback */
+ hdcmi->VsyncEventCallback = HAL_DCMI_VsyncEventCallback; /* Legacy weak VsyncEventCallback */
break;
case HAL_DCMI_LINE_EVENT_CB_ID :
- hdcmi->LineEventCallback = HAL_DCMI_LineEventCallback; /* Legacy weak LineEventCallback */
+ hdcmi->LineEventCallback = HAL_DCMI_LineEventCallback; /* Legacy weak LineEventCallback */
break;
case HAL_DCMI_ERROR_CB_ID :
- hdcmi->ErrorCallback = HAL_DCMI_ErrorCallback; /* Legacy weak ErrorCallback */
+ hdcmi->ErrorCallback = HAL_DCMI_ErrorCallback; /* Legacy weak ErrorCallback */
break;
case HAL_DCMI_MSPINIT_CB_ID :
@@ -1096,52 +1152,65 @@
/**
* @}
*/
+
+/**
+ * @}
+ */
+
/* Private functions ---------------------------------------------------------*/
/** @defgroup DCMI_Private_Functions DCMI Private Functions
* @{
*/
/**
-* @brief DMA conversion complete callback.
-* @param hdma pointer to a DMA_HandleTypeDef structure that contains
-* the configuration information for the specified DMA module.
-* @retval None
-*/
+ * @brief DMA conversion complete callback.
+ * @param hdma pointer to a DMA_HandleTypeDef structure that contains
+ * the configuration information for the specified DMA module.
+ * @retval None
+ */
static void DCMI_DMAXferCplt(DMA_HandleTypeDef *hdma)
{
- uint32_t tmp = 0;
+ uint32_t tmp ;
DCMI_HandleTypeDef *hdcmi = (DCMI_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
- if (hdcmi->XferCount != 0)
+ if (hdcmi->XferCount != 0U)
{
/* Update memory 0 address location */
- tmp = ((hdcmi->DMA_Handle->Instance->CR) & DMA_SxCR_CT);
- if (((hdcmi->XferCount % 2) == 0) && (tmp != 0))
+ tmp = ((((DMA_Stream_TypeDef *)(hdcmi->DMA_Handle->Instance))->CR) & DMA_SxCR_CT);
+ if (((hdcmi->XferCount % 2U) == 0U) && (tmp != 0U))
{
- tmp = hdcmi->DMA_Handle->Instance->M0AR;
- HAL_DMAEx_ChangeMemory(hdcmi->DMA_Handle, (tmp + (8 * hdcmi->XferSize)), MEMORY0);
+ tmp = ((DMA_Stream_TypeDef *)(hdcmi->DMA_Handle->Instance))->M0AR;
+ (void)HAL_DMAEx_ChangeMemory(hdcmi->DMA_Handle, (tmp + (8U * hdcmi->XferSize)), MEMORY0);
hdcmi->XferCount--;
}
/* Update memory 1 address location */
- else if ((hdcmi->DMA_Handle->Instance->CR & DMA_SxCR_CT) == 0)
+ else if ((((DMA_Stream_TypeDef *)(hdcmi->DMA_Handle->Instance))->CR & DMA_SxCR_CT) == 0U)
{
- tmp = hdcmi->DMA_Handle->Instance->M1AR;
- HAL_DMAEx_ChangeMemory(hdcmi->DMA_Handle, (tmp + (8 * hdcmi->XferSize)), MEMORY1);
+ tmp = ((DMA_Stream_TypeDef *)(hdcmi->DMA_Handle->Instance))->M1AR;
+ (void)HAL_DMAEx_ChangeMemory(hdcmi->DMA_Handle, (tmp + (8U * hdcmi->XferSize)), MEMORY1);
hdcmi->XferCount--;
}
+ else
+ {
+ /* Nothing to do */
+ }
}
/* Update memory 0 address location */
- else if ((hdcmi->DMA_Handle->Instance->CR & DMA_SxCR_CT) != 0)
+ else if ((((DMA_Stream_TypeDef *)(hdcmi->DMA_Handle->Instance))->CR & DMA_SxCR_CT) != 0U)
{
- hdcmi->DMA_Handle->Instance->M0AR = hdcmi->pBuffPtr;
+ ((DMA_Stream_TypeDef *)(hdcmi->DMA_Handle->Instance))->M0AR = hdcmi->pBuffPtr;
}
/* Update memory 1 address location */
- else if ((hdcmi->DMA_Handle->Instance->CR & DMA_SxCR_CT) == 0)
+ else if ((((DMA_Stream_TypeDef *)(hdcmi->DMA_Handle->Instance))->CR & DMA_SxCR_CT) == 0U)
{
tmp = hdcmi->pBuffPtr;
- hdcmi->DMA_Handle->Instance->M1AR = (tmp + (4 * hdcmi->XferSize));
+ ((DMA_Stream_TypeDef *)(hdcmi->DMA_Handle->Instance))->M1AR = (tmp + (4U * hdcmi->XferSize));
hdcmi->XferCount = hdcmi->XferTransferNumber;
}
+ else
+ {
+ /* Nothing to do */
+ }
/* Check if the frame is transferred */
if (hdcmi->XferCount == hdcmi->XferTransferNumber)
@@ -1189,10 +1258,6 @@
/**
* @}
*/
-
-/**
- * @}
- */
#endif /* DCMI */
#endif /* HAL_DCMI_MODULE_ENABLED */
/**
@@ -1202,4 +1267,3 @@
/**
* @}
*/
-