SDRAM for DISCO_F746NG basic example

Dependencies:   BSP_DISCO_F746NG

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "stm32746g_discovery_sdram.h"
00003 
00004 #define BUFFER_SIZE         ((uint32_t)0x0100)
00005 #define WRITE_READ_ADDR     ((uint32_t)0x0800)
00006 
00007 void FillBuffer(uint32_t *pBuffer, uint32_t BufferLength, uint32_t Offset);
00008 uint8_t CompareBuffer(uint32_t *pBuffer1, uint32_t *pBuffer2, uint16_t BufferLength);
00009 
00010 int main()
00011 {
00012     uint32_t WriteBuffer[BUFFER_SIZE];
00013     uint32_t ReadBuffer[BUFFER_SIZE];
00014     FMC_SDRAM_CommandTypeDef SDRAMCommandStructure;
00015 
00016     printf("\n\nSDRAM demo started\n");
00017 
00018     BSP_SDRAM_Init();
00019 
00020     // Fill the write buffer
00021     FillBuffer(WriteBuffer, BUFFER_SIZE, 0xA244250F);
00022 
00023     // Write buffer
00024     BSP_SDRAM_WriteData(SDRAM_DEVICE_ADDR + WRITE_READ_ADDR, WriteBuffer, BUFFER_SIZE);
00025     printf("Write data DONE\n");
00026 
00027     // Issue self-refresh command to SDRAM device
00028     SDRAMCommandStructure.CommandMode            = FMC_SDRAM_CMD_SELFREFRESH_MODE;
00029     SDRAMCommandStructure.CommandTarget          = FMC_SDRAM_CMD_TARGET_BANK2;
00030     SDRAMCommandStructure.AutoRefreshNumber      = 1;
00031     SDRAMCommandStructure.ModeRegisterDefinition = 0;
00032     if (BSP_SDRAM_Sendcmd(&SDRAMCommandStructure) != HAL_OK) {
00033         error("BSP_SDRAM_Sendcmd FAILED\n");
00034     }
00035 
00036     // SDRAM memory read back access
00037     SDRAMCommandStructure.CommandMode = FMC_SDRAM_CMD_NORMAL_MODE;
00038     if (BSP_SDRAM_Sendcmd(&SDRAMCommandStructure) != HAL_OK) {
00039         error("BSP_SDRAM_Sendcmd FAILED\n");
00040     }
00041 
00042     // Read back data from the SDRAM memory
00043     BSP_SDRAM_ReadData(SDRAM_DEVICE_ADDR + WRITE_READ_ADDR, ReadBuffer, BUFFER_SIZE);
00044     printf("Read data DONE\n");
00045 
00046     // Checking data integrity
00047     if (CompareBuffer(WriteBuffer, ReadBuffer, BUFFER_SIZE) != 0) {
00048         printf("Write/Read buffers are different\n");
00049     } else {
00050         printf("Write/Read buffers are identical\n");
00051     }
00052 }
00053 
00054 /**
00055   * @brief  Fills buffer with user predefined data.
00056   * @param  pBuffer: pointer on the buffer to fill
00057   * @param  BufferLength: size of the buffer to fill
00058   * @param  Value: first value to fill on the buffer
00059   * @retval None
00060   */
00061 void FillBuffer(uint32_t *pBuffer, uint32_t BufferLength, uint32_t Value)
00062 {
00063     uint32_t tmpIndex = 0;
00064 
00065     /* Put in global buffer different values */
00066     for (tmpIndex = 0; tmpIndex < BufferLength; tmpIndex++) {
00067         pBuffer[tmpIndex] = tmpIndex + Value;
00068     }
00069 }
00070 
00071 /**
00072   * @brief  Compares two buffers.
00073   * @param  pBuffer1, pBuffer2: buffers to be compared.
00074   * @param  BufferLength: buffer's length
00075   * @retval 0: pBuffer2 identical to pBuffer1
00076   *         1: pBuffer2 differs from pBuffer1
00077   */
00078 uint8_t CompareBuffer(uint32_t *pBuffer1, uint32_t *pBuffer2, uint16_t BufferLength)
00079 {
00080     while (BufferLength--) {
00081         if (*pBuffer1 != *pBuffer2) {
00082             return 1;
00083         }
00084 
00085         pBuffer1++;
00086         pBuffer2++;
00087     }
00088 
00089     return 0;
00090 }