LV16-24-FSMC-01-外部SRAM基础

本文主要是STM32开发——外部SRAM的一些相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows windows11
Ubuntu Ubuntu16.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
SecureCRT Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日
开发板 正点原子 i.MX6ULL Linux阿尔法开发板
uboot NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03)
linux内核 linux-4.15(NXP官方提供)
STM32开发板 正点原子战舰V3(STM32F103ZET6)
点击查看本文参考资料
  • 通用
分类 网址说明
官方网站https://www.arm.com/ARM官方网站,在这里我们可以找到Cotex-Mx以及ARMVx的一些文档
https://www.st.com/content/st_com/zh.htmlST官方网站,在这里我们可以找到STM32的相关文档
https://www.stmcu.com.cn/意法半导体ST中文官方网站,在这里我们可以找到STM32的相关中文参考文档
http://elm-chan.org/fsw/ff/00index_e.htmlFatFs文件系统官网
教程书籍《ARM Cortex-M3权威指南》ARM公司专家Joseph Yiu(姚文祥)的力作,中文翻译是NXP的宋岩
《ARM Cortex-M0权威指南》
《ARM Cortex-M3与Cortex-M4权威指南》
开发论坛http://47.111.11.73/forum.php开源电子网,正点原子的资料下载及问题讨论论坛
https://www.firebbs.cn/forum.php国内Kinetis开发板-野火/秉火(刘火良)主持的论坛,现也做STM32和i.MX RT
https://www.amobbs.com/index.php阿莫(莫进明)主持的论坛,号称国内最早最火的电子论坛,以交流Atmel AVR系列单片机起家,现已拓展到嵌入式全平台,其STM32系列帖子有70W+。
http://download.100ask.net/index.html韦东山嵌入式资料中心,有些STM32和linux的相关资料也可以来这里找。
博客参考http://www.openedv.com/开源网-原子哥个人博客
http://blog.chinaaet.com/jihceng0622博主是原Freescale现NXP的现场应用工程师
cortex-m-resources这其实并不算是一个博客,这是ARM公司专家Joseph Yiu收集整理的所有对开发者有用的官方Cortex-M资料链接(也包含极少数外部资源链接)
  • STM32
STM32STM32 HAL库开发实战指南——基于F103系列开发板野火STM32开发教程在线文档
STM32库开发实战指南——基于野火霸道开发板野火STM32开发教程在线文档
  • SD卡
SD Association提供了SD存储卡和SDIO卡系统规范
点击查看相关文件下载
STM32F103xx英文数据手册STM32F103xC/D/E系列的英文数据手册
STM32F103xx中文数据手册STM32F103xC/D/E系列的中文数据手册
STM32F10xxx英文参考手册(RM0008)STM32F10xxx系列的英文参考手册
STM32F10xxx中文参考手册(RM0008)STM32F10xxx系列的中文参考手册
Arm Cortex-M3 处理器技术参考手册-英文版Cortex-M3技术参考手册-英文版
STM32F10xxx Cortex-M3编程手册-英文版(PM0056)STM32F10xxx/20xxx/21xxx/L1xxxx系列Cortex-M3编程手册-英文版
SD卡相关资料——最新版本有关SD卡的一些资料可以从这里下载
SD卡相关资料——历史版本有关SD卡的一些历史版本资料可以从这里下载,比如后边看的SD卡2.0协议
SD 2.0 协议标准完整版这是一篇关于SD卡2.0协议的中文文档,还是比较有参考价值的,可以一看

STM32F103ZET6 自带了 64K 字节的 SRAM,对一般应用来说,已经足够了,不过在一些对内存要求高的场合, STM32F1 自带的这些内存就不够用了。比如跑算法或者跑 GUI 等,就可能不太够用,所以战舰 STM32F103 板载了一颗 1M 字节容量的 SRAM 芯片: IS62WV51216,满足大内存使用的需求。 注意:笔记中有一些 # 表示低电平有效,知识横线不好打,就用#代替了。

一、为什么要扩展SRAM?

STM32控制器芯片内部有一定大小的SRAM及FLASH作为内存和程序存储空间,程序下载的时候是存放在内部的FLASH中的,在程序运行过程中,会有一些变量或者其他的东西存放在SRAM中运行,这就跟我们PC电脑上的内存一样。当程序较大,内存和程序空间不足时,就需要在STM32芯片的外部扩展存储器了。STM32F103ZE系列芯片可以扩展外部SRAM用作内存。

给STM32芯片扩展内存与给PC扩展内存的原理是一样的,只是PC上一般以内存条的形式扩展,而且内存条实质是由多个内存颗粒(即SDRAM芯片)组成的通用标准模块,而STM32扩展时,直接直接与SRAM芯片连接。

一、XM8A51216

1. 简介

XM8A51216 是深圳星忆存储科技有限公司(星忆存储 )生产的一颗 16 位宽 512K(512*16,即 1M 字节)容量的 CMOS 静态内存芯片。我们可以在这里找到它的芯片手册:。该芯片具有如下几个特点 :

(1)高速。 具有最高访问速度 10/12ns。

(2)低功耗。

(3)TTL 电平兼容。

(4)全静态操作。不需要刷新和时钟电路。

(5)三态输出。

(6)字节控制功能。支持高/低字节控制。

2. 功能框图

功能框图我们可以看 XM8A51216V33(8M).pdf (xingmem.com) 的 Logic Block Diagram:

image-20230503171345049

图中 A018 为地址线,总共 19 根地址线(即 2^19=512K, 1K=1024); DQ015 为数据线,总共 16 根数据线。 CEn 是芯片使能信号,低电平有效; OEn 是输出使能信号,低电平有效;WEn 是写使能信号,低电平有效; BLEn 和 BHEn 分别是高字节控制和低字节控制信号;

3. 与STM32接线

战舰 STM32F103 使用的是 TSOP44 封装的 XM8A51216 芯片,该芯片直接接在 STM32F1的 FSMC 上,

image-20230503171601115

从原理图可以看出, XM8A51216 同 STM32F1 的连接关系:

1
2
3
4
5
6
7
A[0:18]--->FMSC_A[0:18](不过顺序错乱了)
D[0:15]--->FSMC_D[0:15]
BHEn --->FSMC_NBL1
BLEn --->FSMC_NBL0
OEn --->FSMC_OE
WEn --->FSMC_WE
CEn --->FSMC_NE3

XM8A51216 的 A[0:18]并不是按顺序连接 STM32F1 的 FMSC_A[0:18],不过这并不影响我们正常使用外部 SRAM,因为地址具有唯一性。所以,只要地址线不和数据线混淆,就可以正常使用外部 SRAM。这样设计的好处,就是可以方便 PCB 布线。 什么事FSMC?我们后边再说。

二、IS62WV51216

为什么还有这个?因为教程中是XM8A51216,但是实际我使用的板子的芯片是 IS62WV51216。

1. 简介

IS62WV51216是ISSI(Integrated Silicon Solution, Inc)公司生产的一颗16位宽512K(512*16,即1M字节)容量的CMOS静态内存(SRAM)芯片。开发板上使用的完整的型号是 IS62WV51216BLL,它有以下特点:

(1)高速。具有45ns/55ns访问速度。

(2)低功耗。操作时:36mW;待机时:12uW。

(3)兼容TTL电平。

(4)全静态操作。不需要刷新和时钟电路。

(5)三态输出。

(6)字节控制功能。支持高/低字节控制。

2. 引脚说明

image-20230514155945480

各个引脚的说明如下图表(表中的#就表示图中的字母上方的横线,表示低电平有效):

信号线 类型 说明
A0-A18 I 地址输入
I/O0-I/O7 I/O 数据输入输出信号,低字节
I/O8-I/O15 I/O 数据输入输出信号,高字节
CS2 和CS1# I 片选信号,CS2高电平有效,CS1#低电平有效,部分芯片只有其中一个引脚
OE# I 输出使能信号,低电平有效
WE# I 写入使能信号,低电平有效
UB# I 数据掩码信号Upper Byte,高位字节允许访问,低电平有效,
LB# I 数据掩码信号Lower Byte,低位字节允许访问,低电平有效

SRAM的控制比较简单,只要控制信号线使能了访问,从地址线输入要访问的地址,即可从I/O数据线写入或读出数据。

3. 功能框图

功能框图我们可以看IS62WV51216BLL-datasheet的 FUNCTIONAL BLOCK DIAGRAM部分:

image-20230514160336545

3.1 ①存储器矩阵

SRAM的存储矩阵如下图所示:

image-20230514160607461

SRAM内部包含的存储阵列,可以把它理解成一张表格,数据就填在这张表格上。和表格查找一样,指定一个行地址和列地址,就可以精确地找到目标单元格,这是SRAM芯片寻址的基本原理。这样的每个单元格被称为存储单元,而这样的表则被称为存储矩阵

3.2 ②地址译码器、列I/O和I/O数据电路

image-20230514160336545

地址译码器把N根地址线转换成2N根信号线,每根信号线对应一行或一列存储单元,通过地址线找到具体的存储单元,实现寻址。如果存储阵列比较大,地址线会分成行和列地址,或者行、列分时复用同一地址总线,访问数据寻址时先用地址线传输行地址再传输列地址。

我们使用的这个的SRAM比较小,没有列地址线,它的数据宽度为16位,即一个行地址对应2字节空间,框图中左侧的A0-A18是行址信号(共19根),当有18根地址线一共可以表示$2^{18}=2^8*1024=512K$行存储单元,所以18根地址线一共能访问512Kx16bits大小的空间,一共就是512K*2B=1024KB=1MB,刚好就是1M字节的大小,所以其实实际上我们使用18根地址线就足够了。访问时,使用UB#或LB#线控制数据宽度。

我们每次给一个18位的地址,这会对应一个16位的数据空间,比如我们给了一个0地址,这个时候我们可以访问16位的数据:

地址 0~7位 8~15位
0 xxxx xxxx xxxx xxxx
1 xxxx xxxx xxxx xxxx

可以访问到第0字节和第1字节的数据,那么怎么确定访问的是第0字节还是第1字节呢?我们这个时候将这两个字节的07位看做低8位,对应I/O0I/O7,815位看做高8位,对应I/O8I/O15,然后通过UB#或LB#线来控制是要访问高位还是低位,UB#控制的是高字节的访问,LB#控制低字节的访问:

LB# UB# 有效的数据线
低电平 高电平 I/O0~I/O7,此时可访问低8位
高电平 低电平 I/O8~I/O15,此时可访问低8位
低电平 低电平 I/O0I/O7和I/O8I/O15均有效,可以访问16位数据
高电平 高电平 均无效,无法访问数据

3.3 ③控制电路

image-20230514162342000

控制电路主要包含了片选、读写使能以及上面提到的宽度控制信号UB#和LB#。利用CS2或CS1#片选信号,可以把多个SRAM芯片组成一个大容量的内存条。OE#和WE#可以控制读写使能,防止误操作。

访问时,使用 UB# 或 LB# 线控制数据宽度,例如,当要访问宽度为 16 位的数据时,使用行地址线指出地址,然后把 UB# 和 LB# 线都设置为低电平,那么 I/O0-I/O15 线都有效,它们一起输出该地址的 16 位数据 (或者接收 16 位数据到该地址);当要访问宽度为 8 位的数据时,使用行地址线指出地址,然后把UB# 或 LB# 其中一个设置为低电平,I/O 会对应输出该地址的高 8 位和低 8 位数据,因此它们被称为数据掩码信号。

3. 读写时序

注意,下边的时序图都是没有时钟线的,这也说明SRAM是通过异步通信的方式进行读写的。

3.1 读时序

image-20230514163912339

上图为IS62WV51216芯片的8080并口读时序,我们重点要关注的是:读周期时间(tRC)、地址建立时间(tAA)和OE建立时间(tDOE)。开发板使用55ns的IS62WV51216,tRC=55ns,tAA=55ns(Max),tDOE=25ns(Max):

image-20230514163937864

读时序过程:

(1)主机使用地址信号线发出要访问的存储器目标地址;

(2)控制片选信号CS1#及CS2#使能存储器芯片;

(3)控制读使能信号OE#表示要读数据;

(4)使用掩码信号LB#与UB#指示要访问目标地址的高、低字节部分;

(5)存储器会通过数据线向主机输出目标数据。

3.2 写时序

image-20230514164004262

上图为IS62WV51216芯片的8080并口写时序,我们重点要关注的是:读周期时间(tWC)、地址建立时间(tSA)和OE建立时间(tPWE)。开发板使用55ns的IS62WV51216,tWC=55ns,tSA=0ns,tPWE=45ns(min):

image-20230514164018470

写时序过程:

(1)主机使用地址信号线发出要访问的存储器目标地址;

(2)控制片选信号CS1#及CS2#使能存储器芯片;

(3)控制写使能信号WE#表示要写数据;

(4)使用掩码信号LB#与UB#指示要访问目标地址的高、低字节部分;

(5)使用数据线向存储器传输目标数据。

3.3 关键时间参数总结

时间参数 IS62WV51216BLL-55ns
型号要求的最短时间
说明
tRC 55ns 读操作周期
tAA 0ns 地址访问时间
tWC 55ns 写操作周期
tSA 0ns 地址建立时间
tSD 25ns 数据建立至写结束的时间
tHD 0ns 数据写结束后的保持时间

4. 与STM32接线

image-20230503175021794

理论上IS62WV51216与STM32的FSMC接线应该是这样的:

1
2
3
4
5
6
7
A[0:18]--->FMSC_A[0:18]
D[0:15]--->FSMC_D[0:15]
UB --->FSMC_NBL1
LB --->FSMC_NBL0
OE --->FSMC_OE
WE --->FSMC_WE
CS --->FSMC_NE3

实际上IS62WV51216 的 A[0:18]并不是按顺序连接 STM32F1 的 FMSC_A[0:18],不过这并不影响我们正常使用外部 SRAM,因为地址具有唯一性。所以,只要地址线不和数据线混淆,就可以正常使用外部 SRAM。这样设计的好处,就是可以方便 PCB 布线。

三、怎么驱动?

上边了解了那么多,那怎么使用SRAM呢?当然是通过STM32的FSMC来驱动啦,FSMC是啥?我们在下一篇笔记中学习。