1109 lines
33 KiB
C
Raw Normal View History

2019-04-29 14:39:56 +01:00
/**
******************************************************************************
* @file stm32f7xx_hal_sram.c
* @author MCD Application Team
* @brief SRAM HAL module driver.
2021-12-14 09:25:05 +01:00
* This file provides a generic firmware to drive SRAM memories
2019-04-29 14:39:56 +01:00
* mounted as external device.
2021-12-14 09:25:05 +01:00
*
******************************************************************************
* @attention
*
* Copyright (c) 2017 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
2019-04-29 14:39:56 +01:00
@verbatim
==============================================================================
##### How to use this driver #####
2021-12-14 09:25:05 +01:00
==============================================================================
2019-04-29 14:39:56 +01:00
[..]
2021-12-14 09:25:05 +01:00
This driver is a generic layered driver which contains a set of APIs used to
control SRAM memories. It uses the FMC layer functions to interface
with SRAM devices.
2019-04-29 14:39:56 +01:00
The following sequence should be followed to configure the FMC to interface
2021-12-14 09:25:05 +01:00
with SRAM/PSRAM memories:
2019-04-29 14:39:56 +01:00
(#) Declare a SRAM_HandleTypeDef handle structure, for example:
2021-12-14 09:25:05 +01:00
SRAM_HandleTypeDef hsram; and:
(++) Fill the SRAM_HandleTypeDef handle "Init" field with the allowed
2019-04-29 14:39:56 +01:00
values of the structure member.
2021-12-14 09:25:05 +01:00
(++) Fill the SRAM_HandleTypeDef handle "Instance" field with a predefined
base register instance for NOR or SRAM device
2019-04-29 14:39:56 +01:00
(++) Fill the SRAM_HandleTypeDef handle "Extended" field with a predefined
2021-12-14 09:25:05 +01:00
base register instance for NOR or SRAM extended mode
(#) Declare two FMC_NORSRAM_TimingTypeDef structures, for both normal and extended
2019-04-29 14:39:56 +01:00
mode timings; for example:
FMC_NORSRAM_TimingTypeDef Timing and FMC_NORSRAM_TimingTypeDef ExTiming;
and fill its fields with the allowed values of the structure member.
2021-12-14 09:25:05 +01:00
2019-04-29 14:39:56 +01:00
(#) Initialize the SRAM Controller by calling the function HAL_SRAM_Init(). This function
performs the following sequence:
2021-12-14 09:25:05 +01:00
2019-04-29 14:39:56 +01:00
(##) MSP hardware layer configuration using the function HAL_SRAM_MspInit()
2021-12-14 09:25:05 +01:00
(##) Control register configuration using the FMC NORSRAM interface function
2019-04-29 14:39:56 +01:00
FMC_NORSRAM_Init()
2021-12-14 09:25:05 +01:00
(##) Timing register configuration using the FMC NORSRAM interface function
2019-04-29 14:39:56 +01:00
FMC_NORSRAM_Timing_Init()
2021-12-14 09:25:05 +01:00
(##) Extended mode Timing register configuration using the FMC NORSRAM interface function
2019-04-29 14:39:56 +01:00
FMC_NORSRAM_Extended_Timing_Init()
2021-12-14 09:25:05 +01:00
(##) Enable the SRAM device using the macro __FMC_NORSRAM_ENABLE()
2019-04-29 14:39:56 +01:00
2021-12-14 09:25:05 +01:00
(#) At this stage you can perform read/write accesses from/to the memory connected
2019-04-29 14:39:56 +01:00
to the NOR/SRAM Bank. You can perform either polling or DMA transfer using the
following APIs:
(++) HAL_SRAM_Read()/HAL_SRAM_Write() for polling read/write access
(++) HAL_SRAM_Read_DMA()/HAL_SRAM_Write_DMA() for DMA read/write transfer
2021-12-14 09:25:05 +01:00
2019-04-29 14:39:56 +01:00
(#) You can also control the SRAM device by calling the control APIs HAL_SRAM_WriteOperation_Enable()/
2021-12-14 09:25:05 +01:00
HAL_SRAM_WriteOperation_Disable() to respectively enable/disable the SRAM write operation
2019-04-29 14:39:56 +01:00
(#) You can continuously monitor the SRAM device HAL state by calling the function
HAL_SRAM_GetState()
*** Callback registration ***
=============================================
[..]
The compilation define USE_HAL_SRAM_REGISTER_CALLBACKS when set to 1
allows the user to configure dynamically the driver callbacks.
2021-12-14 09:25:05 +01:00
Use Functions HAL_SRAM_RegisterCallback() to register a user callback,
2019-04-29 14:39:56 +01:00
it allows to register following callbacks:
(+) MspInitCallback : SRAM MspInit.
(+) MspDeInitCallback : SRAM MspDeInit.
This function takes as parameters the HAL peripheral handle, the Callback ID
and a pointer to the user callback function.
2021-12-14 09:25:05 +01:00
Use function HAL_SRAM_UnRegisterCallback() to reset a callback to the default
2019-04-29 14:39:56 +01:00
weak (surcharged) function. It allows to reset following callbacks:
(+) MspInitCallback : SRAM MspInit.
(+) MspDeInitCallback : SRAM MspDeInit.
This function) takes as parameters the HAL peripheral handle and the Callback ID.
2021-12-14 09:25:05 +01:00
By default, after the HAL_SRAM_Init and if the state is HAL_SRAM_STATE_RESET
2019-04-29 14:39:56 +01:00
all callbacks are reset to the corresponding legacy weak (surcharged) functions.
Exception done for MspInit and MspDeInit callbacks that are respectively
2021-12-14 09:25:05 +01:00
reset to the legacy weak (surcharged) functions in the HAL_SRAM_Init
and HAL_SRAM_DeInit only when these callbacks are null (not registered beforehand).
If not, MspInit or MspDeInit are not null, the HAL_SRAM_Init and HAL_SRAM_DeInit
2019-04-29 14:39:56 +01:00
keep and use the user MspInit/MspDeInit callbacks (registered beforehand)
Callbacks can be registered/unregistered in READY state only.
Exception done for MspInit/MspDeInit callbacks that can be registered/unregistered
in READY or RESET state, thus registered (user) MspInit/DeInit callbacks can be used
during the Init/DeInit.
In that case first register the MspInit/MspDeInit user callbacks
2021-12-14 09:25:05 +01:00
using HAL_SRAM_RegisterCallback before calling HAL_SRAM_DeInit
or HAL_SRAM_Init function.
2019-04-29 14:39:56 +01:00
When The compilation define USE_HAL_SRAM_REGISTER_CALLBACKS is set to 0 or
not defined, the callback registering feature is not available
and weak (surcharged) callbacks are used.
@endverbatim
******************************************************************************
2021-12-14 09:25:05 +01:00
*/
2019-04-29 14:39:56 +01:00
/* Includes ------------------------------------------------------------------*/
#include "stm32f7xx_hal.h"
2021-12-14 09:25:05 +01:00
2019-04-29 14:39:56 +01:00
/** @addtogroup STM32F7xx_HAL_Driver
* @{
*/
2021-12-14 09:25:05 +01:00
#ifdef HAL_SRAM_MODULE_ENABLED
/** @defgroup SRAM SRAM
2019-04-29 14:39:56 +01:00
* @brief SRAM driver modules
* @{
*/
2021-12-14 09:25:05 +01:00
2019-04-29 14:39:56 +01:00
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
2021-12-14 09:25:05 +01:00
/* Private macro -------------------------------------------------------------*/
2019-04-29 14:39:56 +01:00
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
2021-12-14 09:25:05 +01:00
static void SRAM_DMACplt(DMA_HandleTypeDef *hdma);
static void SRAM_DMACpltProt(DMA_HandleTypeDef *hdma);
static void SRAM_DMAError(DMA_HandleTypeDef *hdma);
2019-04-29 14:39:56 +01:00
/* Exported functions --------------------------------------------------------*/
/** @defgroup SRAM_Exported_Functions SRAM Exported Functions
* @{
*/
/** @defgroup SRAM_Exported_Functions_Group1 Initialization and de-initialization functions
* @brief Initialization and Configuration functions.
*
2021-12-14 09:25:05 +01:00
@verbatim
2019-04-29 14:39:56 +01:00
==============================================================================
##### SRAM Initialization and de_initialization functions #####
==============================================================================
[..] This section provides functions allowing to initialize/de-initialize
the SRAM memory
2021-12-14 09:25:05 +01:00
2019-04-29 14:39:56 +01:00
@endverbatim
* @{
*/
/**
* @brief Performs the SRAM device initialization sequence
* @param hsram pointer to a SRAM_HandleTypeDef structure that contains
* the configuration information for SRAM module.
2021-12-14 09:25:05 +01:00
* @param Timing Pointer to SRAM control timing structure
* @param ExtTiming Pointer to SRAM extended mode timing structure
2019-04-29 14:39:56 +01:00
* @retval HAL status
*/
2021-12-14 09:25:05 +01:00
HAL_StatusTypeDef HAL_SRAM_Init(SRAM_HandleTypeDef *hsram, FMC_NORSRAM_TimingTypeDef *Timing,
FMC_NORSRAM_TimingTypeDef *ExtTiming)
{
2019-04-29 14:39:56 +01:00
/* Check the SRAM handle parameter */
2021-12-14 09:25:05 +01:00
if (hsram == NULL)
2019-04-29 14:39:56 +01:00
{
2021-12-14 09:25:05 +01:00
return HAL_ERROR;
2019-04-29 14:39:56 +01:00
}
2021-12-14 09:25:05 +01:00
if (hsram->State == HAL_SRAM_STATE_RESET)
{
2019-04-29 14:39:56 +01:00
/* Allocate lock resource and initialize it */
hsram->Lock = HAL_UNLOCKED;
#if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1)
2021-12-14 09:25:05 +01:00
if (hsram->MspInitCallback == NULL)
2019-04-29 14:39:56 +01:00
{
hsram->MspInitCallback = HAL_SRAM_MspInit;
}
hsram->DmaXferCpltCallback = HAL_SRAM_DMA_XferCpltCallback;
hsram->DmaXferErrorCallback = HAL_SRAM_DMA_XferErrorCallback;
/* Init the low level hardware */
hsram->MspInitCallback(hsram);
#else
/* Initialize the low level hardware (MSP) */
HAL_SRAM_MspInit(hsram);
2021-12-14 09:25:05 +01:00
#endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */
2019-04-29 14:39:56 +01:00
}
2021-12-14 09:25:05 +01:00
2019-04-29 14:39:56 +01:00
/* Initialize SRAM control Interface */
2021-12-14 09:25:05 +01:00
(void)FMC_NORSRAM_Init(hsram->Instance, &(hsram->Init));
2019-04-29 14:39:56 +01:00
/* Initialize SRAM timing Interface */
2021-12-14 09:25:05 +01:00
(void)FMC_NORSRAM_Timing_Init(hsram->Instance, Timing, hsram->Init.NSBank);
2019-04-29 14:39:56 +01:00
/* Initialize SRAM extended mode timing Interface */
2021-12-14 09:25:05 +01:00
(void)FMC_NORSRAM_Extended_Timing_Init(hsram->Extended, ExtTiming, hsram->Init.NSBank,
hsram->Init.ExtendedMode);
2019-04-29 14:39:56 +01:00
/* Enable the NORSRAM device */
2021-12-14 09:25:05 +01:00
__FMC_NORSRAM_ENABLE(hsram->Instance, hsram->Init.NSBank);
/* Initialize the SRAM controller state */
hsram->State = HAL_SRAM_STATE_READY;
2019-04-29 14:39:56 +01:00
return HAL_OK;
}
/**
* @brief Performs the SRAM device De-initialization sequence.
* @param hsram pointer to a SRAM_HandleTypeDef structure that contains
* the configuration information for SRAM module.
* @retval HAL status
*/
HAL_StatusTypeDef HAL_SRAM_DeInit(SRAM_HandleTypeDef *hsram)
{
#if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1)
2021-12-14 09:25:05 +01:00
if (hsram->MspDeInitCallback == NULL)
2019-04-29 14:39:56 +01:00
{
hsram->MspDeInitCallback = HAL_SRAM_MspDeInit;
}
/* DeInit the low level hardware */
hsram->MspDeInitCallback(hsram);
#else
/* De-Initialize the low level hardware (MSP) */
HAL_SRAM_MspDeInit(hsram);
2021-12-14 09:25:05 +01:00
#endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */
2019-04-29 14:39:56 +01:00
/* Configure the SRAM registers with their reset values */
2021-12-14 09:25:05 +01:00
(void)FMC_NORSRAM_DeInit(hsram->Instance, hsram->Extended, hsram->Init.NSBank);
2019-04-29 14:39:56 +01:00
2021-12-14 09:25:05 +01:00
/* Reset the SRAM controller state */
2019-04-29 14:39:56 +01:00
hsram->State = HAL_SRAM_STATE_RESET;
2021-12-14 09:25:05 +01:00
2019-04-29 14:39:56 +01:00
/* Release Lock */
__HAL_UNLOCK(hsram);
return HAL_OK;
}
/**
* @brief SRAM MSP Init.
* @param hsram pointer to a SRAM_HandleTypeDef structure that contains
* the configuration information for SRAM module.
* @retval None
*/
__weak void HAL_SRAM_MspInit(SRAM_HandleTypeDef *hsram)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(hsram);
2021-12-14 09:25:05 +01:00
2019-04-29 14:39:56 +01:00
/* NOTE : This function Should not be modified, when the callback is needed,
the HAL_SRAM_MspInit could be implemented in the user file
2021-12-14 09:25:05 +01:00
*/
2019-04-29 14:39:56 +01:00
}
/**
* @brief SRAM MSP DeInit.
* @param hsram pointer to a SRAM_HandleTypeDef structure that contains
* the configuration information for SRAM module.
* @retval None
*/
__weak void HAL_SRAM_MspDeInit(SRAM_HandleTypeDef *hsram)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(hsram);
2021-12-14 09:25:05 +01:00
2019-04-29 14:39:56 +01:00
/* NOTE : This function Should not be modified, when the callback is needed,
the HAL_SRAM_MspDeInit could be implemented in the user file
2021-12-14 09:25:05 +01:00
*/
2019-04-29 14:39:56 +01:00
}
/**
* @brief DMA transfer complete callback.
* @param hdma pointer to a SRAM_HandleTypeDef structure that contains
* the configuration information for SRAM module.
* @retval None
*/
__weak void HAL_SRAM_DMA_XferCpltCallback(DMA_HandleTypeDef *hdma)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(hdma);
2021-12-14 09:25:05 +01:00
2019-04-29 14:39:56 +01:00
/* NOTE : This function Should not be modified, when the callback is needed,
the HAL_SRAM_DMA_XferCpltCallback could be implemented in the user file
2021-12-14 09:25:05 +01:00
*/
2019-04-29 14:39:56 +01:00
}
/**
* @brief DMA transfer complete error callback.
* @param hdma pointer to a SRAM_HandleTypeDef structure that contains
* the configuration information for SRAM module.
* @retval None
*/
__weak void HAL_SRAM_DMA_XferErrorCallback(DMA_HandleTypeDef *hdma)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(hdma);
2021-12-14 09:25:05 +01:00
2019-04-29 14:39:56 +01:00
/* NOTE : This function Should not be modified, when the callback is needed,
the HAL_SRAM_DMA_XferErrorCallback could be implemented in the user file
2021-12-14 09:25:05 +01:00
*/
2019-04-29 14:39:56 +01:00
}
/**
* @}
*/
2021-12-14 09:25:05 +01:00
/** @defgroup SRAM_Exported_Functions_Group2 Input Output and memory control functions
* @brief Input Output and memory control functions
2019-04-29 14:39:56 +01:00
*
2021-12-14 09:25:05 +01:00
@verbatim
2019-04-29 14:39:56 +01:00
==============================================================================
##### SRAM Input and Output functions #####
==============================================================================
2021-12-14 09:25:05 +01:00
[..]
2019-04-29 14:39:56 +01:00
This section provides functions allowing to use and control the SRAM memory
2021-12-14 09:25:05 +01:00
2019-04-29 14:39:56 +01:00
@endverbatim
* @{
*/
/**
2021-12-14 09:25:05 +01:00
* @brief Reads 8-bit buffer from SRAM memory.
2019-04-29 14:39:56 +01:00
* @param hsram pointer to a SRAM_HandleTypeDef structure that contains
* the configuration information for SRAM module.
* @param pAddress Pointer to read start address
2021-12-14 09:25:05 +01:00
* @param pDstBuffer Pointer to destination buffer
2019-04-29 14:39:56 +01:00
* @param BufferSize Size of the buffer to read from memory
* @retval HAL status
*/
2021-12-14 09:25:05 +01:00
HAL_StatusTypeDef HAL_SRAM_Read_8b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint8_t *pDstBuffer,
uint32_t BufferSize)
2019-04-29 14:39:56 +01:00
{
2021-12-14 09:25:05 +01:00
uint32_t size;
__IO uint8_t *psramaddress = (uint8_t *)pAddress;
uint8_t *pdestbuff = pDstBuffer;
HAL_SRAM_StateTypeDef state = hsram->State;
/* Check the SRAM controller state */
if ((state == HAL_SRAM_STATE_READY) || (state == HAL_SRAM_STATE_PROTECTED))
2019-04-29 14:39:56 +01:00
{
2021-12-14 09:25:05 +01:00
/* Process Locked */
__HAL_LOCK(hsram);
/* Update the SRAM controller state */
hsram->State = HAL_SRAM_STATE_BUSY;
/* Read data from memory */
for (size = BufferSize; size != 0U; size--)
{
*pdestbuff = *psramaddress;
pdestbuff++;
psramaddress++;
}
/* Update the SRAM controller state */
hsram->State = state;
/* Process unlocked */
__HAL_UNLOCK(hsram);
}
else
{
return HAL_ERROR;
2019-04-29 14:39:56 +01:00
}
2021-12-14 09:25:05 +01:00
return HAL_OK;
2019-04-29 14:39:56 +01:00
}
/**
2021-12-14 09:25:05 +01:00
* @brief Writes 8-bit buffer to SRAM memory.
2019-04-29 14:39:56 +01:00
* @param hsram pointer to a SRAM_HandleTypeDef structure that contains
* the configuration information for SRAM module.
* @param pAddress Pointer to write start address
2021-12-14 09:25:05 +01:00
* @param pSrcBuffer Pointer to source buffer to write
2019-04-29 14:39:56 +01:00
* @param BufferSize Size of the buffer to write to memory
* @retval HAL status
*/
2021-12-14 09:25:05 +01:00
HAL_StatusTypeDef HAL_SRAM_Write_8b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint8_t *pSrcBuffer,
uint32_t BufferSize)
2019-04-29 14:39:56 +01:00
{
2021-12-14 09:25:05 +01:00
uint32_t size;
__IO uint8_t *psramaddress = (uint8_t *)pAddress;
uint8_t *psrcbuff = pSrcBuffer;
2019-04-29 14:39:56 +01:00
/* Check the SRAM controller state */
2021-12-14 09:25:05 +01:00
if (hsram->State == HAL_SRAM_STATE_READY)
2019-04-29 14:39:56 +01:00
{
2021-12-14 09:25:05 +01:00
/* Process Locked */
__HAL_LOCK(hsram);
/* Update the SRAM controller state */
hsram->State = HAL_SRAM_STATE_BUSY;
/* Write data to memory */
for (size = BufferSize; size != 0U; size--)
{
*psramaddress = *psrcbuff;
psrcbuff++;
psramaddress++;
}
2019-04-29 14:39:56 +01:00
2021-12-14 09:25:05 +01:00
/* Update the SRAM controller state */
hsram->State = HAL_SRAM_STATE_READY;
/* Process unlocked */
__HAL_UNLOCK(hsram);
}
else
2019-04-29 14:39:56 +01:00
{
2021-12-14 09:25:05 +01:00
return HAL_ERROR;
}
2019-04-29 14:39:56 +01:00
2021-12-14 09:25:05 +01:00
return HAL_OK;
2019-04-29 14:39:56 +01:00
}
/**
2021-12-14 09:25:05 +01:00
* @brief Reads 16-bit buffer from SRAM memory.
2019-04-29 14:39:56 +01:00
* @param hsram pointer to a SRAM_HandleTypeDef structure that contains
* the configuration information for SRAM module.
* @param pAddress Pointer to read start address
2021-12-14 09:25:05 +01:00
* @param pDstBuffer Pointer to destination buffer
2019-04-29 14:39:56 +01:00
* @param BufferSize Size of the buffer to read from memory
* @retval HAL status
*/
2021-12-14 09:25:05 +01:00
HAL_StatusTypeDef HAL_SRAM_Read_16b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint16_t *pDstBuffer,
uint32_t BufferSize)
2019-04-29 14:39:56 +01:00
{
2021-12-14 09:25:05 +01:00
uint32_t size;
__IO uint32_t *psramaddress = pAddress;
uint16_t *pdestbuff = pDstBuffer;
uint8_t limit;
HAL_SRAM_StateTypeDef state = hsram->State;
/* Check the SRAM controller state */
if ((state == HAL_SRAM_STATE_READY) || (state == HAL_SRAM_STATE_PROTECTED))
2019-04-29 14:39:56 +01:00
{
2021-12-14 09:25:05 +01:00
/* Process Locked */
__HAL_LOCK(hsram);
/* Update the SRAM controller state */
hsram->State = HAL_SRAM_STATE_BUSY;
/* Check if the size is a 32-bits multiple */
limit = (((BufferSize % 2U) != 0U) ? 1U : 0U);
/* Read data from memory */
for (size = BufferSize; size != limit; size -= 2U)
{
*pdestbuff = (uint16_t)((*psramaddress) & 0x0000FFFFU);
pdestbuff++;
*pdestbuff = (uint16_t)(((*psramaddress) & 0xFFFF0000U) >> 16U);
pdestbuff++;
psramaddress++;
}
/* Read last 16-bits if size is not 32-bits multiple */
if (limit != 0U)
{
*pdestbuff = (uint16_t)((*psramaddress) & 0x0000FFFFU);
}
/* Update the SRAM controller state */
hsram->State = state;
/* Process unlocked */
__HAL_UNLOCK(hsram);
}
else
{
return HAL_ERROR;
2019-04-29 14:39:56 +01:00
}
2021-12-14 09:25:05 +01:00
return HAL_OK;
2019-04-29 14:39:56 +01:00
}
/**
2021-12-14 09:25:05 +01:00
* @brief Writes 16-bit buffer to SRAM memory.
2019-04-29 14:39:56 +01:00
* @param hsram pointer to a SRAM_HandleTypeDef structure that contains
* the configuration information for SRAM module.
* @param pAddress Pointer to write start address
2021-12-14 09:25:05 +01:00
* @param pSrcBuffer Pointer to source buffer to write
2019-04-29 14:39:56 +01:00
* @param BufferSize Size of the buffer to write to memory
* @retval HAL status
*/
2021-12-14 09:25:05 +01:00
HAL_StatusTypeDef HAL_SRAM_Write_16b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint16_t *pSrcBuffer,
uint32_t BufferSize)
2019-04-29 14:39:56 +01:00
{
2021-12-14 09:25:05 +01:00
uint32_t size;
__IO uint32_t *psramaddress = pAddress;
uint16_t *psrcbuff = pSrcBuffer;
uint8_t limit;
2019-04-29 14:39:56 +01:00
/* Check the SRAM controller state */
2021-12-14 09:25:05 +01:00
if (hsram->State == HAL_SRAM_STATE_READY)
2019-04-29 14:39:56 +01:00
{
2021-12-14 09:25:05 +01:00
/* Process Locked */
__HAL_LOCK(hsram);
/* Update the SRAM controller state */
hsram->State = HAL_SRAM_STATE_BUSY;
/* Check if the size is a 32-bits multiple */
limit = (((BufferSize % 2U) != 0U) ? 1U : 0U);
2019-04-29 14:39:56 +01:00
2021-12-14 09:25:05 +01:00
/* Write data to memory */
for (size = BufferSize; size != limit; size -= 2U)
{
*psramaddress = (uint32_t)(*psrcbuff);
psrcbuff++;
*psramaddress |= ((uint32_t)(*psrcbuff) << 16U);
psrcbuff++;
psramaddress++;
}
/* Write last 16-bits if size is not 32-bits multiple */
if (limit != 0U)
{
*psramaddress = ((uint32_t)(*psrcbuff) & 0x0000FFFFU) | ((*psramaddress) & 0xFFFF0000U);
}
/* Update the SRAM controller state */
hsram->State = HAL_SRAM_STATE_READY;
/* Process unlocked */
__HAL_UNLOCK(hsram);
}
else
2019-04-29 14:39:56 +01:00
{
2021-12-14 09:25:05 +01:00
return HAL_ERROR;
}
2019-04-29 14:39:56 +01:00
2021-12-14 09:25:05 +01:00
return HAL_OK;
2019-04-29 14:39:56 +01:00
}
/**
2021-12-14 09:25:05 +01:00
* @brief Reads 32-bit buffer from SRAM memory.
2019-04-29 14:39:56 +01:00
* @param hsram pointer to a SRAM_HandleTypeDef structure that contains
* the configuration information for SRAM module.
* @param pAddress Pointer to read start address
2021-12-14 09:25:05 +01:00
* @param pDstBuffer Pointer to destination buffer
2019-04-29 14:39:56 +01:00
* @param BufferSize Size of the buffer to read from memory
* @retval HAL status
*/
2021-12-14 09:25:05 +01:00
HAL_StatusTypeDef HAL_SRAM_Read_32b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pDstBuffer,
uint32_t BufferSize)
2019-04-29 14:39:56 +01:00
{
2021-12-14 09:25:05 +01:00
uint32_t size;
__IO uint32_t *psramaddress = pAddress;
uint32_t *pdestbuff = pDstBuffer;
HAL_SRAM_StateTypeDef state = hsram->State;
/* Check the SRAM controller state */
if ((state == HAL_SRAM_STATE_READY) || (state == HAL_SRAM_STATE_PROTECTED))
2019-04-29 14:39:56 +01:00
{
2021-12-14 09:25:05 +01:00
/* Process Locked */
__HAL_LOCK(hsram);
/* Update the SRAM controller state */
hsram->State = HAL_SRAM_STATE_BUSY;
/* Read data from memory */
for (size = BufferSize; size != 0U; size--)
{
*pdestbuff = *psramaddress;
pdestbuff++;
psramaddress++;
}
/* Update the SRAM controller state */
hsram->State = state;
/* Process unlocked */
__HAL_UNLOCK(hsram);
}
else
{
return HAL_ERROR;
2019-04-29 14:39:56 +01:00
}
2021-12-14 09:25:05 +01:00
return HAL_OK;
2019-04-29 14:39:56 +01:00
}
/**
2021-12-14 09:25:05 +01:00
* @brief Writes 32-bit buffer to SRAM memory.
2019-04-29 14:39:56 +01:00
* @param hsram pointer to a SRAM_HandleTypeDef structure that contains
* the configuration information for SRAM module.
* @param pAddress Pointer to write start address
2021-12-14 09:25:05 +01:00
* @param pSrcBuffer Pointer to source buffer to write
2019-04-29 14:39:56 +01:00
* @param BufferSize Size of the buffer to write to memory
* @retval HAL status
*/
2021-12-14 09:25:05 +01:00
HAL_StatusTypeDef HAL_SRAM_Write_32b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pSrcBuffer,
uint32_t BufferSize)
2019-04-29 14:39:56 +01:00
{
2021-12-14 09:25:05 +01:00
uint32_t size;
__IO uint32_t *psramaddress = pAddress;
uint32_t *psrcbuff = pSrcBuffer;
2019-04-29 14:39:56 +01:00
/* Check the SRAM controller state */
2021-12-14 09:25:05 +01:00
if (hsram->State == HAL_SRAM_STATE_READY)
2019-04-29 14:39:56 +01:00
{
2021-12-14 09:25:05 +01:00
/* Process Locked */
__HAL_LOCK(hsram);
/* Update the SRAM controller state */
hsram->State = HAL_SRAM_STATE_BUSY;
2019-04-29 14:39:56 +01:00
2021-12-14 09:25:05 +01:00
/* Write data to memory */
for (size = BufferSize; size != 0U; size--)
{
*psramaddress = *psrcbuff;
psrcbuff++;
psramaddress++;
}
/* Update the SRAM controller state */
hsram->State = HAL_SRAM_STATE_READY;
/* Process unlocked */
__HAL_UNLOCK(hsram);
}
else
2019-04-29 14:39:56 +01:00
{
2021-12-14 09:25:05 +01:00
return HAL_ERROR;
}
2019-04-29 14:39:56 +01:00
2021-12-14 09:25:05 +01:00
return HAL_OK;
2019-04-29 14:39:56 +01:00
}
/**
* @brief Reads a Words data from the SRAM memory using DMA transfer.
* @param hsram pointer to a SRAM_HandleTypeDef structure that contains
* the configuration information for SRAM module.
* @param pAddress Pointer to read start address
2021-12-14 09:25:05 +01:00
* @param pDstBuffer Pointer to destination buffer
2019-04-29 14:39:56 +01:00
* @param BufferSize Size of the buffer to read from memory
* @retval HAL status
*/
2021-12-14 09:25:05 +01:00
HAL_StatusTypeDef HAL_SRAM_Read_DMA(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pDstBuffer,
uint32_t BufferSize)
2019-04-29 14:39:56 +01:00
{
2021-12-14 09:25:05 +01:00
HAL_StatusTypeDef status;
HAL_SRAM_StateTypeDef state = hsram->State;
/* Check the SRAM controller state */
if ((state == HAL_SRAM_STATE_READY) || (state == HAL_SRAM_STATE_PROTECTED))
{
/* Process Locked */
__HAL_LOCK(hsram);
/* Update the SRAM controller state */
hsram->State = HAL_SRAM_STATE_BUSY;
/* Configure DMA user callbacks */
if (state == HAL_SRAM_STATE_READY)
{
hsram->hdma->XferCpltCallback = SRAM_DMACplt;
}
else
{
hsram->hdma->XferCpltCallback = SRAM_DMACpltProt;
}
hsram->hdma->XferErrorCallback = SRAM_DMAError;
/* Enable the DMA Stream */
status = HAL_DMA_Start_IT(hsram->hdma, (uint32_t)pAddress, (uint32_t)pDstBuffer, (uint32_t)BufferSize);
/* Process unlocked */
__HAL_UNLOCK(hsram);
}
else
{
status = HAL_ERROR;
}
return status;
2019-04-29 14:39:56 +01:00
}
/**
* @brief Writes a Words data buffer to SRAM memory using DMA transfer.
* @param hsram pointer to a SRAM_HandleTypeDef structure that contains
* the configuration information for SRAM module.
* @param pAddress Pointer to write start address
2021-12-14 09:25:05 +01:00
* @param pSrcBuffer Pointer to source buffer to write
2019-04-29 14:39:56 +01:00
* @param BufferSize Size of the buffer to write to memory
* @retval HAL status
*/
2021-12-14 09:25:05 +01:00
HAL_StatusTypeDef HAL_SRAM_Write_DMA(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pSrcBuffer,
uint32_t BufferSize)
2019-04-29 14:39:56 +01:00
{
2021-12-14 09:25:05 +01:00
HAL_StatusTypeDef status;
2019-04-29 14:39:56 +01:00
/* Check the SRAM controller state */
2021-12-14 09:25:05 +01:00
if (hsram->State == HAL_SRAM_STATE_READY)
2019-04-29 14:39:56 +01:00
{
2021-12-14 09:25:05 +01:00
/* Process Locked */
__HAL_LOCK(hsram);
/* Update the SRAM controller state */
hsram->State = HAL_SRAM_STATE_BUSY;
/* Configure DMA user callbacks */
hsram->hdma->XferCpltCallback = SRAM_DMACplt;
hsram->hdma->XferErrorCallback = SRAM_DMAError;
/* Enable the DMA Stream */
status = HAL_DMA_Start_IT(hsram->hdma, (uint32_t)pSrcBuffer, (uint32_t)pAddress, (uint32_t)BufferSize);
/* Process unlocked */
__HAL_UNLOCK(hsram);
2019-04-29 14:39:56 +01:00
}
2021-12-14 09:25:05 +01:00
else
{
status = HAL_ERROR;
}
return status;
2019-04-29 14:39:56 +01:00
}
#if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1)
/**
* @brief Register a User SRAM Callback
* To be used instead of the weak (surcharged) predefined callback
* @param hsram : SRAM handle
* @param CallbackId : ID of the callback to be registered
* This parameter can be one of the following values:
* @arg @ref HAL_SRAM_MSP_INIT_CB_ID SRAM MspInit callback ID
* @arg @ref HAL_SRAM_MSP_DEINIT_CB_ID SRAM MspDeInit callback ID
* @param pCallback : pointer to the Callback function
* @retval status
*/
2021-12-14 09:25:05 +01:00
HAL_StatusTypeDef HAL_SRAM_RegisterCallback(SRAM_HandleTypeDef *hsram, HAL_SRAM_CallbackIDTypeDef CallbackId,
pSRAM_CallbackTypeDef pCallback)
2019-04-29 14:39:56 +01:00
{
HAL_StatusTypeDef status = HAL_OK;
HAL_SRAM_StateTypeDef state;
2021-12-14 09:25:05 +01:00
if (pCallback == NULL)
2019-04-29 14:39:56 +01:00
{
return HAL_ERROR;
}
/* Process locked */
__HAL_LOCK(hsram);
state = hsram->State;
2021-12-14 09:25:05 +01:00
if ((state == HAL_SRAM_STATE_READY) || (state == HAL_SRAM_STATE_RESET) || (state == HAL_SRAM_STATE_PROTECTED))
2019-04-29 14:39:56 +01:00
{
switch (CallbackId)
{
2021-12-14 09:25:05 +01:00
case HAL_SRAM_MSP_INIT_CB_ID :
hsram->MspInitCallback = pCallback;
break;
case HAL_SRAM_MSP_DEINIT_CB_ID :
hsram->MspDeInitCallback = pCallback;
break;
default :
/* update return status */
status = HAL_ERROR;
break;
2019-04-29 14:39:56 +01:00
}
}
else
{
/* update return status */
status = HAL_ERROR;
}
/* Release Lock */
__HAL_UNLOCK(hsram);
return status;
}
/**
* @brief Unregister a User SRAM Callback
* SRAM Callback is redirected to the weak (surcharged) predefined callback
* @param hsram : SRAM handle
* @param CallbackId : ID of the callback to be unregistered
* This parameter can be one of the following values:
* @arg @ref HAL_SRAM_MSP_INIT_CB_ID SRAM MspInit callback ID
* @arg @ref HAL_SRAM_MSP_DEINIT_CB_ID SRAM MspDeInit callback ID
* @arg @ref HAL_SRAM_DMA_XFER_CPLT_CB_ID SRAM DMA Xfer Complete callback ID
* @arg @ref HAL_SRAM_DMA_XFER_ERR_CB_ID SRAM DMA Xfer Error callback ID
* @retval status
*/
2021-12-14 09:25:05 +01:00
HAL_StatusTypeDef HAL_SRAM_UnRegisterCallback(SRAM_HandleTypeDef *hsram, HAL_SRAM_CallbackIDTypeDef CallbackId)
2019-04-29 14:39:56 +01:00
{
HAL_StatusTypeDef status = HAL_OK;
HAL_SRAM_StateTypeDef state;
/* Process locked */
__HAL_LOCK(hsram);
state = hsram->State;
2021-12-14 09:25:05 +01:00
if ((state == HAL_SRAM_STATE_READY) || (state == HAL_SRAM_STATE_PROTECTED))
2019-04-29 14:39:56 +01:00
{
switch (CallbackId)
{
2021-12-14 09:25:05 +01:00
case HAL_SRAM_MSP_INIT_CB_ID :
hsram->MspInitCallback = HAL_SRAM_MspInit;
break;
case HAL_SRAM_MSP_DEINIT_CB_ID :
hsram->MspDeInitCallback = HAL_SRAM_MspDeInit;
break;
case HAL_SRAM_DMA_XFER_CPLT_CB_ID :
hsram->DmaXferCpltCallback = HAL_SRAM_DMA_XferCpltCallback;
break;
case HAL_SRAM_DMA_XFER_ERR_CB_ID :
hsram->DmaXferErrorCallback = HAL_SRAM_DMA_XferErrorCallback;
break;
default :
/* update return status */
status = HAL_ERROR;
break;
2019-04-29 14:39:56 +01:00
}
}
2021-12-14 09:25:05 +01:00
else if (state == HAL_SRAM_STATE_RESET)
2019-04-29 14:39:56 +01:00
{
switch (CallbackId)
{
2021-12-14 09:25:05 +01:00
case HAL_SRAM_MSP_INIT_CB_ID :
hsram->MspInitCallback = HAL_SRAM_MspInit;
break;
case HAL_SRAM_MSP_DEINIT_CB_ID :
hsram->MspDeInitCallback = HAL_SRAM_MspDeInit;
break;
default :
/* update return status */
status = HAL_ERROR;
break;
2019-04-29 14:39:56 +01:00
}
}
else
{
/* update return status */
status = HAL_ERROR;
}
/* Release Lock */
__HAL_UNLOCK(hsram);
return status;
}
/**
* @brief Register a User SRAM Callback for DMA transfers
* To be used instead of the weak (surcharged) predefined callback
* @param hsram : SRAM handle
* @param CallbackId : ID of the callback to be registered
* This parameter can be one of the following values:
* @arg @ref HAL_SRAM_DMA_XFER_CPLT_CB_ID SRAM DMA Xfer Complete callback ID
* @arg @ref HAL_SRAM_DMA_XFER_ERR_CB_ID SRAM DMA Xfer Error callback ID
* @param pCallback : pointer to the Callback function
* @retval status
*/
2021-12-14 09:25:05 +01:00
HAL_StatusTypeDef HAL_SRAM_RegisterDmaCallback(SRAM_HandleTypeDef *hsram, HAL_SRAM_CallbackIDTypeDef CallbackId,
pSRAM_DmaCallbackTypeDef pCallback)
2019-04-29 14:39:56 +01:00
{
HAL_StatusTypeDef status = HAL_OK;
HAL_SRAM_StateTypeDef state;
2021-12-14 09:25:05 +01:00
if (pCallback == NULL)
2019-04-29 14:39:56 +01:00
{
return HAL_ERROR;
}
/* Process locked */
__HAL_LOCK(hsram);
state = hsram->State;
2021-12-14 09:25:05 +01:00
if ((state == HAL_SRAM_STATE_READY) || (state == HAL_SRAM_STATE_PROTECTED))
2019-04-29 14:39:56 +01:00
{
switch (CallbackId)
{
2021-12-14 09:25:05 +01:00
case HAL_SRAM_DMA_XFER_CPLT_CB_ID :
hsram->DmaXferCpltCallback = pCallback;
break;
case HAL_SRAM_DMA_XFER_ERR_CB_ID :
hsram->DmaXferErrorCallback = pCallback;
break;
default :
/* update return status */
status = HAL_ERROR;
break;
2019-04-29 14:39:56 +01:00
}
}
else
{
/* update return status */
status = HAL_ERROR;
}
/* Release Lock */
__HAL_UNLOCK(hsram);
return status;
}
2021-12-14 09:25:05 +01:00
#endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */
2019-04-29 14:39:56 +01:00
/**
* @}
*/
2021-12-14 09:25:05 +01:00
/** @defgroup SRAM_Exported_Functions_Group3 Control functions
* @brief Control functions
*
@verbatim
2019-04-29 14:39:56 +01:00
==============================================================================
##### SRAM Control functions #####
2021-12-14 09:25:05 +01:00
==============================================================================
2019-04-29 14:39:56 +01:00
[..]
This subsection provides a set of functions allowing to control dynamically
the SRAM interface.
@endverbatim
* @{
*/
2021-12-14 09:25:05 +01:00
2019-04-29 14:39:56 +01:00
/**
* @brief Enables dynamically SRAM write operation.
* @param hsram pointer to a SRAM_HandleTypeDef structure that contains
* the configuration information for SRAM module.
* @retval HAL status
*/
HAL_StatusTypeDef HAL_SRAM_WriteOperation_Enable(SRAM_HandleTypeDef *hsram)
{
2021-12-14 09:25:05 +01:00
/* Check the SRAM controller state */
if (hsram->State == HAL_SRAM_STATE_PROTECTED)
{
/* Process Locked */
__HAL_LOCK(hsram);
2019-04-29 14:39:56 +01:00
2021-12-14 09:25:05 +01:00
/* Update the SRAM controller state */
hsram->State = HAL_SRAM_STATE_BUSY;
/* Enable write operation */
(void)FMC_NORSRAM_WriteOperation_Enable(hsram->Instance, hsram->Init.NSBank);
/* Update the SRAM controller state */
hsram->State = HAL_SRAM_STATE_READY;
/* Process unlocked */
__HAL_UNLOCK(hsram);
}
else
{
return HAL_ERROR;
}
return HAL_OK;
2019-04-29 14:39:56 +01:00
}
/**
* @brief Disables dynamically SRAM write operation.
* @param hsram pointer to a SRAM_HandleTypeDef structure that contains
* the configuration information for SRAM module.
* @retval HAL status
*/
HAL_StatusTypeDef HAL_SRAM_WriteOperation_Disable(SRAM_HandleTypeDef *hsram)
{
2021-12-14 09:25:05 +01:00
/* Check the SRAM controller state */
if (hsram->State == HAL_SRAM_STATE_READY)
{
/* Process Locked */
__HAL_LOCK(hsram);
2019-04-29 14:39:56 +01:00
2021-12-14 09:25:05 +01:00
/* Update the SRAM controller state */
hsram->State = HAL_SRAM_STATE_BUSY;
/* Disable write operation */
(void)FMC_NORSRAM_WriteOperation_Disable(hsram->Instance, hsram->Init.NSBank);
/* Update the SRAM controller state */
hsram->State = HAL_SRAM_STATE_PROTECTED;
/* Process unlocked */
__HAL_UNLOCK(hsram);
}
else
{
return HAL_ERROR;
}
return HAL_OK;
2019-04-29 14:39:56 +01:00
}
/**
* @}
*/
2021-12-14 09:25:05 +01:00
/** @defgroup SRAM_Exported_Functions_Group4 Peripheral State functions
* @brief Peripheral State functions
*
@verbatim
2019-04-29 14:39:56 +01:00
==============================================================================
##### SRAM State functions #####
2021-12-14 09:25:05 +01:00
==============================================================================
2019-04-29 14:39:56 +01:00
[..]
2021-12-14 09:25:05 +01:00
This subsection permits to get in run-time the status of the SRAM controller
2019-04-29 14:39:56 +01:00
and the data flow.
@endverbatim
* @{
*/
2021-12-14 09:25:05 +01:00
2019-04-29 14:39:56 +01:00
/**
* @brief Returns the SRAM controller state
* @param hsram pointer to a SRAM_HandleTypeDef structure that contains
* the configuration information for SRAM module.
* @retval HAL state
*/
HAL_SRAM_StateTypeDef HAL_SRAM_GetState(SRAM_HandleTypeDef *hsram)
{
return hsram->State;
}
/**
* @}
*/
/**
* @}
*/
2021-12-14 09:25:05 +01:00
/**
* @brief DMA SRAM process complete callback.
* @param hdma : DMA handle
* @retval None
*/
static void SRAM_DMACplt(DMA_HandleTypeDef *hdma)
{
SRAM_HandleTypeDef *hsram = (SRAM_HandleTypeDef *)(hdma->Parent);
/* Disable the DMA channel */
__HAL_DMA_DISABLE(hdma);
/* Update the SRAM controller state */
hsram->State = HAL_SRAM_STATE_READY;
#if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1)
hsram->DmaXferCpltCallback(hdma);
#else
HAL_SRAM_DMA_XferCpltCallback(hdma);
#endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */
}
/**
* @brief DMA SRAM process complete callback.
* @param hdma : DMA handle
* @retval None
*/
static void SRAM_DMACpltProt(DMA_HandleTypeDef *hdma)
{
SRAM_HandleTypeDef *hsram = (SRAM_HandleTypeDef *)(hdma->Parent);
/* Disable the DMA channel */
__HAL_DMA_DISABLE(hdma);
/* Update the SRAM controller state */
hsram->State = HAL_SRAM_STATE_PROTECTED;
#if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1)
hsram->DmaXferCpltCallback(hdma);
#else
HAL_SRAM_DMA_XferCpltCallback(hdma);
#endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */
}
/**
* @brief DMA SRAM error callback.
* @param hdma : DMA handle
* @retval None
*/
static void SRAM_DMAError(DMA_HandleTypeDef *hdma)
{
SRAM_HandleTypeDef *hsram = (SRAM_HandleTypeDef *)(hdma->Parent);
/* Disable the DMA channel */
__HAL_DMA_DISABLE(hdma);
/* Update the SRAM controller state */
hsram->State = HAL_SRAM_STATE_ERROR;
#if (USE_HAL_SRAM_REGISTER_CALLBACKS == 1)
hsram->DmaXferErrorCallback(hdma);
#else
HAL_SRAM_DMA_XferErrorCallback(hdma);
#endif /* USE_HAL_SRAM_REGISTER_CALLBACKS */
}
2019-04-29 14:39:56 +01:00
/**
* @}
*/
2021-12-14 09:25:05 +01:00
#endif /* HAL_SRAM_MODULE_ENABLED */
2019-04-29 14:39:56 +01:00
/**
* @}
*/