因为STM32F7可以跑到216MHz,但是FMC外设和F429是一样的,所以学习起来,还是没什么困难,他可以2分频或者3分频.其中2分频下,108MHz时钟,3分频下,72MHz时钟.整个初始化过程需要装填SDRAM_HandleTypeDef,FMC_SDRAM_TimingTypeDef和FMC_SDRAM_CommandTypeDef三个结构.
查阅手册:
可知ColumnBitsNumber对应表中的Column addressing,就是8个.RowBitsNumber对应表中的Row addressing,就是12个.本来根据Configuration表示,MemoryDataWidth应该是32的,但是ST并没有连接高16的地址线.所以是16位,InternalBankNumber对应Bank addressing,也就是4个.这些参数与时钟没什么关系.
然后要配置一些延迟(准确来说是时序,潜伏期),其中LoadToActiveDelay就是我们说的TMRD,我们芯片的速度是-6A,就是167MHz下延迟需要2CK,大概就是6ns*2=12ns,108MHz下约等于9ns一个时钟,所以两个CK(18ns)才能满足大于12ns.而72MHz下,13ns一个时钟,所以1个CK就能满足.而且这么看来,72MHz下反而更快.
而ExitSelfRefreshDelay就是TXSR,但是这里单位是ns,所以要换算换一下,67ns,在108MHz下,要8个时钟,72ns,在72MHz下,要6个时钟,78ns.此时108MHz下访问貌似较快.
然后SelfRefreshTime就是TRAS,这里给出最小值42ns,108MHz下要5CK(45ns),72MHz下是4CK(52ns).
然后查看RowCycleDelay,也就是TRC.起步要60ns,108MHz下要7CK(63ns),72MHz下是5CK(65ns).
接着是WriteRecoveryTime,就是TWR,上图也写着了,1CK+7ns,6ns+7ns=13ns,108MHz下要2CK,也就是18ns,72MHz刚好就1CK.
接着RPDelay就是TRP,也在上表,要求18ns,在108MHz刚好2CK,72MHz下2CK浪费了好多啊.RCDDelay是TRCD,和TRP参数的值一样,所以也就一样.
接着要根据手册设置CAS延迟.根据CAS是可编程的,我们设置为2.
其他配置不是什么难事,最重要是配置refresh rate.
所以SDRTR配置就很简单了,至于减20,是因为不要等过期了,才过来刷.
/* Step 8: Set the refresh rate counter */ /* (15.62 us x Freq) - 20 */ /* Set the device refresh counter */ hsdram->Instance->SDRTR |= ((uint32_t)((1292)<< 1));