|
|

楼主 |
发表于 2026-8-29 21:39:29
来自手机
|
显示全部楼层
eric2013 发表于 2026-8-29 14:15
SDRAM初始化配置的时候,中间不是有个延迟,你看下这个延迟正常执行没
void SDRAM_Init(void)
{
FMC_SDRAMInitTypeDef FMC_SDRAMInitStructure;
FMC_SDRAMTimingInitTypeDef FMC_SDRAMTimingInitStructure;
/* 配置FMC接口相关的 GPIO*/
SDRAM_GPIO_Config();
/* 使能 FMC 时钟 */
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FMC, ENABLE);
/* SDRAM时序结构体,根据SDRAM参数表配置----------------*/
/* SDCLK: 90 Mhz (HCLK/2 :180Mhz/2) 1个时钟周期Tsdclk =1/90MHz=11.11ns*/
/* TMRD: 2 Clock cycles */
FMC_SDRAMTimingInitStructure.FMC_LoadToActiveDelay = 2;
/* TXSR: min=70ns (7x11.11ns) */
FMC_SDRAMTimingInitStructure.FMC_ExitSelfRefreshDelay = 7;
/* TRAS: min=42ns (4x11.11ns) max=120k (ns) */
FMC_SDRAMTimingInitStructure.FMC_SelfRefreshTime = 4;
/* TRC: min=70 (7x11.11ns) */
FMC_SDRAMTimingInitStructure.FMC_RowCycleDelay = 7;
/* TWR: min=1+ 7ns (1+1x11.11ns) */
FMC_SDRAMTimingInitStructure.FMC_WriteRecoveryTime = 2;
/* TRP: 15ns => 2x11.11ns */
FMC_SDRAMTimingInitStructure.FMC_RPDelay = 2;
/* TRCD: 15ns => 2x11.11ns */
FMC_SDRAMTimingInitStructure.FMC_RCDDelay = 2;
/* FMC SDRAM 控制配置 */
/*选择存储区域*/
FMC_SDRAMInitStructure.FMC_Bank = FMC_Bank2_SDRAM;
/* 行地址线宽度: [8:0] */
FMC_SDRAMInitStructure.FMC_ColumnBitsNumber = FMC_ColumnBits_Number_9b;
/* 列地址线宽度: [12:0] */
FMC_SDRAMInitStructure.FMC_RowBitsNumber = FMC_RowBits_Number_13b;
/* 数据线宽度 */
FMC_SDRAMInitStructure.FMC_SDMemoryDataWidth = SDRAM_MEMORY_WIDTH;
/* SDRAM内部bank数量*/
FMC_SDRAMInitStructure.FMC_InternalBankNumber =FMC_InternalBank_Number_4;
/* CAS潜伏期 */
FMC_SDRAMInitStructure.FMC_CASLatency = FMC_CAS_Latency_2;
/* 禁止写保护*/
FMC_SDRAMInitStructure.FMC_WriteProtection =
FMC_Write_Protection_Disable;
/* SDCLK时钟分频因子,SDCLK = HCLK/SDCLOCK_PERIOD*/
FMC_SDRAMInitStructure.FMC_SDClockPeriod = FMC_SDClock_Period_2;
/* 突发读模式设置*/
FMC_SDRAMInitStructure.FMC_ReadBurst = FMC_Read_Burst_Enable;
/* 读延迟配置 */
FMC_SDRAMInitStructure.FMC_ReadPipeDelay = FMC_ReadPipe_Delay_0;
/* SDRAM时序参数 */
FMC_SDRAMInitStructure.FMC_SDRAMTimingStruct =&FMC_SDRAMTimingInitStructure;
/* 调用初始化函数,向寄存器写入配置 */
FMC_SDRAMInit(&FMC_SDRAMInitStructure);
/* 执行FMC SDRAM的初始化流程*/
SDRAM_InitSequence();
}
static void SDRAM_InitSequence(void)
{
FMC_SDRAMCommandTypeDef FMC_SDRAMCommandStructure;
uint32_t tmpr = 0;
/* Step 3 -----------------------------------------------*/
/* 配置命令:开启提供给SDRAM的时钟 */
FMC_SDRAMCommandStructure.FMC_CommandMode = FMC_Command_Mode_CLK_Enabled;
FMC_SDRAMCommandStructure.FMC_CommandTarget = FMC_COMMAND_TARGET_BANK;
FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 1;
FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = 0;
/* 检查SDRAM标志,等待至SDRAM空闲 */
while (FMC_GetFlagStatus(FMC_BANK_SDRAM, FMC_FLAG_Busy) != RESET);
/* 发送上述命令*/
FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStructure);
/* Step 4 ---------------------------------------------*/
/*延时 */
SDRAM_delay(10);
/* Step 5 -------------------------------------------*/
/* 配置命令:对所有的bank预充电 */
FMC_SDRAMCommandStructure.FMC_CommandMode = FMC_Command_Mode_PALL;
FMC_SDRAMCommandStructure.FMC_CommandTarget = FMC_COMMAND_TARGET_BANK;
FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 1;
FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = 0;
/* 检查SDRAM标志,等待至SDRAM空闲 */
while (FMC_GetFlagStatus(FMC_BANK_SDRAM, FMC_FLAG_Busy) != RESET);
/* 发送上述命令*/
FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStructure);
/* Step 6 --------------------------------------------*/
/* 配置命令:自动刷新 */
FMC_SDRAMCommandStructure.FMC_CommandMode = FMC_Command_Mode_AutoRefresh;
FMC_SDRAMCommandStructure.FMC_CommandTarget = FMC_COMMAND_TARGET_BANK;
FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 2;
FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = 0;
/* 检查SDRAM标志,等待至SDRAM空闲 */
while (FMC_GetFlagStatus(FMC_BANK_SDRAM, FMC_FLAG_Busy) != RESET);
/* 发送自动刷新命令*/
FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStructure);
/* Step 7 ----------------------------------------------*/
/* 设置sdram寄存器配置 */
tmpr = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_8 |
SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL |
SDRAM_MODEREG_CAS_LATENCY_2 |
SDRAM_MODEREG_OPERATING_MODE_STANDARD |
SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;
/* 配置命令:设置SDRAM寄存器 */
FMC_SDRAMCommandStructure.FMC_CommandMode = FMC_Command_Mode_LoadMode;
FMC_SDRAMCommandStructure.FMC_CommandTarget = FMC_COMMAND_TARGET_BANK;
FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 1;
FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = tmpr;
/* 检查SDRAM标志,等待至SDRAM空闲 */
while (FMC_GetFlagStatus(FMC_BANK_SDRAM, FMC_FLAG_Busy) != RESET);
/* 发送上述命令*/
FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStructure);
/* Step 8 --------------------------------------------*/
/* 设置刷新计数器 */
/*刷新速率 = (COUNT + 1) x SDRAM 频率时钟
COUNT =( SDRAM 刷新周期/行数) - 20*/
/* 64ms/8192=7.83us (7.83 us x FSDCLK) - 20 =683 */
FMC_SetRefreshCount(683);
/* 发送上述命令*/
while (FMC_GetFlagStatus(FMC_BANK_SDRAM, FMC_FLAG_Busy) != RESET);
}
这会儿手里没代码,这是从网上复制了一段,版主是指哪个时间呢? 再给指点指点?haldelay吗? 我在systeminit函数中开启了初始化fmc 在bsp函数中 又重新初始化了fmc
|
|