1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102 |
- /**
- ******************************************************************************
- * @file stm32f4xx_hal_sdram.c
- * @author MCD Application Team
- * @brief SDRAM HAL module driver.
- * This file provides a generic firmware to drive SDRAM memories mounted
- * as external device.
- *
- @verbatim
- ==============================================================================
- ##### How to use this driver #####
- ==============================================================================
- [..]
- This driver is a generic layered driver which contains a set of APIs used to
- control SDRAM memories. It uses the FMC layer functions to interface
- with SDRAM devices.
- The following sequence should be followed to configure the FMC to interface
- with SDRAM memories:
-
- (#) Declare a SDRAM_HandleTypeDef handle structure, for example:
- SDRAM_HandleTypeDef hdsram
-
- (++) Fill the SDRAM_HandleTypeDef handle "Init" field with the allowed
- values of the structure member.
-
- (++) Fill the SDRAM_HandleTypeDef handle "Instance" field with a predefined
- base register instance for NOR or SDRAM device
-
- (#) Declare a FMC_SDRAM_TimingTypeDef structure; for example:
- FMC_SDRAM_TimingTypeDef Timing;
- and fill its fields with the allowed values of the structure member.
-
- (#) Initialize the SDRAM Controller by calling the function HAL_SDRAM_Init(). This function
- performs the following sequence:
-
- (##) MSP hardware layer configuration using the function HAL_SDRAM_MspInit()
- (##) Control register configuration using the FMC SDRAM interface function
- FMC_SDRAM_Init()
- (##) Timing register configuration using the FMC SDRAM interface function
- FMC_SDRAM_Timing_Init()
- (##) Program the SDRAM external device by applying its initialization sequence
- according to the device plugged in your hardware. This step is mandatory
- for accessing the SDRAM device.
- (#) At this stage you can perform read/write accesses from/to the memory connected
- to the SDRAM Bank. You can perform either polling or DMA transfer using the
- following APIs:
- (++) HAL_SDRAM_Read()/HAL_SDRAM_Write() for polling read/write access
- (++) HAL_SDRAM_Read_DMA()/HAL_SDRAM_Write_DMA() for DMA read/write transfer
-
- (#) You can also control the SDRAM device by calling the control APIs HAL_SDRAM_WriteOperation_Enable()/
- HAL_SDRAM_WriteOperation_Disable() to respectively enable/disable the SDRAM write operation or
- the function HAL_SDRAM_SendCommand() to send a specified command to the SDRAM
- device. The command to be sent must be configured with the FMC_SDRAM_CommandTypeDef
- structure.
-
- (#) You can continuously monitor the SDRAM device HAL state by calling the function
- HAL_SDRAM_GetState()
- *** Callback registration ***
- =============================================
- [..]
- The compilation define USE_HAL_SDRAM_REGISTER_CALLBACKS when set to 1
- allows the user to configure dynamically the driver callbacks.
- Use Functions @ref HAL_SDRAM_RegisterCallback() to register a user callback,
- it allows to register following callbacks:
- (+) MspInitCallback : SDRAM MspInit.
- (+) MspDeInitCallback : SDRAM MspDeInit.
- This function takes as parameters the HAL peripheral handle, the Callback ID
- and a pointer to the user callback function.
- Use function @ref HAL_SDRAM_UnRegisterCallback() to reset a callback to the default
- weak (surcharged) function. It allows to reset following callbacks:
- (+) MspInitCallback : SDRAM MspInit.
- (+) MspDeInitCallback : SDRAM MspDeInit.
- This function) takes as parameters the HAL peripheral handle and the Callback ID.
- By default, after the @ref HAL_SDRAM_Init and if the state is HAL_SDRAM_STATE_RESET
- all callbacks are reset to the corresponding legacy weak (surcharged) functions.
- Exception done for MspInit and MspDeInit callbacks that are respectively
- reset to the legacy weak (surcharged) functions in the @ref HAL_SDRAM_Init
- and @ref HAL_SDRAM_DeInit only when these callbacks are null (not registered beforehand).
- If not, MspInit or MspDeInit are not null, the @ref HAL_SDRAM_Init and @ref HAL_SDRAM_DeInit
- 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
- using @ref HAL_SDRAM_RegisterCallback before calling @ref HAL_SDRAM_DeInit
- or @ref HAL_SDRAM_Init function.
- When The compilation define USE_HAL_SDRAM_REGISTER_CALLBACKS is set to 0 or
- not defined, the callback registering feature is not available
- and weak (surcharged) callbacks are used.
- @endverbatim
- ******************************************************************************
- * @attention
- *
- * <h2><center>© Copyright (c) 2017 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under BSD 3-Clause license,
- * the "License"; You may not use this file except in compliance with the
- * License. You may obtain a copy of the License at:
- * opensource.org/licenses/BSD-3-Clause
- *
- ******************************************************************************
- */
- /* Includes ------------------------------------------------------------------*/
- #include "stm32f4xx_hal.h"
- /** @addtogroup STM32F4xx_HAL_Driver
- * @{
- */
- /** @defgroup SDRAM SDRAM
- * @brief SDRAM driver modules
- * @{
- */
- #ifdef HAL_SDRAM_MODULE_ENABLED
- #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\
- defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx)
- /* Private typedef -----------------------------------------------------------*/
- /* Private define ------------------------------------------------------------*/
- /* Private macro -------------------------------------------------------------*/
- /* Private variables ---------------------------------------------------------*/
- /* Private functions ---------------------------------------------------------*/
- /* Exported functions --------------------------------------------------------*/
- /** @defgroup SDRAM_Exported_Functions SDRAM Exported Functions
- * @{
- */
-
- /** @defgroup SDRAM_Exported_Functions_Group1 Initialization and de-initialization functions
- * @brief Initialization and Configuration functions
- *
- @verbatim
- ==============================================================================
- ##### SDRAM Initialization and de_initialization functions #####
- ==============================================================================
- [..]
- This section provides functions allowing to initialize/de-initialize
- the SDRAM memory
-
- @endverbatim
- * @{
- */
-
- /**
- * @brief Performs the SDRAM device initialization sequence.
- * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains
- * the configuration information for SDRAM module.
- * @param Timing Pointer to SDRAM control timing structure
- * @retval HAL status
- */
- HAL_StatusTypeDef HAL_SDRAM_Init(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_TimingTypeDef *Timing)
- {
- /* Check the SDRAM handle parameter */
- if(hsdram == NULL)
- {
- return HAL_ERROR;
- }
-
- if(hsdram->State == HAL_SDRAM_STATE_RESET)
- {
- /* Allocate lock resource and initialize it */
- hsdram->Lock = HAL_UNLOCKED;
- #if (USE_HAL_SDRAM_REGISTER_CALLBACKS == 1)
- if(hsdram->MspInitCallback == NULL)
- {
- hsdram->MspInitCallback = HAL_SDRAM_MspInit;
- }
- hsdram->RefreshErrorCallback = HAL_SDRAM_RefreshErrorCallback;
- hsdram->DmaXferCpltCallback = HAL_SDRAM_DMA_XferCpltCallback;
- hsdram->DmaXferErrorCallback = HAL_SDRAM_DMA_XferErrorCallback;
- /* Init the low level hardware */
- hsdram->MspInitCallback(hsdram);
- #else
- /* Initialize the low level hardware (MSP) */
- HAL_SDRAM_MspInit(hsdram);
- #endif
- }
-
- /* Initialize the SDRAM controller state */
- hsdram->State = HAL_SDRAM_STATE_BUSY;
-
- /* Initialize SDRAM control Interface */
- FMC_SDRAM_Init(hsdram->Instance, &(hsdram->Init));
-
- /* Initialize SDRAM timing Interface */
- FMC_SDRAM_Timing_Init(hsdram->Instance, Timing, hsdram->Init.SDBank);
-
- /* Update the SDRAM controller state */
- hsdram->State = HAL_SDRAM_STATE_READY;
-
- return HAL_OK;
- }
- /**
- * @brief Perform the SDRAM device initialization sequence.
- * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains
- * the configuration information for SDRAM module.
- * @retval HAL status
- */
- HAL_StatusTypeDef HAL_SDRAM_DeInit(SDRAM_HandleTypeDef *hsdram)
- {
- #if (USE_HAL_SDRAM_REGISTER_CALLBACKS == 1)
- if(hsdram->MspDeInitCallback == NULL)
- {
- hsdram->MspDeInitCallback = HAL_SDRAM_MspDeInit;
- }
- /* DeInit the low level hardware */
- hsdram->MspDeInitCallback(hsdram);
- #else
- /* Initialize the low level hardware (MSP) */
- HAL_SDRAM_MspDeInit(hsdram);
- #endif
- /* Configure the SDRAM registers with their reset values */
- FMC_SDRAM_DeInit(hsdram->Instance, hsdram->Init.SDBank);
- /* Reset the SDRAM controller state */
- hsdram->State = HAL_SDRAM_STATE_RESET;
- /* Release Lock */
- __HAL_UNLOCK(hsdram);
- return HAL_OK;
- }
- /**
- * @brief SDRAM MSP Init.
- * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains
- * the configuration information for SDRAM module.
- * @retval None
- */
- __weak void HAL_SDRAM_MspInit(SDRAM_HandleTypeDef *hsdram)
- {
- /* Prevent unused argument(s) compilation warning */
- UNUSED(hsdram);
- /* NOTE: This function Should not be modified, when the callback is needed,
- the HAL_SDRAM_MspInit could be implemented in the user file
- */
- }
- /**
- * @brief SDRAM MSP DeInit.
- * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains
- * the configuration information for SDRAM module.
- * @retval None
- */
- __weak void HAL_SDRAM_MspDeInit(SDRAM_HandleTypeDef *hsdram)
- {
- /* Prevent unused argument(s) compilation warning */
- UNUSED(hsdram);
- /* NOTE: This function Should not be modified, when the callback is needed,
- the HAL_SDRAM_MspDeInit could be implemented in the user file
- */
- }
- /**
- * @brief This function handles SDRAM refresh error interrupt request.
- * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains
- * the configuration information for SDRAM module.
- * @retval HAL status
- */
- void HAL_SDRAM_IRQHandler(SDRAM_HandleTypeDef *hsdram)
- {
- /* Check SDRAM interrupt Rising edge flag */
- if(__FMC_SDRAM_GET_FLAG(hsdram->Instance, FMC_SDRAM_FLAG_REFRESH_IT))
- {
- /* SDRAM refresh error interrupt callback */
- #if (USE_HAL_SDRAM_REGISTER_CALLBACKS == 1)
- hsdram->RefreshErrorCallback(hsdram);
- #else
- HAL_SDRAM_RefreshErrorCallback(hsdram);
- #endif
- /* Clear SDRAM refresh error interrupt pending bit */
- __FMC_SDRAM_CLEAR_FLAG(hsdram->Instance, FMC_SDRAM_FLAG_REFRESH_ERROR);
- }
- }
- /**
- * @brief SDRAM Refresh error callback.
- * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains
- * the configuration information for SDRAM module.
- * @retval None
- */
- __weak void HAL_SDRAM_RefreshErrorCallback(SDRAM_HandleTypeDef *hsdram)
- {
- /* Prevent unused argument(s) compilation warning */
- UNUSED(hsdram);
- /* NOTE: This function Should not be modified, when the callback is needed,
- the HAL_SDRAM_RefreshErrorCallback could be implemented in the user file
- */
- }
- /**
- * @brief DMA transfer complete callback.
- * @param hdma pointer to a DMA_HandleTypeDef structure that contains
- * the configuration information for the specified DMA module.
- * @retval None
- */
- __weak void HAL_SDRAM_DMA_XferCpltCallback(DMA_HandleTypeDef *hdma)
- {
- /* Prevent unused argument(s) compilation warning */
- UNUSED(hdma);
- /* NOTE: This function Should not be modified, when the callback is needed,
- the HAL_SDRAM_DMA_XferCpltCallback could be implemented in the user file
- */
- }
- /**
- * @brief DMA transfer complete error callback.
- * @param hdma DMA handle
- * @retval None
- */
- __weak void HAL_SDRAM_DMA_XferErrorCallback(DMA_HandleTypeDef *hdma)
- {
- /* Prevent unused argument(s) compilation warning */
- UNUSED(hdma);
- /* NOTE: This function Should not be modified, when the callback is needed,
- the HAL_SDRAM_DMA_XferErrorCallback could be implemented in the user file
- */
- }
- /**
- * @}
- */
- /** @defgroup SDRAM_Exported_Functions_Group2 Input and Output functions
- * @brief Input Output and memory control functions
- *
- @verbatim
- ==============================================================================
- ##### SDRAM Input and Output functions #####
- ==============================================================================
- [..]
- This section provides functions allowing to use and control the SDRAM memory
-
- @endverbatim
- * @{
- */
- /**
- * @brief Reads 8-bit data buffer from the SDRAM memory.
- * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains
- * the configuration information for SDRAM module.
- * @param pAddress Pointer to read start address
- * @param pDstBuffer Pointer to destination buffer
- * @param BufferSize Size of the buffer to read from memory
- * @retval HAL status
- */
- HAL_StatusTypeDef HAL_SDRAM_Read_8b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint8_t *pDstBuffer, uint32_t BufferSize)
- {
- __IO uint8_t *pSdramAddress = (uint8_t *)pAddress;
-
- /* Process Locked */
- __HAL_LOCK(hsdram);
-
- /* Check the SDRAM controller state */
- if(hsdram->State == HAL_SDRAM_STATE_BUSY)
- {
- return HAL_BUSY;
- }
- else if(hsdram->State == HAL_SDRAM_STATE_PRECHARGED)
- {
- return HAL_ERROR;
- }
-
- /* Read data from source */
- for(; BufferSize != 0U; BufferSize--)
- {
- *pDstBuffer = *(__IO uint8_t *)pSdramAddress;
- pDstBuffer++;
- pSdramAddress++;
- }
-
- /* Process Unlocked */
- __HAL_UNLOCK(hsdram);
-
- return HAL_OK;
- }
-
- /**
- * @brief Writes 8-bit data buffer to SDRAM memory.
- * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains
- * the configuration information for SDRAM module.
- * @param pAddress Pointer to write start address
- * @param pSrcBuffer Pointer to source buffer to write
- * @param BufferSize Size of the buffer to write to memory
- * @retval HAL status
- */
- HAL_StatusTypeDef HAL_SDRAM_Write_8b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint8_t *pSrcBuffer, uint32_t BufferSize)
- {
- __IO uint8_t *pSdramAddress = (uint8_t *)pAddress;
- uint32_t tmp = 0U;
-
- /* Process Locked */
- __HAL_LOCK(hsdram);
-
- /* Check the SDRAM controller state */
- tmp = hsdram->State;
-
- if(tmp == HAL_SDRAM_STATE_BUSY)
- {
- return HAL_BUSY;
- }
- else if((tmp == HAL_SDRAM_STATE_PRECHARGED) || (tmp == HAL_SDRAM_STATE_WRITE_PROTECTED))
- {
- return HAL_ERROR;
- }
-
- /* Write data to memory */
- for(; BufferSize != 0U; BufferSize--)
- {
- *(__IO uint8_t *)pSdramAddress = *pSrcBuffer;
- pSrcBuffer++;
- pSdramAddress++;
- }
-
- /* Process Unlocked */
- __HAL_UNLOCK(hsdram);
-
- return HAL_OK;
- }
- /**
- * @brief Reads 16-bit data buffer from the SDRAM memory.
- * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains
- * the configuration information for SDRAM module.
- * @param pAddress Pointer to read start address
- * @param pDstBuffer Pointer to destination buffer
- * @param BufferSize Size of the buffer to read from memory
- * @retval HAL status
- */
- HAL_StatusTypeDef HAL_SDRAM_Read_16b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint16_t *pDstBuffer, uint32_t BufferSize)
- {
- __IO uint16_t *pSdramAddress = (uint16_t *)pAddress;
-
- /* Process Locked */
- __HAL_LOCK(hsdram);
-
- /* Check the SDRAM controller state */
- if(hsdram->State == HAL_SDRAM_STATE_BUSY)
- {
- return HAL_BUSY;
- }
- else if(hsdram->State == HAL_SDRAM_STATE_PRECHARGED)
- {
- return HAL_ERROR;
- }
-
- /* Read data from source */
- for(; BufferSize != 0U; BufferSize--)
- {
- *pDstBuffer = *(__IO uint16_t *)pSdramAddress;
- pDstBuffer++;
- pSdramAddress++;
- }
-
- /* Process Unlocked */
- __HAL_UNLOCK(hsdram);
-
- return HAL_OK;
- }
- /**
- * @brief Writes 16-bit data buffer to SDRAM memory.
- * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains
- * the configuration information for SDRAM module.
- * @param pAddress Pointer to write start address
- * @param pSrcBuffer Pointer to source buffer to write
- * @param BufferSize Size of the buffer to write to memory
- * @retval HAL status
- */
- HAL_StatusTypeDef HAL_SDRAM_Write_16b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint16_t *pSrcBuffer, uint32_t BufferSize)
- {
- __IO uint16_t *pSdramAddress = (uint16_t *)pAddress;
- uint32_t tmp = 0U;
-
- /* Process Locked */
- __HAL_LOCK(hsdram);
-
- /* Check the SDRAM controller state */
- tmp = hsdram->State;
-
- if(tmp == HAL_SDRAM_STATE_BUSY)
- {
- return HAL_BUSY;
- }
- else if((tmp == HAL_SDRAM_STATE_PRECHARGED) || (tmp == HAL_SDRAM_STATE_WRITE_PROTECTED))
- {
- return HAL_ERROR;
- }
-
- /* Write data to memory */
- for(; BufferSize != 0U; BufferSize--)
- {
- *(__IO uint16_t *)pSdramAddress = *pSrcBuffer;
- pSrcBuffer++;
- pSdramAddress++;
- }
-
- /* Process Unlocked */
- __HAL_UNLOCK(hsdram);
-
- return HAL_OK;
- }
- /**
- * @brief Reads 32-bit data buffer from the SDRAM memory.
- * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains
- * the configuration information for SDRAM module.
- * @param pAddress Pointer to read start address
- * @param pDstBuffer Pointer to destination buffer
- * @param BufferSize Size of the buffer to read from memory
- * @retval HAL status
- */
- HAL_StatusTypeDef HAL_SDRAM_Read_32b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint32_t *pDstBuffer, uint32_t BufferSize)
- {
- __IO uint32_t *pSdramAddress = (uint32_t *)pAddress;
-
- /* Process Locked */
- __HAL_LOCK(hsdram);
-
- /* Check the SDRAM controller state */
- if(hsdram->State == HAL_SDRAM_STATE_BUSY)
- {
- return HAL_BUSY;
- }
- else if(hsdram->State == HAL_SDRAM_STATE_PRECHARGED)
- {
- return HAL_ERROR;
- }
-
- /* Read data from source */
- for(; BufferSize != 0U; BufferSize--)
- {
- *pDstBuffer = *(__IO uint32_t *)pSdramAddress;
- pDstBuffer++;
- pSdramAddress++;
- }
-
- /* Process Unlocked */
- __HAL_UNLOCK(hsdram);
-
- return HAL_OK;
- }
- /**
- * @brief Writes 32-bit data buffer to SDRAM memory.
- * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains
- * the configuration information for SDRAM module.
- * @param pAddress Pointer to write start address
- * @param pSrcBuffer Pointer to source buffer to write
- * @param BufferSize Size of the buffer to write to memory
- * @retval HAL status
- */
- HAL_StatusTypeDef HAL_SDRAM_Write_32b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint32_t *pSrcBuffer, uint32_t BufferSize)
- {
- __IO uint32_t *pSdramAddress = (uint32_t *)pAddress;
- uint32_t tmp = 0U;
-
- /* Process Locked */
- __HAL_LOCK(hsdram);
-
- /* Check the SDRAM controller state */
- tmp = hsdram->State;
-
- if(tmp == HAL_SDRAM_STATE_BUSY)
- {
- return HAL_BUSY;
- }
- else if((tmp == HAL_SDRAM_STATE_PRECHARGED) || (tmp == HAL_SDRAM_STATE_WRITE_PROTECTED))
- {
- return HAL_ERROR;
- }
-
- /* Write data to memory */
- for(; BufferSize != 0U; BufferSize--)
- {
- *(__IO uint32_t *)pSdramAddress = *pSrcBuffer;
- pSrcBuffer++;
- pSdramAddress++;
- }
-
- /* Process Unlocked */
- __HAL_UNLOCK(hsdram);
-
- return HAL_OK;
- }
- /**
- * @brief Reads a Words data from the SDRAM memory using DMA transfer.
- * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains
- * the configuration information for SDRAM module.
- * @param pAddress Pointer to read start address
- * @param pDstBuffer Pointer to destination buffer
- * @param BufferSize Size of the buffer to read from memory
- * @retval HAL status
- */
- HAL_StatusTypeDef HAL_SDRAM_Read_DMA(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint32_t *pDstBuffer, uint32_t BufferSize)
- {
- uint32_t tmp = 0U;
-
- /* Process Locked */
- __HAL_LOCK(hsdram);
-
- /* Check the SDRAM controller state */
- tmp = hsdram->State;
-
- if(tmp == HAL_SDRAM_STATE_BUSY)
- {
- return HAL_BUSY;
- }
- else if(tmp == HAL_SDRAM_STATE_PRECHARGED)
- {
- return HAL_ERROR;
- }
-
- /* Configure DMA user callbacks */
- hsdram->hdma->XferCpltCallback = HAL_SDRAM_DMA_XferCpltCallback;
- hsdram->hdma->XferErrorCallback = HAL_SDRAM_DMA_XferErrorCallback;
-
- /* Enable the DMA Stream */
- HAL_DMA_Start_IT(hsdram->hdma, (uint32_t)pAddress, (uint32_t)pDstBuffer, (uint32_t)BufferSize);
-
- /* Process Unlocked */
- __HAL_UNLOCK(hsdram);
-
- return HAL_OK;
- }
- /**
- * @brief Writes a Words data buffer to SDRAM memory using DMA transfer.
- * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains
- * the configuration information for SDRAM module.
- * @param pAddress Pointer to write start address
- * @param pSrcBuffer Pointer to source buffer to write
- * @param BufferSize Size of the buffer to write to memory
- * @retval HAL status
- */
- HAL_StatusTypeDef HAL_SDRAM_Write_DMA(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint32_t *pSrcBuffer, uint32_t BufferSize)
- {
- uint32_t tmp = 0U;
-
- /* Process Locked */
- __HAL_LOCK(hsdram);
-
- /* Check the SDRAM controller state */
- tmp = hsdram->State;
-
- if(tmp == HAL_SDRAM_STATE_BUSY)
- {
- return HAL_BUSY;
- }
- else if((tmp == HAL_SDRAM_STATE_PRECHARGED) || (tmp == HAL_SDRAM_STATE_WRITE_PROTECTED))
- {
- return HAL_ERROR;
- }
-
- /* Configure DMA user callbacks */
- hsdram->hdma->XferCpltCallback = HAL_SDRAM_DMA_XferCpltCallback;
- hsdram->hdma->XferErrorCallback = HAL_SDRAM_DMA_XferErrorCallback;
-
- /* Enable the DMA Stream */
- HAL_DMA_Start_IT(hsdram->hdma, (uint32_t)pSrcBuffer, (uint32_t)pAddress, (uint32_t)BufferSize);
-
- /* Process Unlocked */
- __HAL_UNLOCK(hsdram);
-
- return HAL_OK;
- }
- #if (USE_HAL_SDRAM_REGISTER_CALLBACKS == 1)
- /**
- * @brief Register a User SDRAM Callback
- * To be used instead of the weak (surcharged) predefined callback
- * @param hsdram : SDRAM handle
- * @param CallbackId : ID of the callback to be registered
- * This parameter can be one of the following values:
- * @arg @ref HAL_SDRAM_MSP_INIT_CB_ID SDRAM MspInit callback ID
- * @arg @ref HAL_SDRAM_MSP_DEINIT_CB_ID SDRAM MspDeInit callback ID
- * @arg @ref HAL_SDRAM_REFRESH_ERR_CB_ID SDRAM Refresh Error callback ID
- * @param pCallback : pointer to the Callback function
- * @retval status
- */
- HAL_StatusTypeDef HAL_SDRAM_RegisterCallback (SDRAM_HandleTypeDef *hsdram, HAL_SDRAM_CallbackIDTypeDef CallbackId, pSDRAM_CallbackTypeDef pCallback)
- {
- HAL_StatusTypeDef status = HAL_OK;
- HAL_SDRAM_StateTypeDef state;
-
- if(pCallback == NULL)
- {
- return HAL_ERROR;
- }
- /* Process locked */
- __HAL_LOCK(hsdram);
-
- state = hsdram->State;
- if((state == HAL_SDRAM_STATE_READY) || (state == HAL_SDRAM_STATE_WRITE_PROTECTED))
- {
- switch (CallbackId)
- {
- case HAL_SDRAM_MSP_INIT_CB_ID :
- hsdram->MspInitCallback = pCallback;
- break;
- case HAL_SDRAM_MSP_DEINIT_CB_ID :
- hsdram->MspDeInitCallback = pCallback;
- break;
- case HAL_SDRAM_REFRESH_ERR_CB_ID :
- hsdram->RefreshErrorCallback = pCallback;
- break;
- default :
- /* update return status */
- status = HAL_ERROR;
- break;
- }
- }
- else if(hsdram->State == HAL_SDRAM_STATE_RESET)
- {
- switch (CallbackId)
- {
- case HAL_SDRAM_MSP_INIT_CB_ID :
- hsdram->MspInitCallback = pCallback;
- break;
- case HAL_SDRAM_MSP_DEINIT_CB_ID :
- hsdram->MspDeInitCallback = pCallback;
- break;
- default :
- /* update return status */
- status = HAL_ERROR;
- break;
- }
- }
- else
- {
- /* update return status */
- status = HAL_ERROR;
- }
- /* Release Lock */
- __HAL_UNLOCK(hsdram);
- return status;
- }
- /**
- * @brief Unregister a User SDRAM Callback
- * SDRAM Callback is redirected to the weak (surcharged) predefined callback
- * @param hsdram : SDRAM handle
- * @param CallbackId : ID of the callback to be unregistered
- * This parameter can be one of the following values:
- * @arg @ref HAL_SDRAM_MSP_INIT_CB_ID SDRAM MspInit callback ID
- * @arg @ref HAL_SDRAM_MSP_DEINIT_CB_ID SDRAM MspDeInit callback ID
- * @arg @ref HAL_SDRAM_REFRESH_ERR_CB_ID SDRAM Refresh Error callback ID
- * @arg @ref HAL_SDRAM_DMA_XFER_CPLT_CB_ID SDRAM DMA Xfer Complete callback ID
- * @arg @ref HAL_SDRAM_DMA_XFER_ERR_CB_ID SDRAM DMA Xfer Error callback ID
- * @retval status
- */
- HAL_StatusTypeDef HAL_SDRAM_UnRegisterCallback (SDRAM_HandleTypeDef *hsdram, HAL_SDRAM_CallbackIDTypeDef CallbackId)
- {
- HAL_StatusTypeDef status = HAL_OK;
- HAL_SDRAM_StateTypeDef state;
-
- /* Process locked */
- __HAL_LOCK(hsdram);
-
- state = hsdram->State;
- if((state == HAL_SDRAM_STATE_READY) || (state == HAL_SDRAM_STATE_WRITE_PROTECTED))
- {
- switch (CallbackId)
- {
- case HAL_SDRAM_MSP_INIT_CB_ID :
- hsdram->MspInitCallback = HAL_SDRAM_MspInit;
- break;
- case HAL_SDRAM_MSP_DEINIT_CB_ID :
- hsdram->MspDeInitCallback = HAL_SDRAM_MspDeInit;
- break;
- case HAL_SDRAM_REFRESH_ERR_CB_ID :
- hsdram->RefreshErrorCallback = HAL_SDRAM_RefreshErrorCallback;
- break;
- case HAL_SDRAM_DMA_XFER_CPLT_CB_ID :
- hsdram->DmaXferCpltCallback = HAL_SDRAM_DMA_XferCpltCallback;
- break;
- case HAL_SDRAM_DMA_XFER_ERR_CB_ID :
- hsdram->DmaXferErrorCallback = HAL_SDRAM_DMA_XferErrorCallback;
- break;
- default :
- /* update return status */
- status = HAL_ERROR;
- break;
- }
- }
- else if(hsdram->State == HAL_SDRAM_STATE_RESET)
- {
- switch (CallbackId)
- {
- case HAL_SDRAM_MSP_INIT_CB_ID :
- hsdram->MspInitCallback = HAL_SDRAM_MspInit;
- break;
- case HAL_SDRAM_MSP_DEINIT_CB_ID :
- hsdram->MspDeInitCallback = HAL_SDRAM_MspDeInit;
- break;
- default :
- /* update return status */
- status = HAL_ERROR;
- break;
- }
- }
- else
- {
- /* update return status */
- status = HAL_ERROR;
- }
- /* Release Lock */
- __HAL_UNLOCK(hsdram);
- return status;
- }
- /**
- * @brief Register a User SDRAM Callback for DMA transfers
- * To be used instead of the weak (surcharged) predefined callback
- * @param hsdram : SDRAM handle
- * @param CallbackId : ID of the callback to be registered
- * This parameter can be one of the following values:
- * @arg @ref HAL_SDRAM_DMA_XFER_CPLT_CB_ID SDRAM DMA Xfer Complete callback ID
- * @arg @ref HAL_SDRAM_DMA_XFER_ERR_CB_ID SDRAM DMA Xfer Error callback ID
- * @param pCallback : pointer to the Callback function
- * @retval status
- */
- HAL_StatusTypeDef HAL_SDRAM_RegisterDmaCallback(SDRAM_HandleTypeDef *hsdram, HAL_SDRAM_CallbackIDTypeDef CallbackId, pSDRAM_DmaCallbackTypeDef pCallback)
- {
- HAL_StatusTypeDef status = HAL_OK;
- HAL_SDRAM_StateTypeDef state;
-
- if(pCallback == NULL)
- {
- return HAL_ERROR;
- }
- /* Process locked */
- __HAL_LOCK(hsdram);
-
- state = hsdram->State;
- if((state == HAL_SDRAM_STATE_READY) || (state == HAL_SDRAM_STATE_WRITE_PROTECTED))
- {
- switch (CallbackId)
- {
- case HAL_SDRAM_DMA_XFER_CPLT_CB_ID :
- hsdram->DmaXferCpltCallback = pCallback;
- break;
- case HAL_SDRAM_DMA_XFER_ERR_CB_ID :
- hsdram->DmaXferErrorCallback = pCallback;
- break;
- default :
- /* update return status */
- status = HAL_ERROR;
- break;
- }
- }
- else
- {
- /* update return status */
- status = HAL_ERROR;
- }
- /* Release Lock */
- __HAL_UNLOCK(hsdram);
- return status;
- }
- #endif
- /**
- * @}
- */
-
- /** @defgroup SDRAM_Exported_Functions_Group3 Control functions
- * @brief management functions
- *
- @verbatim
- ==============================================================================
- ##### SDRAM Control functions #####
- ==============================================================================
- [..]
- This subsection provides a set of functions allowing to control dynamically
- the SDRAM interface.
- @endverbatim
- * @{
- */
- /**
- * @brief Enables dynamically SDRAM write protection.
- * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains
- * the configuration information for SDRAM module.
- * @retval HAL status
- */
- HAL_StatusTypeDef HAL_SDRAM_WriteProtection_Enable(SDRAM_HandleTypeDef *hsdram)
- {
- /* Check the SDRAM controller state */
- if(hsdram->State == HAL_SDRAM_STATE_BUSY)
- {
- return HAL_BUSY;
- }
-
- /* Update the SDRAM state */
- hsdram->State = HAL_SDRAM_STATE_BUSY;
-
- /* Enable write protection */
- FMC_SDRAM_WriteProtection_Enable(hsdram->Instance, hsdram->Init.SDBank);
-
- /* Update the SDRAM state */
- hsdram->State = HAL_SDRAM_STATE_WRITE_PROTECTED;
-
- return HAL_OK;
- }
- /**
- * @brief Disables dynamically SDRAM write protection.
- * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains
- * the configuration information for SDRAM module.
- * @retval HAL status
- */
- HAL_StatusTypeDef HAL_SDRAM_WriteProtection_Disable(SDRAM_HandleTypeDef *hsdram)
- {
- /* Check the SDRAM controller state */
- if(hsdram->State == HAL_SDRAM_STATE_BUSY)
- {
- return HAL_BUSY;
- }
-
- /* Update the SDRAM state */
- hsdram->State = HAL_SDRAM_STATE_BUSY;
-
- /* Disable write protection */
- FMC_SDRAM_WriteProtection_Disable(hsdram->Instance, hsdram->Init.SDBank);
-
- /* Update the SDRAM state */
- hsdram->State = HAL_SDRAM_STATE_READY;
-
- return HAL_OK;
- }
- /**
- * @brief Sends Command to the SDRAM bank.
- * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains
- * the configuration information for SDRAM module.
- * @param Command SDRAM command structure
- * @param Timeout Timeout duration
- * @retval HAL status
- */
- HAL_StatusTypeDef HAL_SDRAM_SendCommand(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command, uint32_t Timeout)
- {
- /* Check the SDRAM controller state */
- if(hsdram->State == HAL_SDRAM_STATE_BUSY)
- {
- return HAL_BUSY;
- }
-
- /* Update the SDRAM state */
- hsdram->State = HAL_SDRAM_STATE_BUSY;
-
- /* Send SDRAM command */
- FMC_SDRAM_SendCommand(hsdram->Instance, Command, Timeout);
-
- /* Update the SDRAM controller state */
- if(Command->CommandMode == FMC_SDRAM_CMD_PALL)
- {
- hsdram->State = HAL_SDRAM_STATE_PRECHARGED;
- }
- else
- {
- hsdram->State = HAL_SDRAM_STATE_READY;
- }
-
- return HAL_OK;
- }
- /**
- * @brief Programs the SDRAM Memory Refresh rate.
- * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains
- * the configuration information for SDRAM module.
- * @param RefreshRate The SDRAM refresh rate value
- * @retval HAL status
- */
- HAL_StatusTypeDef HAL_SDRAM_ProgramRefreshRate(SDRAM_HandleTypeDef *hsdram, uint32_t RefreshRate)
- {
- /* Check the SDRAM controller state */
- if(hsdram->State == HAL_SDRAM_STATE_BUSY)
- {
- return HAL_BUSY;
- }
-
- /* Update the SDRAM state */
- hsdram->State = HAL_SDRAM_STATE_BUSY;
-
- /* Program the refresh rate */
- FMC_SDRAM_ProgramRefreshRate(hsdram->Instance ,RefreshRate);
-
- /* Update the SDRAM state */
- hsdram->State = HAL_SDRAM_STATE_READY;
-
- return HAL_OK;
- }
- /**
- * @brief Sets the Number of consecutive SDRAM Memory auto Refresh commands.
- * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains
- * the configuration information for SDRAM module.
- * @param AutoRefreshNumber The SDRAM auto Refresh number
- * @retval HAL status
- */
- HAL_StatusTypeDef HAL_SDRAM_SetAutoRefreshNumber(SDRAM_HandleTypeDef *hsdram, uint32_t AutoRefreshNumber)
- {
- /* Check the SDRAM controller state */
- if(hsdram->State == HAL_SDRAM_STATE_BUSY)
- {
- return HAL_BUSY;
- }
-
- /* Update the SDRAM state */
- hsdram->State = HAL_SDRAM_STATE_BUSY;
-
- /* Set the Auto-Refresh number */
- FMC_SDRAM_SetAutoRefreshNumber(hsdram->Instance ,AutoRefreshNumber);
-
- /* Update the SDRAM state */
- hsdram->State = HAL_SDRAM_STATE_READY;
-
- return HAL_OK;
- }
- /**
- * @brief Returns the SDRAM memory current mode.
- * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains
- * the configuration information for SDRAM module.
- * @retval The SDRAM memory mode.
- */
- uint32_t HAL_SDRAM_GetModeStatus(SDRAM_HandleTypeDef *hsdram)
- {
- /* Return the SDRAM memory current mode */
- return(FMC_SDRAM_GetModeStatus(hsdram->Instance, hsdram->Init.SDBank));
- }
- /**
- * @}
- */
-
- /** @defgroup SDRAM_Exported_Functions_Group4 State functions
- * @brief Peripheral State functions
- *
- @verbatim
- ==============================================================================
- ##### SDRAM State functions #####
- ==============================================================================
- [..]
- This subsection permits to get in run-time the status of the SDRAM controller
- and the data flow.
- @endverbatim
- * @{
- */
- /**
- * @brief Returns the SDRAM state.
- * @param hsdram pointer to a SDRAM_HandleTypeDef structure that contains
- * the configuration information for SDRAM module.
- * @retval HAL state
- */
- HAL_SDRAM_StateTypeDef HAL_SDRAM_GetState(SDRAM_HandleTypeDef *hsdram)
- {
- return hsdram->State;
- }
- /**
- * @}
- */
- /**
- * @}
- */
- #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */
- #endif /* HAL_SDRAM_MODULE_ENABLED */
- /**
- * @}
- */
- /**
- * @}
- */
- /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|