打印
[应用相关]

STM32硬件基础--FMC读写片外SDRAM

[复制链接]
1875|47
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
【海东青电子原创**,转载请注明出处: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例程

使用特权

评论回复
5
programmable|  楼主 | 2020-6-26 09:11 | 只看该作者
为了配置FMC,我们先采取一个偷懒的办法:对于ST官方的开发板,CUBEMX是可以自动配置板子上所有IP资源的,我们重点关心的是有关FMC的参数配置。新建一个CUBEMX项目,选择 STM32F746G-DISCO 板子:



使用特权

评论回复
6
programmable|  楼主 | 2020-6-26 09:14 | 只看该作者
弹出一个对话框,询问是否初始化板子上的所有硬件资源,选 Yes :

使用特权

评论回复
7
programmable|  楼主 | 2020-6-26 09:15 | 只看该作者
找到 FMC 项目,CUBEMX自动配置的参数如下:

使用特权

评论回复
8
programmable|  楼主 | 2020-6-26 09:15 | 只看该作者
赶紧拿个小本子把这些参数记录下来!一会儿我们自己配置FMC时,就要用到这些参数。顺便多说一句,看看上图中FMC的GPIO配置:

注意图五中的PC3这个pin,后面会说到它的问题,这里先卖个关子。

使用特权

评论回复
9
programmable|  楼主 | 2020-6-26 09:16 | 只看该作者
结合F746的芯片参考手册,来重点看看图四中的那些参数。FMC的结构如下:


使用特权

评论回复
10
programmable|  楼主 | 2020-6-26 09:17 | 只看该作者
图中可以看到,FMC包含了FSMC的功能,此外还支持SDRAM。对于SDRAM,支持2个“Bank”,这是2个物理Bank的意思,可以理解为FMC支持连接2个SDRAM芯片,MCU通过不同的片选信号SDNE0和SDNE1来选择具体使用哪个片外RAM:

使用特权

评论回复
11
programmable|  楼主 | 2020-6-26 09:18 | 只看该作者
我们板子上只有一个SDRAM芯片,它连接的是FMC的Bank1呢,还是Bank2呢?打开 STM32F746G-DISCO 板子的原理图找答案:

使用特权

评论回复
12
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 的文档:

使用特权

评论回复
13
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 的数据类型)。

使用特权

评论回复
14
programmable|  楼主 | 2020-6-26 09:20 | 只看该作者
再看图四下方的参数,重点讨论一下 CAS latency(SDRAM规范文档中的标识符为:CL),SDRAM文档中称为“读取潜伏期”,具体到 MT48LC4M32B2 这个芯片,CAS latency 的取值范围是这样规定的:

使用特权

评论回复
15
programmable|  楼主 | 2020-6-26 09:20 | 只看该作者
CL不能小于18ns,换算成SDRAM的CLK是多少呢?首先要看一下CUBEMX中配置的时钟频率:

使用特权

评论回复
16
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是放了一些余量。

使用特权

评论回复
17
programmable|  楼主 | 2020-6-26 09:21 | 只看该作者
图四最下面是SDRAM时序的参数,这里暂时先跳过,我们先按CUBEMX的参数,照猫画虎,自己动手配置FMC。新建一个CUBEMX项目,这次我们不选开发板、而是按选择芯片的方式新建项目:



使用特权

评论回复
18
programmable|  楼主 | 2020-6-26 09:22 | 只看该作者
为了方便调试,配置板子上的LED(PI口的PIN1):

使用特权

评论回复
19
programmable|  楼主 | 2020-6-26 09:23 | 只看该作者
重点是FMC:

使用特权

评论回复
20
programmable|  楼主 | 2020-6-26 09:23 | 只看该作者
重要的问题来了:我们来看看CUBEMX为FMC自动分配的IO管脚:

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

394

帖子

0

粉丝