[应用相关] STM32硬件基础--FMC读写片外SDRAM

[复制链接]
 楼主| programmable 发表于 2020-6-26 09:07 | 显示全部楼层 |阅读模式
【海东青电子原创**,转载请注明出处:https://www.jianshu.com/p/506b0c696707
在前一篇**《STM32硬件基础--FSMC》中讨论了FSMC的基本用法,今天来说说FMC。虽然跟FSMC相比,FMC只是少了一个S,但应用难度可是大大增加了。对于连接片外RAM而言,FSMC接的是静态RAM,FMC接的是动态RAM,而控制动态RAM要复杂得多。举个例子:动态RAM需要不停地(周期性的)刷新,否则RAM中的数据就会丢失,这就产生了“管理”问题,如果用一个MCU来连接DRAM,二者之间交换的就不只是数据(SRAM就是如此)那么简单了,还包含有控制信息。这样,DRAM中除了存储数据的单元,还需要有寄存器(模式寄存器,后面将详述)、还得有个对DRAM的“初始化”过程!这么复杂,为什么还要用DRAM呢?用SRAM不就行了吗?DRAM容量大、便宜呀!所以,PC上那几个G的内存条,都是动态RAM类型的。



作者:海东青电子
链接:https://www.jianshu.com/p/506b0c696707
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 楼主| programmable 发表于 2020-6-26 09:07 | 显示全部楼层
STM32F746G-DISCO 板子上使用的是MICRON(美光)公司的 MT48LC4M32B2B5-6A SDRAM芯片。SDRAM,同步的动态RAM的意思。同步,就是需要一个片外时钟CLK信号,所有的读写操作都是跟着这个时钟信号走的,这就叫作“同步”。无疑,SDRAM 是本文中的男一号,是讨论的核心。我们的任务就是如何通过MCU来正确读写SDRAM中的数据。
 楼主| programmable 发表于 2020-6-26 09:09 | 显示全部楼层
遗憾的是,SDRAM所涉及的技术比较复杂,需要先了解一些SDRAM技术规范,推荐2个背景资料:

1、《高手进阶,终极内存技术指南》,讲解动态RAM的经典之作,初学者必看。了解基本概念即可。

2、《FMC—扩展外部 SDRAM》,一般性地介绍了SDRAM的基础知识,讲的比较清楚。(向技术博客的原作者致谢!)

 楼主| programmable 发表于 2020-6-26 09:10 | 显示全部楼层
上面这些背景资料只需要了解基本概念即可,下面将针对 STM32F746G-DISCO 板子一步步地说明驱动片外SDRAM的方法,包括:

1)使用STM32CUBEMX配置FMC;

2)初始化片外SDRAM;

3)周期性地刷新SDRAM;

4)写代码,通过指针、数组的方式读写片外RAM。

【完整的代码可从此处下载:STM32的FMC例程
 楼主| programmable 发表于 2020-6-26 09:11 | 显示全部楼层
为了配置FMC,我们先采取一个偷懒的办法:对于ST官方的开发板,CUBEMX是可以自动配置板子上所有IP资源的,我们重点关心的是有关FMC的参数配置。新建一个CUBEMX项目,选择 STM32F746G-DISCO 板子:

646465ef54b1d0ea1c.png

865785ef54b2833c63.png
 楼主| programmable 发表于 2020-6-26 09:14 | 显示全部楼层
弹出一个对话框,询问是否初始化板子上的所有硬件资源,选 Yes :
344185ef54b432af7f.png
 楼主| programmable 发表于 2020-6-26 09:15 | 显示全部楼层
找到 FMC 项目,CUBEMX自动配置的参数如下:
311055ef54bf627104.png
 楼主| programmable 发表于 2020-6-26 09:15 | 显示全部楼层
赶紧拿个小本子把这些参数记录下来!一会儿我们自己配置FMC时,就要用到这些参数。顺便多说一句,看看上图中FMC的GPIO配置:
57305ef54c3d6e89e.png
注意图五中的PC3这个pin,后面会说到它的问题,这里先卖个关子。
 楼主| programmable 发表于 2020-6-26 09:16 | 显示全部楼层
结合F746的芯片参考手册,来重点看看图四中的那些参数。FMC的结构如下:
158045ef54c625965e.png

987045ef54c701e13c.png
 楼主| programmable 发表于 2020-6-26 09:17 | 显示全部楼层
图中可以看到,FMC包含了FSMC的功能,此外还支持SDRAM。对于SDRAM,支持2个“Bank”,这是2个物理Bank的意思,可以理解为FMC支持连接2个SDRAM芯片,MCU通过不同的片选信号SDNE0和SDNE1来选择具体使用哪个片外RAM:

15575ef54c8d46426.png
 楼主| programmable 发表于 2020-6-26 09:18 | 显示全部楼层
我们板子上只有一个SDRAM芯片,它连接的是FMC的Bank1呢,还是Bank2呢?打开 STM32F746G-DISCO 板子的原理图找答案:
777785ef54ca84cb75.png
 楼主| programmable 发表于 2020-6-26 09:18 | 显示全部楼层
显然,使用的是SDNE0,那就是FMC的Bank1无疑了,图七中显示这个Bank内存的起始地址是 0xC000 0000 。这样,在图四的CUBEMX配置界面中,我们应选择的是 SDRAM 1(即Bank1),以及 SDCKE0+SDNE0。但,图四中的 Internal bank number 为什么要选 4 banks 呢?这是说SDRAM芯片的规格是内部有4个bank(即《高手进阶,终极内存技术指南》中说的L-BANK),打开芯片 MT48LC4M32B2 的文档:

141535ef54cf4ef53f.png
 楼主| programmable 发表于 2020-6-26 09:19 | 显示全部楼层
可见,内部是4个Bank,并且行地址为12-bit,列地址为8-bit,所以图四中的Address要设置成12bit。图四中的 Data 选项(在这里应该是FMC数据宽度的意思)需要特别说明一下:MT48LC4M32B2是32位宽的(一次可以读/写32-bit数据),这里为什么配置成了 16 bit 呢?再来看看开发板的原理图(上面图十),高16位数据线DQ16-DQ31接地、没有用到!---- 把这个SDRAM当16-bit的芯片来使用了(那不是浪费了一半的存储容量?确实如此!)。这是因为,STM32F746G-DISCO 板子跑 touchgfx 应用时,只支持16位色,所以16-bit的位宽够用了(对应的,编程时使用 uint16_t 的数据类型)。

 楼主| programmable 发表于 2020-6-26 09:20 | 显示全部楼层
再看图四下方的参数,重点讨论一下 CAS latency(SDRAM规范文档中的标识符为:CL),SDRAM文档中称为“读取潜伏期”,具体到 MT48LC4M32B2 这个芯片,CAS latency 的取值范围是这样规定的:

432595ef54d3e2df7e.png
 楼主| programmable 发表于 2020-6-26 09:20 | 显示全部楼层
CL不能小于18ns,换算成SDRAM的CLK是多少呢?首先要看一下CUBEMX中配置的时钟频率:
756945ef54d58e84b2.png
 楼主| programmable 发表于 2020-6-26 09:21 | 显示全部楼层
MCU的HCLK配置成了200MHz,图四中,SDRAM的CLK是HCLK/2(SDRAM common clock 为 2 HCLK clock cycles),即 100MHz,一个CLK是 1/100MHz == 10ns,即CL要大于1.8个CLK,取整后最小值为2。CUBEMX把CL配置成3是放了一些余量。
 楼主| programmable 发表于 2020-6-26 09:21 | 显示全部楼层
图四最下面是SDRAM时序的参数,这里暂时先跳过,我们先按CUBEMX的参数,照猫画虎,自己动手配置FMC。新建一个CUBEMX项目,这次我们不选开发板、而是按选择芯片的方式新建项目:
548465ef54d929ff8a.png
974235ef54d9cc06f4.png
696865ef54da6db052.png
609665ef54db0cf06e.png
 楼主| programmable 发表于 2020-6-26 09:22 | 显示全部楼层
为了方便调试,配置板子上的LED(PI口的PIN1):

468285ef54dca5c2c0.png
 楼主| programmable 发表于 2020-6-26 09:23 | 显示全部楼层
重点是FMC:
428095ef54df27c3a8.png
161175ef54dfe1a2f5.png
 楼主| programmable 发表于 2020-6-26 09:23 | 显示全部楼层
重要的问题来了:我们来看看CUBEMX为FMC自动分配的IO管脚:
957855ef54e1d680df.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

394

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部