因为SDRAM是动态内存,也就是需要不断刷新才能保存数据,也就是存储体中的电容需要不断地刷新才能不会因为电容的自消耗而产生电位变化。这个我是理解的。但是又看到一句话:在刷新过程中,所有L-Bank都停止工作,而每次刷新所占用的时间为9个时钟周期,之后就可进入正常的工作状态,也就是说在这九个时钟周期内,所有工作指令只能等待而无法执行。那么问题来了,如果我就是在SDRAM自刷新的9个时钟周期间对其发送了命令,那怎么办?
根据我的理解:
因为电容数据的有效期为64ms,也就是说刷新整个SDRAM需要在64ms之内。而我们使用的SDRAM是8192行,所以刷新速率=64ms/8192行=7.81us/行。
SDRAM的时钟频率为96MHZ,那么也就是说,一个时钟周期为1/96M(s),也就是刷新一行的周期为7.81us/(1/96M)s = 750
但是原子却设置为750-20=730。我原先不明白,原来这个20个时钟周期就是提前刷新的周期,否则正正好好750个周期刷新,就有可能让电容数据失效。
也就是我们在初始化的时候向SDRAM设置它的刷新计数器为730,在CKE的为高的时候SDRAM为自动刷新模式。每过了730个时钟周期后就等待状态机为IDLE(空闲),就开始9个时钟周期的刷新。之后刷新计数器复位,且行计数器+1,下一次刷新就会去刷新下一行。
再刷新过程中,所有命令都要等待。
这样,就能够既能刷新又不影响工作了。但是再往细里深究仍有很多不明白的地方,我也是没有再继续深究下去,比如等待的时候还没有执行,而mcu认为成功了,切换为其他命令时那不就失败了吗?如果有明白的朋友不妨分享一下
2022/03/11更新:
有同学找我讨论:就是当想要读写的时候如果芯片正在刷新怎么办?是否需要人为控制SDRAM暂不执行刷新操作,或者查询是否处于刷新周期中?
我认为,RAM是自动刷新,如果还需要程序干预置标志位不是太影响效率了么。
实际上使用者只需要告诉SDRAM以多少个时钟周期进行刷新就好,不要让电容耗尽再充电。
SDRAM做好了刷新流程和响应命令的处理。我们不需要关心这个问题,实际在应用中,我也没出现过数据出错的情况。
每次只刷新一行,但是需要在64ms内做完一轮,因此需要看SDRAM有多少行,算出平均每行的间隔时间.
如果对你有帮助,请点赞收藏,谢谢~这是我更新的动力~
如果有任何问题欢迎在评论区交流~我们一同成长~