STM32F769IDiscovery  1.00
uDANTE Audio Networking with STM32F7 DISCO board
stm32f7xx_hal_sdram.c
Go to the documentation of this file.
1 
93 /* Includes ------------------------------------------------------------------*/
94 #include "stm32f7xx_hal.h"
95 
104 #ifdef HAL_SDRAM_MODULE_ENABLED
105 
106 /* Private typedef -----------------------------------------------------------*/
107 /* Private define ------------------------------------------------------------*/
108 /* Private macro -------------------------------------------------------------*/
109 /* Private variables ---------------------------------------------------------*/
110 /* Private functions ---------------------------------------------------------*/
111 /* Exported functions --------------------------------------------------------*/
139 {
140  /* Check the SDRAM handle parameter */
141  if(hsdram == NULL)
142  {
143  return HAL_ERROR;
144  }
145 
146  if(hsdram->State == HAL_SDRAM_STATE_RESET)
147  {
148  /* Allocate lock resource and initialize it */
149  hsdram->Lock = HAL_UNLOCKED;
150  /* Initialize the low level hardware (MSP) */
151  HAL_SDRAM_MspInit(hsdram);
152  }
153 
154  /* Initialize the SDRAM controller state */
155  hsdram->State = HAL_SDRAM_STATE_BUSY;
156 
157  /* Initialize SDRAM control Interface */
158  FMC_SDRAM_Init(hsdram->Instance, &(hsdram->Init));
159 
160  /* Initialize SDRAM timing Interface */
161  FMC_SDRAM_Timing_Init(hsdram->Instance, Timing, hsdram->Init.SDBank);
162 
163  /* Update the SDRAM controller state */
164  hsdram->State = HAL_SDRAM_STATE_READY;
165 
166  return HAL_OK;
167 }
168 
176 {
177  /* Initialize the low level hardware (MSP) */
178  HAL_SDRAM_MspDeInit(hsdram);
179 
180  /* Configure the SDRAM registers with their reset values */
181  FMC_SDRAM_DeInit(hsdram->Instance, hsdram->Init.SDBank);
182 
183  /* Reset the SDRAM controller state */
184  hsdram->State = HAL_SDRAM_STATE_RESET;
185 
186  /* Release Lock */
187  __HAL_UNLOCK(hsdram);
188 
189  return HAL_OK;
190 }
191 
198 __weak void HAL_SDRAM_MspInit(SDRAM_HandleTypeDef *hsdram)
199 {
200  /* Prevent unused argument(s) compilation warning */
201  UNUSED(hsdram);
202 
203  /* NOTE: This function Should not be modified, when the callback is needed,
204  the HAL_SDRAM_MspInit could be implemented in the user file
205  */
206 }
207 
214 __weak void HAL_SDRAM_MspDeInit(SDRAM_HandleTypeDef *hsdram)
215 {
216  /* Prevent unused argument(s) compilation warning */
217  UNUSED(hsdram);
218 
219  /* NOTE: This function Should not be modified, when the callback is needed,
220  the HAL_SDRAM_MspDeInit could be implemented in the user file
221  */
222 }
223 
231 {
232  /* Check SDRAM interrupt Rising edge flag */
234  {
235  /* SDRAM refresh error interrupt callback */
237 
238  /* Clear SDRAM refresh error interrupt pending bit */
240  }
241 }
242 
250 {
251  /* Prevent unused argument(s) compilation warning */
252  UNUSED(hsdram);
253 
254  /* NOTE: This function Should not be modified, when the callback is needed,
255  the HAL_SDRAM_RefreshErrorCallback could be implemented in the user file
256  */
257 }
258 
266 {
267  /* Prevent unused argument(s) compilation warning */
268  UNUSED(hdma);
269 
270  /* NOTE: This function Should not be modified, when the callback is needed,
271  the HAL_SDRAM_DMA_XferCpltCallback could be implemented in the user file
272  */
273 }
274 
281 {
282  /* Prevent unused argument(s) compilation warning */
283  UNUSED(hdma);
284 
285  /* NOTE: This function Should not be modified, when the callback is needed,
286  the HAL_SDRAM_DMA_XferErrorCallback could be implemented in the user file
287  */
288 }
289 
317 HAL_StatusTypeDef HAL_SDRAM_Read_8b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint8_t *pDstBuffer, uint32_t BufferSize)
318 {
319  __IO uint8_t *pSdramAddress = (uint8_t *)pAddress;
320 
321  /* Process Locked */
322  __HAL_LOCK(hsdram);
323 
324  /* Check the SDRAM controller state */
325  if(hsdram->State == HAL_SDRAM_STATE_BUSY)
326  {
327  return HAL_BUSY;
328  }
329  else if(hsdram->State == HAL_SDRAM_STATE_PRECHARGED)
330  {
331  return HAL_ERROR;
332  }
333 
334  /* Read data from source */
335  for(; BufferSize != 0; BufferSize--)
336  {
337  *pDstBuffer = *(__IO uint8_t *)pSdramAddress;
338  pDstBuffer++;
339  pSdramAddress++;
340  }
341 
342  /* Process Unlocked */
343  __HAL_UNLOCK(hsdram);
344 
345  return HAL_OK;
346 }
347 
348 
358 HAL_StatusTypeDef HAL_SDRAM_Write_8b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint8_t *pSrcBuffer, uint32_t BufferSize)
359 {
360  __IO uint8_t *pSdramAddress = (uint8_t *)pAddress;
361  uint32_t tmp = 0;
362 
363  /* Process Locked */
364  __HAL_LOCK(hsdram);
365 
366  /* Check the SDRAM controller state */
367  tmp = hsdram->State;
368 
369  if(tmp == HAL_SDRAM_STATE_BUSY)
370  {
371  return HAL_BUSY;
372  }
373  else if((tmp == HAL_SDRAM_STATE_PRECHARGED) || (tmp == HAL_SDRAM_STATE_WRITE_PROTECTED))
374  {
375  return HAL_ERROR;
376  }
377 
378  /* Write data to memory */
379  for(; BufferSize != 0; BufferSize--)
380  {
381  *(__IO uint8_t *)pSdramAddress = *pSrcBuffer;
382  pSrcBuffer++;
383  pSdramAddress++;
384  }
385 
386  /* Process Unlocked */
387  __HAL_UNLOCK(hsdram);
388 
389  return HAL_OK;
390 }
391 
392 
402 HAL_StatusTypeDef HAL_SDRAM_Read_16b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint16_t *pDstBuffer, uint32_t BufferSize)
403 {
404  __IO uint16_t *pSdramAddress = (uint16_t *)pAddress;
405 
406  /* Process Locked */
407  __HAL_LOCK(hsdram);
408 
409  /* Check the SDRAM controller state */
410  if(hsdram->State == HAL_SDRAM_STATE_BUSY)
411  {
412  return HAL_BUSY;
413  }
414  else if(hsdram->State == HAL_SDRAM_STATE_PRECHARGED)
415  {
416  return HAL_ERROR;
417  }
418 
419  /* Read data from source */
420  for(; BufferSize != 0; BufferSize--)
421  {
422  *pDstBuffer = *(__IO uint16_t *)pSdramAddress;
423  pDstBuffer++;
424  pSdramAddress++;
425  }
426 
427  /* Process Unlocked */
428  __HAL_UNLOCK(hsdram);
429 
430  return HAL_OK;
431 }
432 
442 HAL_StatusTypeDef HAL_SDRAM_Write_16b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint16_t *pSrcBuffer, uint32_t BufferSize)
443 {
444  __IO uint16_t *pSdramAddress = (uint16_t *)pAddress;
445  uint32_t tmp = 0;
446 
447  /* Process Locked */
448  __HAL_LOCK(hsdram);
449 
450  /* Check the SDRAM controller state */
451  tmp = hsdram->State;
452 
453  if(tmp == HAL_SDRAM_STATE_BUSY)
454  {
455  return HAL_BUSY;
456  }
457  else if((tmp == HAL_SDRAM_STATE_PRECHARGED) || (tmp == HAL_SDRAM_STATE_WRITE_PROTECTED))
458  {
459  return HAL_ERROR;
460  }
461 
462  /* Write data to memory */
463  for(; BufferSize != 0; BufferSize--)
464  {
465  *(__IO uint16_t *)pSdramAddress = *pSrcBuffer;
466  pSrcBuffer++;
467  pSdramAddress++;
468  }
469 
470  /* Process Unlocked */
471  __HAL_UNLOCK(hsdram);
472 
473  return HAL_OK;
474 }
475 
485 HAL_StatusTypeDef HAL_SDRAM_Read_32b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint32_t *pDstBuffer, uint32_t BufferSize)
486 {
487  __IO uint32_t *pSdramAddress = (uint32_t *)pAddress;
488 
489  /* Process Locked */
490  __HAL_LOCK(hsdram);
491 
492  /* Check the SDRAM controller state */
493  if(hsdram->State == HAL_SDRAM_STATE_BUSY)
494  {
495  return HAL_BUSY;
496  }
497  else if(hsdram->State == HAL_SDRAM_STATE_PRECHARGED)
498  {
499  return HAL_ERROR;
500  }
501 
502  /* Read data from source */
503  for(; BufferSize != 0; BufferSize--)
504  {
505  *pDstBuffer = *(__IO uint32_t *)pSdramAddress;
506  pDstBuffer++;
507  pSdramAddress++;
508  }
509 
510  /* Process Unlocked */
511  __HAL_UNLOCK(hsdram);
512 
513  return HAL_OK;
514 }
515 
525 HAL_StatusTypeDef HAL_SDRAM_Write_32b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint32_t *pSrcBuffer, uint32_t BufferSize)
526 {
527  __IO uint32_t *pSdramAddress = (uint32_t *)pAddress;
528  uint32_t tmp = 0;
529 
530  /* Process Locked */
531  __HAL_LOCK(hsdram);
532 
533  /* Check the SDRAM controller state */
534  tmp = hsdram->State;
535 
536  if(tmp == HAL_SDRAM_STATE_BUSY)
537  {
538  return HAL_BUSY;
539  }
540  else if((tmp == HAL_SDRAM_STATE_PRECHARGED) || (tmp == HAL_SDRAM_STATE_WRITE_PROTECTED))
541  {
542  return HAL_ERROR;
543  }
544 
545  /* Write data to memory */
546  for(; BufferSize != 0; BufferSize--)
547  {
548  *(__IO uint32_t *)pSdramAddress = *pSrcBuffer;
549  pSrcBuffer++;
550  pSdramAddress++;
551  }
552 
553  /* Process Unlocked */
554  __HAL_UNLOCK(hsdram);
555 
556  return HAL_OK;
557 }
558 
568 HAL_StatusTypeDef HAL_SDRAM_Read_DMA(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint32_t *pDstBuffer, uint32_t BufferSize)
569 {
570  uint32_t tmp = 0;
571 
572  /* Process Locked */
573  __HAL_LOCK(hsdram);
574 
575  /* Check the SDRAM controller state */
576  tmp = hsdram->State;
577 
578  if(tmp == HAL_SDRAM_STATE_BUSY)
579  {
580  return HAL_BUSY;
581  }
582  else if(tmp == HAL_SDRAM_STATE_PRECHARGED)
583  {
584  return HAL_ERROR;
585  }
586 
587  /* Configure DMA user callbacks */
590 
591  /* Enable the DMA Stream */
592  HAL_DMA_Start_IT(hsdram->hdma, (uint32_t)pAddress, (uint32_t)pDstBuffer, (uint32_t)BufferSize);
593 
594  /* Process Unlocked */
595  __HAL_UNLOCK(hsdram);
596 
597  return HAL_OK;
598 }
599 
609 HAL_StatusTypeDef HAL_SDRAM_Write_DMA(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint32_t *pSrcBuffer, uint32_t BufferSize)
610 {
611  uint32_t tmp = 0;
612 
613  /* Process Locked */
614  __HAL_LOCK(hsdram);
615 
616  /* Check the SDRAM controller state */
617  tmp = hsdram->State;
618 
619  if(tmp == HAL_SDRAM_STATE_BUSY)
620  {
621  return HAL_BUSY;
622  }
623  else if((tmp == HAL_SDRAM_STATE_PRECHARGED) || (tmp == HAL_SDRAM_STATE_WRITE_PROTECTED))
624  {
625  return HAL_ERROR;
626  }
627 
628  /* Configure DMA user callbacks */
631 
632  /* Enable the DMA Stream */
633  HAL_DMA_Start_IT(hsdram->hdma, (uint32_t)pSrcBuffer, (uint32_t)pAddress, (uint32_t)BufferSize);
634 
635  /* Process Unlocked */
636  __HAL_UNLOCK(hsdram);
637 
638  return HAL_OK;
639 }
640 
667 {
668  /* Check the SDRAM controller state */
669  if(hsdram->State == HAL_SDRAM_STATE_BUSY)
670  {
671  return HAL_BUSY;
672  }
673 
674  /* Update the SDRAM state */
675  hsdram->State = HAL_SDRAM_STATE_BUSY;
676 
677  /* Enable write protection */
679 
680  /* Update the SDRAM state */
682 
683  return HAL_OK;
684 }
685 
693 {
694  /* Check the SDRAM controller state */
695  if(hsdram->State == HAL_SDRAM_STATE_BUSY)
696  {
697  return HAL_BUSY;
698  }
699 
700  /* Update the SDRAM state */
701  hsdram->State = HAL_SDRAM_STATE_BUSY;
702 
703  /* Disable write protection */
705 
706  /* Update the SDRAM state */
707  hsdram->State = HAL_SDRAM_STATE_READY;
708 
709  return HAL_OK;
710 }
711 
721 {
722  /* Check the SDRAM controller state */
723  if(hsdram->State == HAL_SDRAM_STATE_BUSY)
724  {
725  return HAL_BUSY;
726  }
727 
728  /* Update the SDRAM state */
729  hsdram->State = HAL_SDRAM_STATE_BUSY;
730 
731  /* Send SDRAM command */
732  FMC_SDRAM_SendCommand(hsdram->Instance, Command, Timeout);
733 
734  /* Update the SDRAM controller state state */
735  if(Command->CommandMode == FMC_SDRAM_CMD_PALL)
736  {
738  }
739  else
740  {
741  hsdram->State = HAL_SDRAM_STATE_READY;
742  }
743 
744  return HAL_OK;
745 }
746 
755 {
756  /* Check the SDRAM controller state */
757  if(hsdram->State == HAL_SDRAM_STATE_BUSY)
758  {
759  return HAL_BUSY;
760  }
761 
762  /* Update the SDRAM state */
763  hsdram->State = HAL_SDRAM_STATE_BUSY;
764 
765  /* Program the refresh rate */
766  FMC_SDRAM_ProgramRefreshRate(hsdram->Instance ,RefreshRate);
767 
768  /* Update the SDRAM state */
769  hsdram->State = HAL_SDRAM_STATE_READY;
770 
771  return HAL_OK;
772 }
773 
781 HAL_StatusTypeDef HAL_SDRAM_SetAutoRefreshNumber(SDRAM_HandleTypeDef *hsdram, uint32_t AutoRefreshNumber)
782 {
783  /* Check the SDRAM controller state */
784  if(hsdram->State == HAL_SDRAM_STATE_BUSY)
785  {
786  return HAL_BUSY;
787  }
788 
789  /* Update the SDRAM state */
790  hsdram->State = HAL_SDRAM_STATE_BUSY;
791 
792  /* Set the Auto-Refresh number */
793  FMC_SDRAM_SetAutoRefreshNumber(hsdram->Instance ,AutoRefreshNumber);
794 
795  /* Update the SDRAM state */
796  hsdram->State = HAL_SDRAM_STATE_READY;
797 
798  return HAL_OK;
799 }
800 
808 {
809  /* Return the SDRAM memory current mode */
810  return(FMC_SDRAM_GetModeStatus(hsdram->Instance, hsdram->Init.SDBank));
811 }
812 
839 {
840  return hsdram->State;
841 }
842 
850 #endif /* HAL_SDRAM_MODULE_ENABLED */
851 
859 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
void HAL_SDRAM_DMA_XferCpltCallback(DMA_HandleTypeDef *hdma)
uint32_t HAL_SDRAM_GetModeStatus(SDRAM_HandleTypeDef *hsdram)
HAL_SDRAM_StateTypeDef HAL_SDRAM_GetState(SDRAM_HandleTypeDef *hsdram)
FMC SDRAM Timing parameters structure definition.
HAL_StatusTypeDef HAL_SDRAM_WriteProtection_Disable(SDRAM_HandleTypeDef *hsdram)
#define __HAL_UNLOCK(__HANDLE__)
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
HAL_StatusTypeDef FMC_SDRAM_WriteProtection_Disable(FMC_SDRAM_TypeDef *Device, uint32_t Bank)
uint32_t FMC_SDRAM_GetModeStatus(FMC_SDRAM_TypeDef *Device, uint32_t Bank)
HAL_StatusTypeDef FMC_SDRAM_ProgramRefreshRate(FMC_SDRAM_TypeDef *Device, uint32_t RefreshRate)
HAL_StatusTypeDef FMC_SDRAM_SetAutoRefreshNumber(FMC_SDRAM_TypeDef *Device, uint32_t AutoRefreshNumber)
HAL_StatusTypeDef HAL_SDRAM_Write_DMA(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint32_t *pSrcBuffer, uint32_t BufferSize)
HAL_StatusTypeDef HAL_SDRAM_Read_32b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint32_t *pDstBuffer, uint32_t BufferSize)
HAL_SDRAM_StateTypeDef
HAL SDRAM State structure definition.
HAL_StatusTypeDef HAL_SDRAM_Write_32b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint32_t *pSrcBuffer, uint32_t BufferSize)
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
SDRAM command parameters structure definition.
#define __HAL_LOCK(__HANDLE__)
#define NULL
Definition: usbd_def.h:53
HAL_StatusTypeDef FMC_SDRAM_Timing_Init(FMC_SDRAM_TypeDef *Device, FMC_SDRAM_TimingTypeDef *Timing, uint32_t Bank)
SDRAM handle Structure definition.
#define __IO
Definition: core_cm0.h:213
HAL_StatusTypeDef HAL_SDRAM_DeInit(SDRAM_HandleTypeDef *hsdram)
__IO HAL_SDRAM_StateTypeDef State
HAL_StatusTypeDef FMC_SDRAM_Init(FMC_SDRAM_TypeDef *Device, FMC_SDRAM_InitTypeDef *Init)
HAL_StatusTypeDef FMC_SDRAM_SendCommand(FMC_SDRAM_TypeDef *Device, FMC_SDRAM_CommandTypeDef *Command, uint32_t Timeout)
HAL_StatusTypeDef HAL_SDRAM_Read_8b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint8_t *pDstBuffer, uint32_t BufferSize)
HAL_StatusTypeDef HAL_SDRAM_Write_16b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint16_t *pSrcBuffer, uint32_t BufferSize)
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef HAL_SDRAM_Write_8b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint8_t *pSrcBuffer, uint32_t BufferSize)
HAL_StatusTypeDef HAL_SDRAM_SetAutoRefreshNumber(SDRAM_HandleTypeDef *hsdram, uint32_t AutoRefreshNumber)
#define __FMC_SDRAM_GET_FLAG(__INSTANCE__, __FLAG__)
Get flag status of the SDRAM device.
DMA_HandleTypeDef * hdma
void HAL_SDRAM_MspInit(SDRAM_HandleTypeDef *hsdram)
void HAL_SDRAM_MspDeInit(SDRAM_HandleTypeDef *hsdram)
#define UNUSED(x)
HAL_StatusTypeDef HAL_SDRAM_Read_16b(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint16_t *pDstBuffer, uint32_t BufferSize)
HAL_StatusTypeDef FMC_SDRAM_WriteProtection_Enable(FMC_SDRAM_TypeDef *Device, uint32_t Bank)
FMC_SDRAM_TypeDef * Instance
void HAL_SDRAM_RefreshErrorCallback(SDRAM_HandleTypeDef *hsdram)
HAL_StatusTypeDef HAL_SDRAM_SendCommand(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command, uint32_t Timeout)
#define FMC_SDRAM_CMD_PALL
DMA handle Structure definition.
HAL_StatusTypeDef HAL_SDRAM_ProgramRefreshRate(SDRAM_HandleTypeDef *hsdram, uint32_t RefreshRate)
FMC_SDRAM_InitTypeDef Init
#define __FMC_SDRAM_CLEAR_FLAG(__INSTANCE__, __FLAG__)
Clear flag status of the SDRAM device.
void HAL_SDRAM_DMA_XferErrorCallback(DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef HAL_SDRAM_Init(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_TimingTypeDef *Timing)
#define FMC_SDRAM_FLAG_REFRESH_ERROR
HAL_StatusTypeDef HAL_SDRAM_WriteProtection_Enable(SDRAM_HandleTypeDef *hsdram)
void HAL_SDRAM_IRQHandler(SDRAM_HandleTypeDef *hsdram)
HAL_StatusTypeDef HAL_SDRAM_Read_DMA(SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint32_t *pDstBuffer, uint32_t BufferSize)
HAL_StatusTypeDef
HAL Status structures definition.
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef FMC_SDRAM_DeInit(FMC_SDRAM_TypeDef *Device, uint32_t Bank)
#define FMC_SDRAM_FLAG_REFRESH_IT