这是本文档旧的修订版!
银杏科技有限公司旗下技术文档发布平台 | |||
技术支持电话 | 0379-69926675-801 | ||
技术支持邮件 | Gingko@vip.163.com | ||
技术论坛 | http://www.eeschool.org | ||
版本 | 日期 | 作者 | 修改内容 |
---|---|---|---|
V1.0 | 2020-07-12 | gingko | 初次建立 |
int main(void) { int i,j; /* MCU 配置*/ /* 重置所有外设, 初始化Flash 接口和Systick. */ HAL_Init(); /* 系统时钟配置 */ SystemClock_Config(); /* 初始化所有已配置的外设 */ MX_GPIO_Init(); //SDRAM初始化 BSP_SDRAM_Init(); LED_BLUE_ON; //向SDRAM中写入0x5555并读取校验 for(i = 0;i < SDRAM_SIZE;i++){ write_sdram(i,0x5555); } for(i = 0;i < SDRAM_SIZE;i++){ if(0x5555 != read_sdram(i)){ while(1){ LED_RED_ON; HAL_Delay(500); LED_RED_OFF; HAL_Delay(500); } } } //向SDRAM中写入0xAAAA并读取校验 for(i = 0;i < SDRAM_SIZE;i++){ write_sdram(i,0xAAAA); } for(i = 0;i < SDRAM_SIZE;i++){ if(0xAAAA != read_sdram(i)){ while(1){ LED_RED_ON; HAL_Delay(500); LED_RED_OFF; HAL_Delay(500); } } } //向SDRAM中写入0x0000~0xFFFF并读取校验 for(j = 0; j < 256; j++){ for(i = 0;i < 65536;i++){ write_sdram((65536 * j + i),i); } } for(j = 0; j < 256; j ++){ for(i = 0;i < 65536;i++){ if(i != read_sdram((65536 * j + i))){ while(1){ LED_RED_ON; HAL_Delay(500); LED_RED_OFF; HAL_Delay(500); } } } } //测试成功 LED_BLUE_OFF; LED_GREEN_ON; while (1) { } }
uint8_t BSP_SDRAM_Init(void) { static uint8_t sdramstatus = SDRAM_ERROR; /* SDRAM设备配置 */ /* SDRAM时钟频率为100Mhz的定时配置(系统时钟最高为200Mhz) */ Timing.LoadToActiveDelay = 2; Timing.ExitSelfRefreshDelay = 7; Timing.SelfRefreshTime = 4; Timing.RowCycleDelay = 7; Timing.WriteRecoveryTime = 2; Timing.RPDelay = 2; Timing.RCDDelay = 2; sdramHandle.Init.SDBank = FMC_SDRAM_BANK1; sdramHandle.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9; sdramHandle.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13; sdramHandle.Init.MemoryDataWidth = SDRAM_MEMORY_WIDTH; sdramHandle.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4; sdramHandle.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3; sdramHandle.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE; sdramHandle.Init.SDClockPeriod = SDCLOCK_PERIOD; sdramHandle.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE; sdramHandle.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1; /* SDRAM控制器初始化 */ BSP_SDRAM_MspInit(&sdramHandle, NULL); /* __weak函数可以被应用程序重写*/ if(HAL_SDRAM_Init(&sdramHandle, &Timing) != HAL_OK) { sdramstatus = SDRAM_ERROR; } else { sdramstatus = SDRAM_OK; } /* SDRAM初始化顺序 */ BSP_SDRAM_Initialization_sequence(REFRESH_COUNT); return sdramstatus; }
#define SDRAM_SIZE SDRAM_DEVICE_SIZE #define write_sdram(offset,data) *(volatile unsigned short int *)(SDRAM_DEVICE_ADDR + (offset << 1)) = data #define read_sdram(offset) *(volatile unsigned short int *)(SDRAM_DEVICE_ADDR + (offset << 1))