STM32F427利用FSMC接口访问FPGA的SRAM(3)—— STM32F427访问FPGA的SRAM

参考STM32F407例程,外部SRAM章节。

STM32F427利用FSMC接口访问FPGA的SRAM(3)—— STM32F427访问FPGA的SRAM_第1张图片

关于时序的配置,主要是设置这7个参数,如果是SRAM,则只需关注前3个参数,和最后一个参数。

根据F427 datasheet也可以看出,前3个参数均设为0x01。

STM32F427利用FSMC接口访问FPGA的SRAM(3)—— STM32F427访问FPGA的SRAM_第2张图片

 代码不一定对,先贴出来记录下

#include "sram.h"

#define Bank1_SRAM3_ADDR    ((u32)(0x68000000))	

//初始化外部SRAM
void FSMC_SRAM_Init(void)
{	
	GPIO_InitTypeDef  GPIO_InitStructure;
	FMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
	FMC_NORSRAMTimingInitTypeDef  readWriteTiming; 
	//使能PD,PE,PF,PG时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE); 
	//使能FMC时钟 
	RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FMC,ENABLE); 
    //PB7--FSMC_NL
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化  
	//PD0--FSMC_D2
	//PD1--FSMC_D3
	//PD3--FSMC_CLK
	//PD4--FSMC_NOE
	//PD5--FSMC_NWE
	//PD6--FSMC_NWAIT
	//PD8--FSMC_D13
	//PD9--FSMC_D14
	//PD10--FSMC_D5
	//PD11--FSMC_A16
	//PD12--FSMC_A17
	//PD13--FSMC_A18
	//PD14--FSMC_D0
	//PD15--FSMC_D1
	GPIO_InitStructure.GPIO_Pin = (0XFF7B);//0XFF7B==1111 1111 0111 1011
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化  
	//PE0--FSMC_NBL0
	//PE1--FSMC_NBL1
	//PE7--FSMC_D4
	//PE8--FSMC_D5
	//PE9--FSMC_D6
	//PE10--FSMC_D7
	//PE11--FSMC_D8
	//PE12--FSMC_D9
	//PE13--FSMC_D10
	//PE14--FSMC_D11
	//PE15--FSMC_D12
	GPIO_InitStructure.GPIO_Pin = (0XFF83);//0XFF83==1111 1111 1000 0011
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化  
	//PF0--FSMC_A0
	//PF1--FSMC_A1
	//PF2--FSMC_A2
	//PF3--FSMC_A3
	//PF4--FSMC_A4
	//PF5--FSMC_A5
	//PF12--FSMC_A6
	//PF13--FSMC_A7
	//PF14--FSMC_A8
	//PF15--FSMC_A9
 	GPIO_InitStructure.GPIO_Pin = (0XF03F);//0XF03F==1111 0000 0011 1111
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化  
	//PG0--FSMC_A10
	//PG1--FSMC_A11
	//PG2--FSMC_A12
	//PG3--FSMC_A13
	//PG4--FSMC_A14
	//PG5--FSMC_A15
	//PG6--FSMC_INT0
	//PG7--FSMC_INT1
	//PG10--FSMC_NE3
	GPIO_InitStructure.GPIO_Pin =(0X04FF);//0X04FF==0000 0100 1111 1111
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化 
    //ALL PINS SET TO AF12 MODE(GPIO_AF_FMC)
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_FMC);//PB7
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FMC);//PD0
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource3,GPIO_AF_FMC);//PD3
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FMC);//PD4 
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FMC);//PD5 
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource6,GPIO_AF_FMC);//PD6
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FMC);//PD8
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FMC);//PD9
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FMC);//PD10
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource11,GPIO_AF_FMC);//PD11
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_FMC);//PD12
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_FMC);//PD13
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FMC);//PD14
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FMC);//PD15
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource0,GPIO_AF_FMC);//PE0
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource1,GPIO_AF_FMC);//PE1
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FMC);//PE7
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FMC);//PE8
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FMC);//PE9
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FMC);//PE10
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FMC);//PE11
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FMC);//PE12
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FMC);//PE13
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FMC);//PE14
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FMC);//PE15
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource0,GPIO_AF_FMC);//PF0
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource1,GPIO_AF_FMC);//PF1
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource2,GPIO_AF_FMC);//PF2
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource3,GPIO_AF_FMC);//PF3
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource4,GPIO_AF_FMC);//PF4
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource5,GPIO_AF_FMC);//PF5
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource12,GPIO_AF_FMC);//PF12
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource13,GPIO_AF_FMC);//PF13
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource14,GPIO_AF_FMC);//PF14
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource15,GPIO_AF_FMC);//PF15
	GPIO_PinAFConfig(GPIOG,GPIO_PinSource0,GPIO_AF_FMC);//PG0
	GPIO_PinAFConfig(GPIOG,GPIO_PinSource1,GPIO_AF_FMC);//PG1
	GPIO_PinAFConfig(GPIOG,GPIO_PinSource2,GPIO_AF_FMC);//PG2
	GPIO_PinAFConfig(GPIOG,GPIO_PinSource3,GPIO_AF_FMC);//PG3
	GPIO_PinAFConfig(GPIOG,GPIO_PinSource4,GPIO_AF_FMC);//PG4
	GPIO_PinAFConfig(GPIOG,GPIO_PinSource5,GPIO_AF_FMC);//PG5
	GPIO_PinAFConfig(GPIOG,GPIO_PinSource6,GPIO_AF_FMC);//PG6
	GPIO_PinAFConfig(GPIOG,GPIO_PinSource7,GPIO_AF_FMC);//PG7
	GPIO_PinAFConfig(GPIOG,GPIO_PinSource10,GPIO_AF_FMC);//PG10
	
 	readWriteTiming.FMC_AddressSetupTime = 0x01;	 //地址建立时间(ADDSET)为1个HCLK 1/36M=27ns
	readWriteTiming.FMC_AddressHoldTime = 0x01;	 //地址保持时间(ADDHLD)
	readWriteTiming.FMC_DataSetupTime = 0x01;		 ////数据保持时间(DATAST)为9个HCLK 6*9=54ns	 	 
	readWriteTiming.FMC_BusTurnAroundDuration = 0x00;
	readWriteTiming.FMC_CLKDivision = 0x00;
	readWriteTiming.FMC_DataLatency = 0x00;
	readWriteTiming.FMC_AccessMode = FMC_AccessMode_A;	 //模式A 
    
	FSMC_NORSRAMInitStructure.FMC_Bank = FMC_Bank1_NORSRAM3;//  这里我们使用NE3 ,也就对应BTCR[4],[5]。
	FSMC_NORSRAMInitStructure.FMC_DataAddressMux = FMC_DataAddressMux_Disable; 
	FSMC_NORSRAMInitStructure.FMC_MemoryType =FMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM;  //SRAM   
	FSMC_NORSRAMInitStructure.FMC_MemoryDataWidth = FMC_NORSRAM_MemoryDataWidth_16b;//存储器数据宽度为16bit  FMC_NORSRAM_MemoryDataWidth_16b
	FSMC_NORSRAMInitStructure.FMC_BurstAccessMode =FMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable; 
	FSMC_NORSRAMInitStructure.FMC_WaitSignalPolarity = FMC_WaitSignalPolarity_Low;
	FSMC_NORSRAMInitStructure.FMC_AsynchronousWait=FMC_AsynchronousWait_Disable;
	FSMC_NORSRAMInitStructure.FMC_WrapMode = FMC_WrapMode_Disable;   
	FSMC_NORSRAMInitStructure.FMC_WaitSignalActive = FMC_WaitSignalActive_BeforeWaitState;  
	FSMC_NORSRAMInitStructure.FMC_WriteOperation = FMC_WriteOperation_Enable;	//存储器写使能 
	FSMC_NORSRAMInitStructure.FMC_WaitSignal = FMC_WaitSignal_Disable;  
	FSMC_NORSRAMInitStructure.FMC_ExtendedMode = FMC_ExtendedMode_Disable; // 读写使用相同的时序
	FSMC_NORSRAMInitStructure.FMC_WriteBurst = FMC_WriteBurst_Disable;  
	FSMC_NORSRAMInitStructure.FMC_ReadWriteTimingStruct = &readWriteTiming;
	FSMC_NORSRAMInitStructure.FMC_WriteTimingStruct = &readWriteTiming; //读写同样时序

	FMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  //初始化FSMC配置

 	FMC_NORSRAMCmd(FMC_Bank1_NORSRAM3, ENABLE);  // 使能BANK1区域3										  
											
}
	  														  
//在指定地址(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++;
	}  
} 

 

你可能感兴趣的:(嵌入式)