单刀直入!看不懂就看后面的理论部分。
参考文档:
《AN2784 Application note Using the high-density STM32F10xxx FSMC peripheral to drive external memories.pdf》
下载链接:https://www.stmcu.org.cn/document/detail/index/id-200186
官方程序:
..\STM32Cube\Repository\STM32Cube_FW_F1_V1.8.0\Projects\STM3210E_EVAL\Examples\FSMC\FSMC_SRAM
本文源码:https://download.csdn.net/download/sudaroot/12567052
STM32F407ZG + IS62WV51216BLL-55TLI(时序55ns)
SRAM挂在了bank1的第三个地址映射区,即SRAM的地址从0X68000000开始。
HCLK = 168MHz
tHCLK = 1s / 168 MHZ = 6ns
t su(Data_NE) + t v(A_NE) = 2 * tHCLK + 25 = 37ns
因此,以下等式:
(ADDSET + (DATAST + 1)) × t HCLK >= max (t WC )
DATAST × t HCLK >= t PWE1
注意:如果使用不同读写时序,读写的都满足上面的公式,唯一不同的是在写时序
里面DATAST × t HCLK >= 的是写信号拉低时间,对应的读时序是>= 读信号拉低时间 。
使用同一时序,写时序比读时序长,故以时间长的为标准。
对于读取访问,DATASET必须验证:
DATAST >= (t AA + t su(Data_NE) + t v(A_NE) )/t HCLK – ADDSET – 4
结果得:
ADDSET = 5;
DATAST = 7;
Write operation:是否允许写入操作。FSMC 在存储区域内禁止了写入操作,如果进行写操作将报告 AHB 错误。
Address setup time in HCLK clock cycles: 即ADDSET, 等于5。
Data setup time in HCLK clock cycles: 即DATAST, 等于7。
Bus turn around time in HCLK clock cycles: :总线周转阶段的持续时间,即由 NEx 高电平变为 NEx 低电平最短时间,填1即可。
最后生成代码。
往外部SRAM前1024个字节写入0~1023,再读出数据并打印,看数据是否正确。
#define EX_SRAM_BASE 0X68000000
int main(void)
{
uint16_t i = 0;
uint16_t* temp = NULL;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_FSMC_Init();
printf("Sudaroot\r\n");
// 向外部SRAM前1024写入数据0 ~ 1023
temp = (uint16_t*)EX_SRAM_BASE;
for(i = 0; i < 1024; i++)
{
temp[i] = i;
}
// 把SRAM前1023数据读出并打印
temp = (uint16_t*)EX_SRAM_BASE;
for(i = 0; i < 1024; i++)
{
printf("temp[%d] = %d\r\n", i, temp[i]);
}
while (1)
{
}
}
测试:
静态随机存取存储器(Static Random-Access Memory,SRAM)是随机存取存储器的一种。所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。相对之下,动态随机存取存储器(DRAM)里面所储存的数据就需要周期性地更新。然而,当电力供应停止时,SRAM储存的数据还是会消失(被称为volatile memory),这与在断电后还能储存资料的ROM或闪存是不同的。 最重要的是SRAM成本比SDRAM高。
以下内容出自《STM32F4xx中文参考手册.PDF》
上图是:FSMC的SRAM引脚功能定义。
SRAM:分成4个块,每个块大小最大64MB,共256MB。
地址映射关系:由硬件决定NEx引脚决定了使用哪个块地址映射。
STM32如果SRAM是数据宽度是16位,那么STM32的地址将会右移一位对齐。
什么是扩展模式:
扩展模式即读时序和写时序不使用一个时序。原因就是有些芯片的读时序与写时序差异较大。
例如读时序比写时序快一倍,用同一个时序的话,那么读时序的速度就要降低到和写时序一样
慢。若使用扩展模式,读时序和写时序分开设置,这样能最大保证运行的效率。
不使用扩展模式的情况下,SRAM使用的时序是模式1.
使用扩展模块的情况下,SRAM可选择模式A D.
在SRAM写入数据的时候,数据建立时间DATAS要加1。包括模式1 模式A 模式D.
使用的是55ns时序的芯片,容量为512K * 16bit 即 1MB的SRAM.
A0-A18 :地址输入信号线。
I/O0-I/O15 :数据输出\输入信号线。
CS1, CS2 :芯片片选。CS1低电平使能,CS2高电平使能,。
OE :读数据信号使能,低电平有效。
WE :写数据信号使能,低电平有效。
LB: 低字节控制信号。l (I/O0-I/O7)
UB: 高字节控制信号。 (I/O8-I/O15)
说一下比较重要的一些时序(看上图)
tRC(读周期时间):这是1个读周期地址线信号稳定(有效)后的保持时间,即1次读操作时间。
tAA(地址建立时间):MCU外部控制地址设置完成后,芯片内部获取(建立)地址的时间。
tDOE(数据建立时间):当读信号使能时,芯片输出稳定数据需要的时间。
tOHA:地址失效后数据还需稳定保持时间,主要用于保证数据正确性。
tACE1\tACE2:片选使能后到芯片输出稳定数据需要的时间。
tHZCS1\tHZCS2:片选失能后数据保持稳定时间。
由于写时序有4种对应不用的控制时序:
1、WRITE CYCLE NO. 1 (1,2) (CS1 Controlled, OE = HIGH or LOW)
2、WRITE CYCLE NO. 2 (WE Controlled: OE is HIGH During Write Cycle)
3、WRITE CYCLE NO. 3 (WE Controlled: OE is LOW During Write Cycle)
4、WRITE CYCLE NO. 4 (UB/LB Controlled)
看FSMC SRAM的写时序 WE (写使能)拉低,OE(读使能)拉高,故选择第2种芯片时序。
tWC:(写周期时间)这是1个写周期地址线信号稳定(有效)后的保持时间,即1次写操作时间。
tAW:地址有效到数据有效时间。
tSA(地址建立时间):地址有效后WE写信号才能有效时间,芯片内部获取(建立)地址。
tPWE(数据建立时间):有效数据写入时间,即等待数据稳定时间。
tHA:写信号或者片选信号失效后,地址的保持时间。
tHD:写信号或者片选信号失效后,数据的保持时间。
全篇完。
本人是一个嵌入式未入门小白,博客仅仅代表我个人主观见解方便记录成长笔记。 若有与大神大大见解有冲突,我坚信大神大大见解是对的,我的是错的。 若无法下载源码,可私聊私发。 感谢~!