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设置

 

posted @   妖岭  阅读(128)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示