外扩SRAM的奇怪问题,求高手解答

2019-07-20 17:50发布

我用的板子是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;           




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。