SDRAM_Init初始化【 记录备忘】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | //宏定义<br>#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)<br><br>//部分初始化<br> hsdram1.Instance = FMC_SDRAM_DEVICE;<br> /* hsdram1.Init */<br> hsdram1.Init.SDBank = FMC_SDRAM_BANK2;<br> hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9;<br> hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12;<br> hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;<br> hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;<br> hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_2;<br> hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;<br> hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2;<br> hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_DISABLE;<br> hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1;<br> /* SdramTiming */<br> SdramTiming.LoadToActiveDelay = 2;<br> SdramTiming.ExitSelfRefreshDelay = 8;<br> SdramTiming.SelfRefreshTime = 5;<br> SdramTiming.RowCycleDelay = 6;<br> SdramTiming.WriteRecoveryTime = 3;<br> SdramTiming.RPDelay = 2;<br> SdramTiming.RCDDelay = 2; <br><br> 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设置
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)