maxtch 发表于 2018-1-2 13:08:54

STM32F417 如何设置 FSMC SRAM 时序

我自己焊了一片“正点原子 STM32F417 探索者”(买的 F407 探索者空板,套上一片 STM32F417ZGT6)这块板子有一片 IS62WV51216BLL-55TLI SRAM。我现在正在写 FSMC 初始化代码,想在代码里尽量压缩 SRAM 时序。请问我该关注 SRAM 手册里面的什么参数,如何从这些参数计算出 FSMC 的时序数值?请授人以渔,因为我还需要计算其它型号 SRAM 芯片的时序,譬如 IS61LV51216-10TLI。

wenyangzeng 发表于 2018-1-21 10:01:05

ST官方源代码可以参考:
SDRAM_Timing.LoadToActiveDelay    = 2;
SDRAM_Timing.ExitSelfRefreshDelay = 6;
SDRAM_Timing.SelfRefreshTime      = 4;
SDRAM_Timing.RowCycleDelay      = 6;
SDRAM_Timing.WriteRecoveryTime    = 2;
SDRAM_Timing.RPDelay            = 2;
SDRAM_Timing.RCDDelay             = 2;

hsdram.Init.SDBank             = FMC_SDRAM_BANK1;
hsdram.Init.ColumnBitsNumber   = FMC_SDRAM_COLUMN_BITS_NUM_8;
hsdram.Init.RowBitsNumber      = FMC_SDRAM_ROW_BITS_NUM_12;
hsdram.Init.MemoryDataWidth    = SDRAM_MEMORY_WIDTH;
hsdram.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
hsdram.Init.CASLatency         = FMC_SDRAM_CAS_LATENCY_3;
hsdram.Init.WriteProtection    = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
hsdram.Init.SDClockPeriod      = SDCLOCK_PERIOD;
hsdram.Init.ReadBurst          = FMC_SDRAM_RBURST_ENABLE;
hsdram.Init.ReadPipeDelay      = FMC_SDRAM_RPIPE_DELAY_0;

maxtch 发表于 2018-1-21 10:55:59

wenyangzeng 发表于 2018-1-21 10:01
ST官方源代码可以参考:
SDRAM_Timing.LoadToActiveDelay    = 2;
SDRAM_Timing.ExitSelfRefreshDelay = ...

这个代码用处不大啊:

其一,我用的是 SRAM 不是 SDRAM,时序参数都不对:我问的是 STM32 的 SRAM 时序参数怎么对应到 SRAM 数据手册里的参数。注意这里内存类型没有字母 D。
其二,我没有用 Cube 或 STL(代码太大且有暗病)而是直接操作寄存器,这些初始化结构体对我来说意义很有限。

wenyangzeng 发表于 2018-1-21 17:37:13

maxtch 发表于 2018-1-21 10:55
这个代码用处不大啊:

其一,我用的是 SRAM 不是 SDRAM,时序参数都不对:我问的是 STM32 的 SRAM 时序 ...

ST这个代码不知道对你有否帮助:


maxtch 发表于 2018-1-21 22:53:40

wenyangzeng 发表于 2018-1-21 17:37
ST这个代码不知道对你有否帮助:

这个是 QSPI,不是 FSMC……芯片也不对……Cube 的配置参数是直接对应寄存器的,不解决问题。

我好像把问题条件在标题里面讲的很明确:
* 涉及到的外设是 FSMC 的配置寄存器怎么对 SRAM 数据手册而不是 FMC 对 SDRAM 或 QSPI;
* 用的芯片是 STM32F417 不是 F7xx,那个没有 FMC 或 QSPI 支持。

两次回答怎么都答非所问了?

nyszx 发表于 2018-1-22 09:30:17

简单说就是要配置FSMC时序满足器件手册中要求的最低时序要求,比如IS62WV51216BLL-55TLI中,也就是要满足这些时序要求:
读时序

写时序

根据以上时序时间,有FSMC时钟计算出FSMC的对应时间:


nyszx 发表于 2018-1-22 09:31:44

如果楼主还不清楚怎么算,可以看看这个代码
/* Timing configuration for 90 MHz of SD clock frequency (180MHz/2) */
/* TMRD: 2 Clock cycles */
SDRAM_Timing.LoadToActiveDelay    = 2;
/* TXSR: min=70ns (6x11.90ns) */
SDRAM_Timing.ExitSelfRefreshDelay = 7;
/* TRAS: min=42ns (4x11.90ns) max=120k (ns) */
SDRAM_Timing.SelfRefreshTime      = 4;
/* TRC:min=63 (6x11.90ns) */      
SDRAM_Timing.RowCycleDelay      = 7;
/* TWR:2 Clock cycles */
SDRAM_Timing.WriteRecoveryTime    = 2;
/* TRP:15ns => 2x11.90ns */
SDRAM_Timing.RPDelay            = 2;
/* TRCD: 15ns => 2x11.90ns */
SDRAM_Timing.RCDDelay             = 2;

hsdram.Init.SDBank             = FMC_SDRAM_BANK2;
hsdram.Init.ColumnBitsNumber   = FMC_SDRAM_COLUMN_BITS_NUM_8;
hsdram.Init.RowBitsNumber      = FMC_SDRAM_ROW_BITS_NUM_12;
hsdram.Init.MemoryDataWidth    = SDRAM_MEMORY_WIDTH;
hsdram.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
hsdram.Init.CASLatency         = FMC_SDRAM_CAS_LATENCY_3;
hsdram.Init.WriteProtection    = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
hsdram.Init.SDClockPeriod      = SDCLOCK_PERIOD;
hsdram.Init.ReadBurst          = FMC_SDRAM_RBURST_DISABLE;
hsdram.Init.ReadPipeDelay      = FMC_SDRAM_RPIPE_DELAY_1;

nyszx 发表于 2018-1-22 09:34:28

满足器件手册中的时序min要求就值,就是最大能压缩到的时间,否则,再短,稳定性将无法保障。

maxtch 发表于 2018-1-22 16:22:58

nyszx 发表于 2018-1-22 09:31
如果楼主还不清楚怎么算,可以看看这个代码

这些寄存器看上去和 F407/F417 的很不一样啊。您选的芯片参数和 SRAM 数据手册对应的很好,但 F407/F417 的就只有四个时序参数且没有对应关系。

xmshao 发表于 2018-1-22 16:49:55

ST官方有个应用笔记 AN2784 ,里面有专门讲述。搜索不难得到。
页: [1]
查看完整版本: STM32F417 如何设置 FSMC SRAM 时序