参考STM32F407例程,外部SRAM章节。
关于时序的配置,主要是设置这7个参数,如果是SRAM,则只需关注前3个参数,和最后一个参数。
根据F427 datasheet也可以看出,前3个参数均设为0x01。
代码不一定对,先贴出来记录下
#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++;
}
}