STM32 FSMC—扩展外部SRAM

一、SRAM简介及其扩张原因

静态随机存取存储器(Static Random Assess Memory,SRAM),其特性与其stm32芯片内存一致,属于易失性存储器,当掉电之后没存储器中的内容便会丢失。

TM32控制器芯片内部有一定大小的FLASH及SRAM,简单讲FLASH用来存储程序的,SRAM是用来存储运行程序中的中间变量。但是当程序较大、内存和程序空间不足时,就需要在stm32控制芯片的外部扩张存储器。

二、SRAM芯片

2.1 SRAM简介

本次使用的SRAM型号为:IS62WV51216BLL-55ns
其中:IS代表该芯片生产公司为ISSI,及芯成半导体有限公司;512表示该芯片内部为512K行存储单元,16表示每一行存储的数据长度为16Bits,因此可得该芯片的存储空间容量为512K*16Bits=1MB,55ns表示进行一次数据读写的最短时间要求。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

上图依次为型号为IS62WV51216BLL-55ns的SRAM芯片外观图、SRAM芯片的内部功能框架图、SRAM的存储矩阵图。

其中:
A0-A18为地址线,其作用在于当stm32芯片对扩张的SRAM芯片进行读写时,stm32芯片通过地址线传送行地址和列地址来找到对应的存储空间;19根地址线一共可以表示219=29x1024=512K行存储单元,所以它一共能访问512Kx16bits大小的空间。

I/O0-I/O15为数据传送引脚,0-7代表低字节,8-15代表高字节;

CS2与CS1#(#代表低电平有效)为片选信号;

OE#为读使能信号;WE#为写入使能;

UB#与LB#为数据掩码信号,当面对16Bits数据时,若只想改变高字节则UB信号设置为低电平,LB设置为高电平,同理若只想改变低字节则UB设置为高电平,LB设置为低电平。

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

2.2 SRAM读写时序

通讯方式:异步通讯,无须时钟,无须刷新
读写特性:直接通过地址,便可以访问存储器中的数据

2.2.1 读取数据时序图

对SRAM进行读取数据时,它各个信号线的时序流程如下:
在这里插入图片描述

SRAM进行读数据时,读取数据的时序要求:
在这里插入图片描述
其中主要的时间如下:(在后面对FSMC的时序联系时只有tRC、tAA、tDOE,故只需留意这三个时间量)

tRC指在读取一个数据时,地址信号线必须维持的时间,根据要求最少55ns,也就是说在读取数据的过程中,地址信号线必须维持维持55ns以上,可以理解为基础时间;

在地址信号有效后,片选信号CS1#、CS2开始有效,来选中所执行读取数据的SRAM芯片。

然后,掩码信号有效,来确定读取信号的形式(如高八位、低八位或者16位都进行读取)

接着,经过一段时间OE#信号使能,tDOE要求最大25ns,指当读使能信号OE#有效后,最多在25ns后,stm32芯片便可以在数据传输信号上采集SRAM数据,

同理tAA最大要求55ns,指当地址信号开始计时时,最多经过55ns时间,stm32芯片便可以在数据传输信号上采集SRAM数据。

2.2. 2 数据写入时序图

对SRAM进行写入数据时,它各个信号线的时序流程如下:

在这里插入图片描述

SRAM进行写入数据时,写入数据的时序要求:
在这里插入图片描述

其中主要的时间如下:(在后面对FSMC的时序联系时只有tWC、tPWE,故只需留意这两个时间量)

tWC指在写入一个数据时,地址信号线必须维持的时间,也就是说在写入数据的时间必须在这段时间内完成要求必须大于55ns,可以理解为基础时间;

在地址信号有效后,片选信号CS1#、CS2开始有效,来选中所执行写入数据的SRAM芯片。

然后,掩码信号有效,来确定读取信号的形式(如高八位、低八位或者16位都进行读取)

接着,经过一段时间WE#信号使能,tPWE要求必须大于45ns,指当写入使能信号WE#有效时,经过tPWE时间后,SRAM芯片便可以在数据传输信号上采集数据,

三、FSMC外设

3.1 FSMC简介

静态存储控制器(Flexible Static Memory Controller,FSMC)。它是STM322F1系列芯片中用于扩展外部存储器的一种外设。通过其名称便可以得知,FSMC外设仅能扩展无须刷新的存储器,比如SRAM、Nor Flash等,而不支持扩展如SDRAM之类需要动态刷新的存储器。

FSMC支持扩展的存储器 :包括SRAM、Nor Flash、Nand Flash以及PC卡。

FSMC支持的数据宽度:FSMC支持8-Bits或者16-Bits的数据宽度,但实际使用的数据宽度需要根据存储器的要求进行配置。而我们本次使用的存储器的数据宽度为16-Bits,所以也应该将FSMC的数据宽度配置为16-Bits。

3.2 FSMC内部剖析图

在这里插入图片描述

由上图可知:在利用FSMC扩展外部存储设备时,有一些引脚是不同类型的设备共用的,但有一些是独有的,所以应该按照本身使用的存储器类型进行配置。由于本次我们扩展的是外部SRAM,所以只需要使用到上图中黄色标记中的引脚即可。

FSMC的时钟配置:FSMC外设是直接与AHB总线连接的,根据STM32F1系列的时钟树,得知FSMC外设的时钟与系统时钟是相同的,以72MHz为例。

FSMC存储控制器:控制SRAM的有FSMC_BCR1/2/3/4控制寄存器、FSMC_BTR1/2/3/4片选时序寄存器以及FSMC_BWTR1/2/3/4写时序寄存器。每种寄存器都有4个,分别对应于4个不同的存储区域,各种寄存器介绍如下:
FSMC_BCR控制寄存器可配置要控制的存储器类型、数据线宽度以及信号有效极性能参数。
FMC_BTR时序寄存器用于配置SRAM访问时的各种时间延迟,如数据保持时间、地址保持时间等。
FMC_BWTR写时序寄存器与FMC_BTR寄存器控制的参数类似,它专门用于控制写时序的时间参数。

FSMC的存储空间映射:之所以扩展SRAM可以直接通过地址对SRAM中的数据进行读写,是因为STM32F1系列为FSMC外设预留了专门用于扩展外部存储器的内存空间,且该容量达到1GB,又为了满足扩张不同类型存储器的需求,STM32将其划分为4个BANK,具体如下:
在这里插入图片描述
STM32将1GB分为四个BANK,其中SRAM与Nor Flash使用的是Bank1区间,同时Bank1又被划分为四个子bank模块如下:
在这里插入图片描述

FSMC通讯引脚:

在这里插入图片描述

其中FSMC_NE:用于控制SRAM芯片的控制信号线,STM32具FSMC_NE1/2/3/4号引脚,不同的引脚对应Bank1中四个子Bank区间范围。

3.3 FSMC控制SRAM的时序

FSMC外设支持输出多种不同的时序以便于控制不同的存储器,它具有ABCD四种模式,下面我们仅针对控制SRAM使用的模式A进行讲解:

3.3.1 读时序

在这里插入图片描述

当内核发出访问某个指向外部存储器地址时,也就是当地址信号线开始时,FSMC外设会根据配置控制信号线产生时序访问存储器,上图中的是访问外部SRAM时FSMC外设的读时序。

该图表示一个存储器操作周期由地址建立周期(ADDSET+1)、数据建立周期(DATAST+1)以及2个HCLK周期组成。

在地址建立周期中,地址线发出要访问的地址,数据掩码信号线指示出要读取地址的高、低字节部分,片选信号使能存储器芯片;地址建立周期结束后读使能信号线发出读使能信号,接着存储器通过数据信号线把目标数据传输给FSMC,FSMC把它交给内核。

当使用FSMC扩展外部SRAM进行读时:
1、由于SRAM中t必须大于55ns,所以(ADDSET+1+DATAST+1+2)个HCLK的周期需要大于55ns。
2、在地址建立周期(ADDSET+1)结束后读使能信号有效,且SRAM是在OE#使能信号有效后tDOE最大25ns后进行读取信号,所以数据建立周期(DATAST+1)需大于25ns,才能保证在25ns后采取到有效的数据。
3、并且在内核发出访问信号后,地址信号线开始时,经过tAA时间,存储器通过数据信号线把目标数据传输给内核,所以地址建立周期(ADDSET+1)需要大于0ns。

3.3.2 写时序

在这里插入图片描述

当内核发出访问某个指向外部存储器地址时,也就是当地址线开始时,FSMC外设会根据配置控制信号线产生时序访问存储器,上图中的是访问外部SRAM时FSMC外设的写时序。

该图表示一个存储器操作周期由地址建立周期(ADDSET+1)、数据建立周期(DATAST+1)周期组成。

在地址建立周期中,地址线发出要访问的地址,数据掩码信号线指示出要读取地址的高、低字节部分,片选信号使能存储器芯片;地址建立周期结束后读使能信号线发出读使能信号,接着SRAM通过数据信号线采集内核要写入的数据。

当使用FSMC扩展外部SRAM进行写时:
1、由于SRAM中tWC必须大于55ns,所以(ADDSET+1+DATAST+1)个HCLK的周期需要大于55ns。
2、在地址建立周期(ADDSET+1)结束后写使能信号有效,且SRAM是在WE#使能信号有效后tPWE最小40ns后进行读取信号,所以数据建立周期(DATAST+1)至少需大于40ns,才能保证在40ns后,SRAM采取到有效的数据。
3、从图中可知,在内核发出访问信号后即确认地址时,便开始将WE#信号有效也可以,故地址建立周期(ADDSET+1)大于0ns。

四、相关结构体配置

4.1 GPIO引脚配置

将FSMC与SRAM之间使用的所有GPIO(44个引脚)进行配置,模式设置为复用推挽输出。

4.2 时序结构体

FSMC_NORSRAMTimingInitTypeDef
在这里插入图片描述扩展SRAM用到的:
FSMC_AddressSetupTime :本成员设置地址建立时间,它可以被设置为0-0xF个HCLK周期数,按STM32标准库的默认配置,HCLK的时钟频率为72MHz,即一个HCLK周期为1/72微秒。
FSMC_DataSetupTime :本成员设置数据建立时间,它可以被设置为0-0xF个HCLK周期数。
FSMC_AccessMode :本成员设置存储器访问模式,不同的模式下FSMC访问存储器地址时引脚输出的时序不一样,一般来说控制SRAM时使用A模式。

4.3 初始化结构体

FSMC_NORSRAMInitTypeDef
在这里插入图片描述

扩展SRAM用到的:
FSMC_Bank:本成员用于选择FSMC映射的存储区域(子bank模块的选择)
FSMC_MemoryType:本成员用于设置要控制的存储器类型,它支持控制的存储器类型为SRAM、PSRAM以及NOR FLASH
FSMC_MemoryDataWidth:本成员用于设置要控制的存储器的数据宽度,可选择设置成8或16位
FSMC_ExtendedMode:本成员用于设置是否使用扩展模式,在非扩展模式下,对存储器读写的时序都只使用FSMC_BCR寄存器中的配置,即下面的FSMC_ReadWriteTimingStruct结构体成员;在扩展模式下,对存储器的读写时序可以分开配置,读时序使用FSMC_BCR寄存器,写时序使用FSMC_BWTR寄存器的配置,即下面的FSMC_WriteTimingStruct结构体。
FSMC_ReadWriteTimingStruct:本成员是一个指针,赋值时使用上一小节中讲解的时序结构体FSMC_NORSRAMInitTypeDef设置,当不使用扩展模式时,读写时序都使用本成员的参数配置。
FSMC_WriteTimingStruct:本成员也是一个时序结构体的指针,只有当使用扩展模式时,本配置才有效,它是写操作使用的时序。

4.4 程序代码

//初始化GPIO
static void SRAM_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* 使能SRAM相关的GPIO时钟 */

                     /*地址信号线*/

RCC_APB2PeriphClockCmd(FSMC_A0_GPIO_CLK | FSMC_A1_GPIO_CLK | FSMC_A2_GPIO_CLK |
FSMC_A3_GPIO_CLK | FSMC_A4_GPIO_CLK | FSMC_A5_GPIO_CLK |
FSMC_A6_GPIO_CLK | FSMC_A7_GPIO_CLK | FSMC_A8_GPIO_CLK |
FSMC_A9_GPIO_CLK | FSMC_A10_GPIO_CLK| FSMC_A11_GPIO_CLK|
FSMC_A12_GPIO_CLK| FSMC_A13_GPIO_CLK|FSMC_A14_GPIO_CLK|
FSMC_A15_GPIO_CLK|FSMC_A16_GPIO_CLK|FSMC_A17_GPIO_CLK|FSMC_A18_GPIO_CLK|
/数据信号线/
FSMC_D0_GPIO_CLK | FSMC_D1_GPIO_CLK | FSMC_D2_GPIO_CLK |
FSMC_D3_GPIO_CLK | FSMC_D4_GPIO_CLK | FSMC_D5_GPIO_CLK |
FSMC_D6_GPIO_CLK | FSMC_D7_GPIO_CLK | FSMC_D8_GPIO_CLK |
FSMC_D9_GPIO_CLK | FSMC_D10_GPIO_CLK| FSMC_D11_GPIO_CLK|
FSMC_D12_GPIO_CLK| FSMC_D13_GPIO_CLK| FSMC_D14_GPIO_CLK|
FSMC_D15_GPIO_CLK|
/控制信号线/
FSMC_CS_GPIO_CLK | FSMC_WE_GPIO_CLK | FSMC_OE_GPIO_CLK |
FSMC_UDQM_GPIO_CLK|FSMC_LDQM_GPIO_CLK, ENABLE);

 /*-- GPIO 配置 -----------------------------------------------------*/

/* 通用 GPIO 配置 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //配置为复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

/A地址信号线 针对引脚配置/
GPIO_InitStructure.GPIO_Pin = FSMC_A0_GPIO_PIN;
GPIO_Init(FSMC_A0_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_A1_GPIO_PIN;
GPIO_Init(FSMC_A1_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_A2_GPIO_PIN;
GPIO_Init(FSMC_A2_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_A3_GPIO_PIN;
GPIO_Init(FSMC_A3_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_A4_GPIO_PIN;
GPIO_Init(FSMC_A4_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_A5_GPIO_PIN;
GPIO_Init(FSMC_A5_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_A6_GPIO_PIN;
GPIO_Init(FSMC_A6_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_A7_GPIO_PIN;
GPIO_Init(FSMC_A7_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_A8_GPIO_PIN;
GPIO_Init(FSMC_A8_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_A9_GPIO_PIN;
GPIO_Init(FSMC_A9_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_A10_GPIO_PIN;
GPIO_Init(FSMC_A10_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_A11_GPIO_PIN;
GPIO_Init(FSMC_A11_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_A12_GPIO_PIN; 

GPIO_Init(FSMC_A12_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_A13_GPIO_PIN;
GPIO_Init(FSMC_A13_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_A14_GPIO_PIN;
GPIO_Init(FSMC_A14_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_A15_GPIO_PIN;
GPIO_Init(FSMC_A15_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_A16_GPIO_PIN; 

GPIO_Init(FSMC_A16_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_A17_GPIO_PIN;
GPIO_Init(FSMC_A17_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_A18_GPIO_PIN;
GPIO_Init(FSMC_A18_GPIO_PORT, &GPIO_InitStructure);

/DQ数据信号线 针对引脚配置/
GPIO_InitStructure.GPIO_Pin = FSMC_D0_GPIO_PIN;
GPIO_Init(FSMC_D0_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_D1_GPIO_PIN;
GPIO_Init(FSMC_D1_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_D2_GPIO_PIN;
GPIO_Init(FSMC_D2_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_D3_GPIO_PIN;
GPIO_Init(FSMC_D3_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_D4_GPIO_PIN;
GPIO_Init(FSMC_D4_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_D5_GPIO_PIN;
GPIO_Init(FSMC_D5_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_D6_GPIO_PIN;
GPIO_Init(FSMC_D6_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_D7_GPIO_PIN;
GPIO_Init(FSMC_D7_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_D8_GPIO_PIN;
GPIO_Init(FSMC_D8_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_D9_GPIO_PIN;
GPIO_Init(FSMC_D9_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_D10_GPIO_PIN;
GPIO_Init(FSMC_D10_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_D11_GPIO_PIN;
GPIO_Init(FSMC_D11_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_D12_GPIO_PIN;
GPIO_Init(FSMC_D12_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_D13_GPIO_PIN;
GPIO_Init(FSMC_D13_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_D14_GPIO_PIN;
GPIO_Init(FSMC_D14_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_D15_GPIO_PIN;
GPIO_Init(FSMC_D15_GPIO_PORT, &GPIO_InitStructure);

/控制信号线/
GPIO_InitStructure.GPIO_Pin = FSMC_CS_GPIO_PIN;
GPIO_Init(FSMC_CS_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_WE_GPIO_PIN;
GPIO_Init(FSMC_WE_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_OE_GPIO_PIN;
GPIO_Init(FSMC_OE_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_UDQM_GPIO_PIN;
GPIO_Init(FSMC_UDQM_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_LDQM_GPIO_PIN;
GPIO_Init(FSMC_LDQM_GPIO_PORT, &GPIO_InitStructure);
}

//初始化FSMC模式
static void FSMC_ModeConfig(void)
{
FSMC_NORSRAMTimingInitTypeDef readTimInitStruct;
FSMC_NORSRAMTimingInitTypeDef writeTimInitStruct;
FSMC_NORSRAMInitTypeDef SRAMInitStruct;

//使能FSMC时钟
RCC_AHBPeriphClockCmd (RCC_AHBPeriph_FSMC ,ENABLE);

//读
readTimInitStruct.FSMC_AccessMode = FSMC_AccessMode_A;
readTimInitStruct.FSMC_AddressHoldTime = 0;//SRAM没用到
readTimInitStruct.FSMC_AddressSetupTime = 0; //理论值
readTimInitStruct.FSMC_BusTurnAroundDuration =0;//SRAM没用到
readTimInitStruct.FSMC_CLKDivision = 0;//SRAM没用到
readTimInitStruct.FSMC_DataLatency = 0;//SRAM没用到
readTimInitStruct.FSMC_DataSetupTime = 2; //2是经验值,理论值为1,后面再测试
	
//写
writeTimInitStruct.FSMC_AccessMode = FSMC_AccessMode_A;
writeTimInitStruct.FSMC_AddressHoldTime = 0;//SRAM没用到
writeTimInitStruct.FSMC_AddressSetupTime = 0; //理论值
writeTimInitStruct.FSMC_BusTurnAroundDuration =0;//SRAM没用到
writeTimInitStruct.FSMC_CLKDivision = 0;//SRAM没用到
writeTimInitStruct.FSMC_DataLatency = 0;//SRAM没用到
writeTimInitStruct.FSMC_DataSetupTime = 2; //2是理论值

//SRAM用到的
SRAMInitStruct.FSMC_Bank = FSMC_Bank1_NORSRAM3;
SRAMInitStruct.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; 
SRAMInitStruct.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
SRAMInitStruct.FSMC_MemoryType = FSMC_MemoryType_SRAM;

//SRAM没用到
SRAMInitStruct.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable ;
SRAMInitStruct.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable ;
SRAMInitStruct.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable ;
SRAMInitStruct.FSMC_WaitSignal =FSMC_WaitSignal_Disable ;
SRAMInitStruct.FSMC_WaitSignalActive =FSMC_WaitSignalActive_BeforeWaitState  ;
SRAMInitStruct.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low  ;
SRAMInitStruct.FSMC_WrapMode = FSMC_WrapMode_Disable;
SRAMInitStruct.FSMC_WriteBurst= FSMC_WriteBurst_Disable;
SRAMInitStruct.FSMC_WriteOperation= FSMC_WriteOperation_Enable;

//读写时序结构体
SRAMInitStruct.FSMC_ReadWriteTimingStruct = &readTimInitStruct;
SRAMInitStruct.FSMC_WriteTimingStruct =&writeTimInitStruct; //FSMC_ExtendedMode配置成Enable时有效

//把配置写入到寄存器
FSMC_NORSRAMInit(&SRAMInitStruct);
//使能FSMC
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3,ENABLE);

}

//SRAM初始化
void SRAM_Init(void)
{
SRAM_GPIO_Config();
FSMC_ModeConfig();
}

五、参考文献

1、【野火®】零死角玩转STM32—F103指南者

2、链接: https://blog.csdn.net/IssacMi/article/details/102529587?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&dist_request_id=1328769.227.16172699425740291&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值