# 扩展SRAM ## ## 代码示例 语言:C 编译器:Keil5 stm32库:HAL-1.5.x 串口:UART1 ```C //sram.c #include "sram.h" #include "delay.h" ////////////////////////////////////////////////////////////////////////////////// //外部SRAM 驱动代码 //版本:V1.0 ////////////////////////////////////////////////////////////////////////////////// SRAM_HandleTypeDef SRAM_Handler; //SRAM句柄 //SRAM初始化 void SRAM_Init(void) { GPIO_InitTypeDef GPIO_Initure; FSMC_NORSRAM_TimingTypeDef FSMC_ReadWriteTim; __HAL_RCC_FSMC_CLK_ENABLE(); //使能FSMC时钟 __HAL_RCC_GPIOD_CLK_ENABLE(); //使能GPIOD时钟 __HAL_RCC_GPIOE_CLK_ENABLE(); //使能GPIOE时钟 __HAL_RCC_GPIOF_CLK_ENABLE(); //使能GPIOF时钟 __HAL_RCC_GPIOG_CLK_ENABLE(); //使能GPIOG时钟 //PD0,1,4,5,8~15 GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_8|\ GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|\ GPIO_PIN_14|GPIO_PIN_15; GPIO_Initure.Mode=GPIO_MODE_AF_PP; //推挽复用 GPIO_Initure.Pull=GPIO_PULLUP; //上拉 GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速 GPIO_Initure.Alternate=GPIO_AF12_FSMC; //复用为FSMC HAL_GPIO_Init(GPIOD,&GPIO_Initure); //PE0,1,7~15 GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|\ GPIO_PIN_10| GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|\ GPIO_PIN_15; HAL_GPIO_Init(GPIOE,&GPIO_Initure); //PF0~5,12~15 GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|\ GPIO_PIN_5|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; HAL_GPIO_Init(GPIOF,&GPIO_Initure); //PG0~5,10 GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_10; HAL_GPIO_Init(GPIOG,&GPIO_Initure); SRAM_Handler.Instance=FSMC_NORSRAM_DEVICE; SRAM_Handler.Extended=FSMC_NORSRAM_EXTENDED_DEVICE; SRAM_Handler.Init.NSBank=FSMC_NORSRAM_BANK3; //使用NE3 SRAM_Handler.Init.DataAddressMux=FSMC_DATA_ADDRESS_MUX_DISABLE; //地址/数据线不复用 SRAM_Handler.Init.MemoryType=FSMC_MEMORY_TYPE_SRAM; //SRAM SRAM_Handler.Init.MemoryDataWidth=FSMC_NORSRAM_MEM_BUS_WIDTH_16; //16位数据宽度 SRAM_Handler.Init.BurstAccessMode=FSMC_BURST_ACCESS_MODE_DISABLE; //是否使能突发访问,仅对同步突发存储器有效,此处未用到 SRAM_Handler.Init.WaitSignalPolarity=FSMC_WAIT_SIGNAL_POLARITY_LOW; //等待信号的极性,仅在突发模式访问下有用 SRAM_Handler.Init.WaitSignalActive=FSMC_WAIT_TIMING_BEFORE_WS; //存储器是在等待周期之前的一个时钟周期还是等待周期期间使能NWAIT SRAM_Handler.Init.WriteOperation=FSMC_WRITE_OPERATION_ENABLE; //存储器写使能 SRAM_Handler.Init.WaitSignal=FSMC_WAIT_SIGNAL_DISABLE; //等待使能位,此处未用到 SRAM_Handler.Init.ExtendedMode=FSMC_EXTENDED_MODE_DISABLE; //读写使用相同的时序 SRAM_Handler.Init.AsynchronousWait=FSMC_ASYNCHRONOUS_WAIT_DISABLE; //是否使能同步传输模式下的等待信号,此处未用到 SRAM_Handler.Init.WriteBurst=FSMC_WRITE_BURST_DISABLE; //禁止突发写 SRAM_Handler.Init.ContinuousClock=FSMC_CONTINUOUS_CLOCK_SYNC_ASYNC; //FMC读时序控制寄存器 FSMC_ReadWriteTim.AddressSetupTime=0x00; //地址建立时间(ADDSET)为0+1个HCLK FSMC_ReadWriteTim.AddressHoldTime=0x00; //地址保持时间(ADDHLD)模式A未用到 FSMC_ReadWriteTim.DataSetupTime=0x08; //数据保存时间为8+1个HCLK =6*8=48ns FSMC_ReadWriteTim.BusTurnAroundDuration=0X00; FSMC_ReadWriteTim.AccessMode=FSMC_ACCESS_MODE_A;//模式A HAL_SRAM_Init(&SRAM_Handler,&FSMC_ReadWriteTim,&FSMC_ReadWriteTim); } //在指定地址(WriteAddr+Bank1_SRAM3_ADDR)开始,连续写入n个字节. //pBuffer:字节指针 //WriteAddr:要写入的地址 //n:要写入的字节数 void FSMC_SRAM_WriteBuffer(u8 *pBuffer,u32 WriteAddr,u32 n) { for(;n!=0;n--) { *(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer; WriteAddr++; pBuffer++; } } //在指定地址((WriteAddr+Bank1_SRAM3_ADDR))开始,连续读出n个字节. //pBuffer:字节指针 //ReadAddr:要读出的起始地址 //n:要写入的字节数 void FSMC_SRAM_ReadBuffer(u8 *pBuffer,u32 ReadAddr,u32 n) { for(;n!=0;n--) { *pBuffer++=*(vu8*)(Bank1_SRAM3_ADDR+ReadAddr); ReadAddr++; } } ``` ```C sram.h #ifndef _SDRAM_H #define _SDRAM_H #include "sys.h" ////////////////////////////////////////////////////////////////////////////////// //外部SRAM 驱动代码 //版本:V1.0 ////////////////////////////////////////////////////////////////////////////////// extern SRAM_HandleTypeDef SRAM_Handler; //SRAM句柄 //使用NOR/SRAM的 Bank1.sector3,地址位HADDR[27,26]=10 //对IS61LV25616/IS62WV25616,地址线范围为A0~A17 //对IS61LV51216/IS62WV51216,地址线范围为A0~A18 #define Bank1_SRAM3_ADDR ((u32)(0x68000000)) void SRAM_Init(void); void FSMC_SRAM_WriteBuffer(u8 *pBuffer,u32 WriteAddr,u32 n); void FSMC_SRAM_ReadBuffer(u8 *pBuffer,u32 ReadAddr,u32 n); #endif ```