FSMC扩展外部SRAM

一、型号

开发板:野火STM32F103ZET6;

外部SRAM:IS62WV51216;

二、硬件

 PIN脚说明:

A0~A18:输入;地址输入;

I/O0~I/O15:输入/输出;数据端;分高低字节

CS和CS1#:片选信号,CS高电平有效、CS1#低电平有效;部分SRAM只有一个信号

OE#:输出使能信号,低电平有效

WE#:写入使能。低电平有效。

UB#:数据掩码信号UpperByte,高位字节允许访问,低电平有效;

LB#数据掩码信号Lower Byte,低位字节允许访问,低电平有效;

SRAM空间矩阵

外部SRAM:IS62WV51216:512K*16bit(512K个16bit的数据)

当存储矩阵过大时,通过行地址和列地址寻址,但是次SRAM空间较小,通过行地址寻址就足够了

18根地址线:_{2}18=_{2}8*1024=512*1024个地址。

当需要写入时:写使能WE#拉低,写入地址、写入数据;读出时:读使能OE#拉低,写入地址,通过控制UB#和LB#控制读出数据高低位还是都读出。

读写外部SRAM流程

流程:

step1:主机使用地址信号发出要访问的目标地址。

step2:控制片选。

step3:控制使能。

step4:控制掩码。

step5:输出或者输出数据。

三、FSMC简介

FSMC,灵活额静态存储控制器。它可用于驱动包括SRAM、NOR、FLASH以及NANDFFLASH类型的存储器,不能驱动入SDRAM这种动态的存储器。FSMC外设挂在AHB总线上。

右侧为针对不同类型的存储器的控制硬件,针对与外部SRAM,本实验只需要:

FSMC_NBL[1:0]:对应SRAM掩码UB#、LB#信号。

FSMC_NWE:对应WE#写使能。

FSMC_NOE:对应OE#读使能。

FSMC_NE:对应CS、CS#片选。

注:

1、大部分的地址线占用GPIOF、GPIOG端口,因此在使用GPIO的时候需要复用。

2、STM32具有FSMC_NE1/2/3/4号引脚,不同的引脚对应不同的地址空间

存储器控制器

1、FSMC_BCR1/2/3/4控制寄存器:配置要控制的存储器类型、数据线宽度、信号有效极性等。

2、FSMC_BTR1/2/3/4片选时序寄存器:配置SRAM访问时的各种时间延迟,如数据保持时间等。

3、FSMC_BWTR1/2/3/4写时序寄存器:专门用于控制写时序的时间控制。

四、FSMC的地址映射

FSMC连接好外部的存储器并初始化后,可通过直接访问地址的方式来读写数据。与IIC、SPI不同,IIC、SPI都需要通过命令,发送地址以及数据实现读写功能,并且地址和数据都需要分开使用不同的变量存储。而FSMC外接存储器时,其存储单元是通过映射到STM32的内部寻址空间上的,可通过在程序中定义一个指向这些地址的指针,然后就可以通过读写指针直接修改该存储单元的内容,FSMC外设会自动完成数据的访问过程。

如图左侧为Cortex-M3内核的存储空间分布,右侧是对应的FSMC外设地址映射。其中右侧的地址映射每一个Bank内部分为四个小块,每个小块有相应的控制引脚连接片选信号:FSMC_NE[4:1]

读写时序

         以读时序为例,该图表示一个存储器操作周期由地址建立周期 (ADDSET)、数据建立周期
(DATAST) 以及 2 个 HCLK 周期组成。在地址建立周期中,地址线发出要访问的地址,数据掩
码信号线指示出要读取地址的高、低字节部分,片选信号使能存储器芯片;地址建立周期结束后
读使能信号线发出读使能信号,接着存储器通过数据信号线把目标数据传输给 FSMC,FSMC 把
它交给内核。
        写时序类似,区别是它的一个存储器操作周期仅由地址建立周期 (ADDSET) 和数据建立周期
(DATAST) 组成,且在数据建立周期期间写使能信号线发出写信号,接着 FSMC 把数据通过数
据线传输到存储器中。

五、软件

1、结构体

1.1 FSMC_NORSRAMTimingInitTypeDef  SRAM时序结构体

①、FSMC_A的dressSetupTime:地址建立时间,设置为0~0xF个HCLK周期数,HCLK的周期为72M,即一个HCLK的周期为1/72微秒。

②、FSMC_AddressHoldTime:地址保持时间,可以设置为0~0xF个HCLK周期数。

③、FSMC_DataSetupTime:数据建立时间,可以设置为0~0xF个HCLK周期数。

④、FSMC_BusTurnAroundDuration:设置总线转换周期,在NOR FLASH存储器中,地址线与数据线可以分时复用,指分时复用中间的延时,只用于NOR FLASH,其他存储器无效,置0即可。

⑤、FSMC_CLKDivision:设置时钟分频,以HCLK为时钟输入,经过分频后输出到FMSC_CLK引脚作为通讯使用的同步时钟。控制异步通讯的存储器时无效,置0即可。

⑥、FSMC_DataLatency:设置数据保持时间,表示在读取第一个数据之前要等待的周期数,该周期指同步时钟的周期,仅指NOR FLASH。

⑦、FSMC_AccessMode:设置存储器的访问模式,不同模式下的FSMC访问存储器地址时引脚的输出时序不同,可选FSMC_AccessMode_A/B/C/D模式。

 1.2 FSMC_NORSRAMInitTypeDefine  初始化结构体

 ①、FSMC_BANK:用于选择FSMC映射的存储区域

②、FSMC_DataAddressMux:设置地址总线与数据总线是否复用,在控制NORFLASH时,可以地址总线与数据总线分时复用。

③、FSMC_MemoryType:用于设置要控制的存储器类型,SRAM、PSRAM、NOR FLASH等。

④、FSMC_MemoryDataWidth:用于设置要控制的存储器的数据宽度,可设置成8位或者16位。

⑤、FSMC_BurstAccessMode:用于设置是否使用突发访问模式。突发访问模式是指发送一个地址后连续访问多个数据,非突发模式下每访问一个数据都需要输入一个地址,且仅在控制同步类型的存储器时才能使用突发模式。

⑥、FSMC_AsynchronousWait:设置是否使能在同步传输时使用等待信号,在控制同步类型的NOR 或 PSRAM时,存储器可以使用FSMC_NWAIT引脚通知STM32需要等待。

⑦、FSMC_WaitSignalPolarity:用于设置等待信号的有效极性,即要求等待时,是高电平还是低电平。

⑧、FSMC_WrapMode:用于设置是否支持把非对齐的AHB突发操作分割成2次线性操作。仅在突发模式下有效。

⑨、FSMC_WaitSignalActive:用于配置在突发传输模式时,决定存储器是在等待状态之前的一个数据周期有效还是在等待状态期间有效。

⑩、FSMC_WriteOperation:用于配置是否写使能,禁止写使能的话只能读数据。

⑪、FSMC_WaitSignal:用于设置当存储器处于突发传输模式时,是否允许通过NWAIT信号插入等待状态。

⑫、FSMC_ExtendedMode:本成员用于设置是否使用扩展模式,在非扩拓展模式下,对存储区读写的时序都只使用FSMC_BCR寄存器中的配置。

⑬、FSMC_ReadWriteTimingStruct:此成员为一个时序结构体指针,赋值时使用时序结构体FSMC_NORSRAMInitTypeDef设置,当不使用扩展模式时,读写时序都使用本成员的参数设置。

⑭、FSMC_WriteTimingStruct:此成员同样为一个时序结构体指针,只有当使用扩展模式时,配置有效。

 1.3 编程要点

        1.3.1 初始化目标引脚以及GPIO时钟
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(FSMC_A0_GPIO_CLK |FSMC_D0_GPIO_CLK |FSMC_CS_GPIO_CLK |                 
                       FSMC_WE_GPIO_CLK | FSMC_OE_GPIO_CLK 
                       |FSMC_UDQM_GPIO_CLK|FSMC_LDQM_GPIO_CLK, ENABLE);
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Pin = FSMC_A0_GPIO_PIN;
 GPIO_Init(FSMC_A0_GPIO_PORT, &GPIO_InitStructure);
 .
 .
 .
 . 
 .
        1.3.2 使能FSMC外设时钟。
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);
        1.3.3 配置FSMC SRAM的时序、工作模式。
 FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
 FSMC_NORSRAMTimingInitTypeDef readWriteTiming;
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);


 readWriteTiming.FSMC_AddressSetupTime = 0x00;
 readWriteTiming.FSMC_AddressHoldTime = 0x00;
 readWriteTiming.FSMC_DataSetupTime = 0x02;
 readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
.
.
.
.
.
.
        1.3.4 建立机制访问外部SRAM存储器。
uint32_t temp;
*( uint8_t*) (Bank1_SRAM3_ADDR ) = (uint8_t)0xAA;
 temp = *( uint8_t*) (Bank1_SRAM3_ADDR );

*( uint16_t*) (Bank1_SRAM3_ADDR +10 ) = (uint16_t)0xBBBB;
temp = *( uint16_t*) (Bank1_SRAM3_ADDR+10 );

*( uint32_t*) (Bank1_SRAM3_ADDR +20 ) = (uint32_t)0xCCCCCCCC;
 temp = *( uint32_t*) (Bank1_SRAM3_ADDR+20 );
        1.3.5 编写测试程序,对数据读写进行校验。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值