SDRAM_Init初始化【 记录备忘】

//宏定义
#define BANK ((uint32_t)2) #define BUSRT_LENGTH_1 ((uint16_t)0x0000) #define BUSRT_LENGTH_2 ((uint16_t)0x0001) #define BUSRT_LENGTH_4 ((uint16_t)0x0002) #define BUSRT_LENGTH_8 ((uint16_t)0x0003) #define BUSRT_LENGTH_FULLPAGE ((uint16_t)0x0007) #define BUSRT_TYPE_SEQUENTIAL ((uint16_t)0x0000) #define BUSRT_TYPE_INTERLEAVED ((uint16_t)0x0008) #define LATENCY_MODE_CAS_2 ((uint16_t)0x0020) #define LATENCY_MODE_CAS_3 ((uint16_t)0x0030) #define OPERATING_MODE ((uint16_t)0x0000) #define WRITE_BURST_PROGRAMME ((uint16_t)0x0000) #define WRITE_BURST_SINGLE ((uint16_t)0x0200) #define REFRESH_RATE ((uint32_t)1600)

//部分初始化
  hsdram1.Instance = FMC_SDRAM_DEVICE;
  /* hsdram1.Init */
  hsdram1.Init.SDBank = FMC_SDRAM_BANK2;
  hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9;
  hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12;
  hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;
  hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
  hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_2;
  hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
  hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2;
  hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_DISABLE;
  hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1;
  /* SdramTiming */
  SdramTiming.LoadToActiveDelay = 2;
  SdramTiming.ExitSelfRefreshDelay = 8;
  SdramTiming.SelfRefreshTime = 5;
  SdramTiming.RowCycleDelay = 6;
  SdramTiming.WriteRecoveryTime = 3;
  SdramTiming.RPDelay = 2;
  SdramTiming.RCDDelay = 2;

 



static int SendCommand(uint32_t CommandMode, uint32_t Bank, uint32_t RefreshNum, uint32_t RegVal) //发送命令函数 { uint32_t CommandTarget; FMC_SDRAM_CommandTypeDef Command; if(Bank == 1) //bank选择 { CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; } if(Bank == 2) { CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; } Command.CommandMode = CommandMode; //command Command.CommandTarget = CommandTarget; //SDRAM bank1/2 Command.AutoRefreshNumber = RefreshNum; //连续发出的自动刷新命令数 Command.ModeRegisterDefinition = RegVal; if(HAL_SDRAM_SendCommand(&hsdram1, &Command, 0x1000) != HAL_OK) { return -1; } return 0; } void SDRAM_Init() //初始化 { uint32_t temp; SendCommand(FMC_SDRAM_CMD_CLK_ENABLE, BANK, 1, 0); //Start clock HAL_Delay(1); //At least 100 us SendCommand(FMC_SDRAM_CMD_PALL, BANK, 1, 0); //FMC SDRAM Command Mode SendCommand(FMC_SDRAM_CMD_AUTOREFRESH_MODE, BANK, 1, 0); temp = (uint32_t)(BUSRT_LENGTH_1 | BUSRT_TYPE_SEQUENTIAL | LATENCY_MODE_CAS_2 | OPERATING_MODE | WRITE_BURST_PROGRAMME); SendCommand(FMC_SDRAM_CMD_LOAD_MODE, BANK, 1, temp); HAL_SDRAM_ProgramRefreshRate(&hsdram1, REFRESH_RATE); }

 硬件参数配置(IS42/45S81600F)根据SDRAM的datasheet设置

 

posted @ 2022-02-28 16:17  妖岭  阅读(148)  评论(1)    收藏  举报