我用的板子是STM32F407ZET6 外扩1M的SRAM 当我对0x68000000地址写入数据的时候 0x68000040也会被同时写入相同数据 当我对0x68000040写入数据的时候 0x68000080也会被同时写入相同的数据 以此类推 下面是FSMC的配置 我用了一个地址译码器 用PE3和PE4做位选
void FSMC_SRAM_Init(void)
{
RCC->AHB1ENR|=0XF<<3; //使能PD,PE,PF,PG时钟
RCC->AHB3ENR|=1<<0; //使能FSMC时钟
// FSMC_NE3,PG10
GPIO_AF_Set(GPIOG,10,12); //PG10,AF12(CS放到最前面,防止复位后CS非法变低,破坏原有数据)
GPIO_Set(GPIOD,(3<<0)|(3<<4)|(0XFF<<8),GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PD0,1,4,5,8~15 AF OUT
GPIO_Set(GPIOE,(3<<0)|(0X1FF<<7),GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PE0,1,7~15,AF OUT
GPIO_Set(GPIOE,PIN3|PIN4,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PE3 PE4
GPIO_Set(GPIOF,(0X3F<<0)|(0XF<<12),GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PF0~5,12~15
GPIO_Set(GPIOG,(0X3F<<0)|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PG0~5,10
GPIO_AF_Set(GPIOD,0,12); //PD0,AF12 //FSMC_D2
GPIO_AF_Set(GPIOD,1,12); //PD1,AF12 //FSMC_D3
GPIO_AF_Set(GPIOD,4,12); //PD4,AF12 //FSMC_NOE
GPIO_AF_Set(GPIOD,5,12); //PD5,AF12 //FSMC_NWE
GPIO_AF_Set(GPIOD,8,12); //PD8,AF12 //FSMC_D13
GPIO_AF_Set(GPIOD,9,12); //PD9,AF12 //FSMC_D14
GPIO_AF_Set(GPIOD,10,12); //PD10,AF12 //FSMC_D15
GPIO_AF_Set(GPIOD,11,12); //PD11,AF12 //FSMC_A16
GPIO_AF_Set(GPIOD,12,12); //PD12,AF12 //FSMC_A17
GPIO_AF_Set(GPIOD,13,12); //PD13,AF12 //FSMC_A18
GPIO_AF_Set(GPIOD,14,12); //PD14,AF12 //FSMC_D0
GPIO_AF_Set(GPIOD,15,12); //PD15,AF12 //FSMC_D1
GPIO_AF_Set(GPIOE,0,12); //PE0,AF12 //FSMC_NBL0
GPIO_AF_Set(GPIOE,1,12); //PE1,AF12 //FSMC_NBL1
GPIO_AF_Set(GPIOE,7,12); //PE7,AF12 //FSMC_D4
GPIO_AF_Set(GPIOE,8,12); //PE8,AF12 //FSMC_D5
GPIO_AF_Set(GPIOE,9,12); //PE9,AF12 //FSMC_D6
GPIO_AF_Set(GPIOE,10,12); //PE10,AF12 //FSMC_D7
GPIO_AF_Set(GPIOE,11,12); //PE11,AF12 //FSMC_D8
GPIO_AF_Set(GPIOE,12,12); //PE12,AF12 //FSMC_D9
GPIO_AF_Set(GPIOE,13,12); //PE13,AF12 //FSMC_D10
GPIO_AF_Set(GPIOE,14,12); //PE14,AF12 //FSMC_D11
GPIO_AF_Set(GPIOE,15,12); //PE15,AF12 //FSMC_D12
GPIO_AF_Set(GPIOF,0,12); //PF0,AF12 //FSMC_A0
GPIO_AF_Set(GPIOF,1,12); //PF1,AF12 //FSMC_A1
GPIO_AF_Set(GPIOF,2,12); //PF2,AF12 //FSMC_A2
GPIO_AF_Set(GPIOF,3,12); //PF3,AF12 //FSMC_A3
GPIO_AF_Set(GPIOF,4,12); //PF4,AF12 //FSMC_A4
GPIO_AF_Set(GPIOF,5,12); //PF5,AF12 //FSMC_A5
GPIO_AF_Set(GPIOF,12,12); //PF12,AF12 //FSMC_A6
GPIO_AF_Set(GPIOF,13,12); //PF13,AF12 //FSMC_A7
GPIO_AF_Set(GPIOF,14,12); //PF14,AF12 //FSMC_A8
GPIO_AF_Set(GPIOF,15,12); //PF15,AF12 //FSMC_A9
GPIO_AF_Set(GPIOG,0,12); //PG0,AF12 //FSMC_A10
GPIO_AF_Set(GPIOG,1,12); //PG1,AF12 //FSMC_A11
GPIO_AF_Set(GPIOG,2,12); //PG2,AF12 //FSMC_A12
GPIO_AF_Set(GPIOG,3,12); //PG3,AF12 //FSMC_A13
GPIO_AF_Set(GPIOG,4,12); //PG4,AF12 //FSMC_A14
GPIO_AF_Set(GPIOG,5,12); //PG5,AF12 //FSMC_A15
GPIO_AF_Set(GPIOE,3,12); //PE3,AF12 //FSMC_A19
GPIO_AF_Set(GPIOE,4,12); //PE4,AF12 //FSMC_A20
//寄存器清零
//bank1有NE1~4,每一个有一个BCR+TCR,所以总共八个寄存器。
//这里我们使用NE3 ,也就对应BTCR[4],[5]。
FSMC_Bank1->BTCR[4]=0X00000000;
FSMC_Bank1->BTCR[5]=0X00000000;
FSMC_Bank1E->BWTR[4]=0X00000000;
//操作BCR寄存器 使用异步模式,模式A(读写共用一个时序寄存器)
//BTCR[偶数]:BCR寄存器;BTCR[奇数]:BTR寄存器
FSMC_Bank1->BTCR[4]|=1<<12;//存储器写使能
FSMC_Bank1->BTCR[4]|=1<<4; //存储器数据宽度为16bit
//操作BTR寄存器 (HCLK=168M, 1个HCLK=6ns
FSMC_Bank1->BTCR[5]|=64<<8; //数据保持时间(DATAST)为9个HCLK 6*9=54ns --------------- 最大值256
FSMC_Bank1->BTCR[5]|=0<<4; //地址保持时间(ADDHLD)未用到
FSMC_Bank1->BTCR[5]|=15<<0; //地址建立时间(ADDSET)为0个HCLK 0ns---------------------最大值为15
//FSMC_Bank1->BTCR[5]|=15<<16; //鎬荤嚎缈昏浆鏃堕棿
//闪存写时序寄存器
FSMC_Bank1E->BWTR[4]=0x0FFFFFFF;//默认值
//使能BANK1区域3
FSMC_Bank1->BTCR[4]|=1<<0; |