最后实现SDRAM初始化的函数:
void SDRAM_Init(void)
{
uint32_t temp;
/* 1. 时钟使能命令 */
SDRAM_SendCommand(FMC_SDRAM_CMD_CLK_ENABLE, 1, 1, 0);
/* 2. 延时,至少100us */
HAL_Delay(1);
/* 3. SDRAM全部预充电命令 */
SDRAM_SendCommand(FMC_SDRAM_CMD_PALL, 1, 1, 0);
/* 4. 自动刷新命令 */
SDRAM_SendCommand(FMC_SDRAM_CMD_AUTOREFRESH_MODE, 1, 8, 0);
/* 5. 配置SDRAM模式寄存器 */
temp = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1 | //设置突发长度:1
SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL | //设置突发类型:连续
SDRAM_MODEREG_CAS_LATENCY_3 | //设置CL值:3
SDRAM_MODEREG_OPERATING_MODE_STANDARD | //设置操作模式:标准
SDRAM_MODEREG_WRITEBURST_MODE_SINGLE; //设置突发写模式:单点访问
SDRAM_SendCommand(FMC_SDRAM_CMD_LOAD_MODE, 1, 1, temp);
/* 6. 设置自刷新频率 */
/*
SDRAM refresh period / Number of rows)*SDRAM时钟速度 – 20
= 64000(64 ms) / 4096 *108MHz - 20
= 1667.5 取值1668
*/
HAL_SDRAM_ProgramRefreshRate(&hsdram1, 1668);
}
|