STM32CubeIDE SRAM

随言:

单刀直入!看不懂就看后面的理论部分。

参考文档:

《AN2784 Application note Using the high-density STM32F10xxx FSMC peripheral to drive external memories.pdf》

下载链接:意法半导体STM | STM32/STM8微控制器 | MCU单片机

官方程序:

..\STM32Cube\Repository\STM32Cube_FW_F1_V1.8.0\Projects\STM3210E_EVAL\Examples\FSMC\FSMC_SRAM
 

本文源码:F407ZGSRAM.rar_srm32cubeidesdram-嵌入式文档类资源-CSDN下载

下面是理论

SRAM简介:

       静态随机存取存储器(Static Random-Access Memory,SRAM)是随机存取存储器的一种。所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。相对之下,动态随机存取存储器(DRAM)里面所储存的数据就需要周期性地更新。然而,当电力供应停止时,SRAM储存的数据还是会消失(被称为volatile memory),这与在断电后还能储存资料的ROM或闪存是不同的。 最重要的是SRAM成本比SDRAM高。

STM32F4  FSMC 之 SRAM控制器简介:

以下内容出自《STM32F4xx中文参考手册.PDF》

上图是:FSMC的SRAM引脚功能定义。

SRAM:分成4个块,每个块大小最大64MB,共256MB。

地址映射关系:由硬件决定NEx引脚决定了使用哪个块地址映射。

STM32如果SRAM是数据宽度是16位,那么STM32的地址将会右移一位对齐。

什么是扩展模式:

扩展模式即读时序和写时序不使用一个时序。原因就是有些芯片的读时序与写时序差异较大。

例如读时序比写时序快一倍,用同一个时序的话,那么读时序的速度就要降低到和写时序一样

慢。若使用扩展模式,读时序和写时序分开设置,这样能最大保证运行的效率。

不使用扩展模式的情况下,SRAM使用的时序是模式1.

使用扩展模块的情况下,SRAM可选择模式A D.

在SRAM写入数据的时候,数据建立时间DATAS要加1。包括模式1 模式A 模式D.

IS62WV51216BLL:

使用的是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)

分析SRAM读时序:

说一下比较重要的一些时序(看上图)

tRC(读周期时间):这是1个读周期地址线信号稳定(有效)后的保持时间,即1次读操作时间。

tAA(地址建立时间):MCU外部控制地址设置完成后,芯片内部获取(建立)地址的时间。

tDOE(数据建立时间):当读信号使能时,芯片输出稳定数据需要的时间。

tOHA:地址失效后数据还需稳定保持时间,主要用于保证数据正确性。

tACE1\tACE2:片选使能后到芯片输出稳定数据需要的时间。

tHZCS1\tHZCS2:片选失能后数据保持稳定时间。

分析SRAM写时序:

由于写时序有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:写信号或者片选信号失效后,数据的保持时间。

硬件:

STM32F407ZG + IS62WV51216BLL-55TLI(时序55ns)

SRAM挂在了bank1的第三个地址映射区,即SRAM的地址从0X68000000开始。

时序计算:

官方例程中芯片是STM32F1,SRAM配置计算如下:

由于我使用的是STM32F407ZG,则稍稍有些区别,计算过程:

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;

STM32CubeIDE配置:

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)
  {

  }
}

测试:

  全篇完。

本人是一个嵌入式未入门小白,博客仅仅代表我个人主观见解,记录成长笔记。
笔记是以最简单的方式,只展示最核心的原理。
若有与 大神大大 见解有歧义,我绝对坚信 大神大大 见解是对的,我的是错的。
若无积分等无法下载源码,可加入QQ群657407920下载交流经验。感谢~!

 

 

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值