STM32 FSMC

 

 

 配置实现


//转载
FSMC配置说明:
typedef struct
{
    uint32_t FSMC_Bank;                       //nor被分为四块,其中这个参数是说明对那个块编程
    uint32_t FSMC_DataAddressMux;             //地址\数据是否复用
    uint32_t FSMC_MemoryType;                 //存储器类型
    uint32_t FSMC_MemoryDataWidth;            //数据总线宽度 8位/16位 
    uint32_t FSMC_BurstAccessMode;            //是否进行成组模式访问
    uint32_t FSMC_WaitSignalPolarity;         //等待信号有效级性
    uint32_t FSMC_WrapMode;                   //该位决定控制器是否支持把非对齐的AHB成组操作分割成2次线性操作;该位仅在存储器的成组模式下有效。
    uint32_t FSMC_WaitSignalActive;           //当闪存存储器处于成组传输模式时,NWAIT信号指示从闪存存储器出来的数据是否有效或是否需要插入等待周期。
                                              //该位决定存储器是在等待状态之前的一个时钟周期产生NWAIT信号,还是在等待状态期间产生NWAIT信号。
    uint32_t FSMC_WriteOperation;             //该位指示FSMC是否允许/禁止对存储器的写操作。
    uint32_t FSMC_WaitSignal;                 //当闪存存储器处于成组传输模式时,这一位允许/禁止通过NWAIT信号插入等待状态。
    uint32_t FSMC_ExtendedMode;               //该位允许FSMC使用FSMC_BWTR寄存器,即允许读和写使用不同的时序。
    uint32_t FSMC_WriteBurst;                 //对于处于成组传输模式的闪存存储器,这一位允许/禁止通过NWAIT信号插入等待状态。读操作的同步成组传输协议使能位是FSMC_BCRx寄存器的BURSTEN位。
    FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct;//读时序配置指针
    FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct;    //写时序配置指针
}FSMC_NORSRAMInitTypeDef;
typedef struct
{
  uint32_t FSMC_AddressSetupTime;       //这些位定义地址的建立时间,适用于SRAM、ROM和异步总线复用模式的 NOR闪存操作。
  uint32_t FSMC_AddressHoldTime;        //这些位定义地址的保持时间,适用于SRAM、ROM和异步总线复用模式的 NOR闪存操作。
  uint32_t FSMC_DataSetupTime;          //这些位定义数据的保持时间,适用于SRAM、ROM和异步总线复用模式的NOR闪存操作。
  uint32_t FSMC_BusTurnAroundDuration;  //这些位用于定义一次读操作之后在总线上的延迟(仅适用于总线复用模式的NOR闪存操作),一次读操作之后控制器需要在数据总线上为下次操作送出地址,
                                        //这个延迟就是为了防止总线冲突。如果扩展的存储器系统不包含总线复用模式的存储器,或最慢的存储器可以在6个HCLK时钟周期内将数据总线恢复到高阻状态,可以设置这个参数为其最小值。
  uint32_t FSMC_CLKDivision;            //定义CLK时钟输出信号的周期,以HCLK周期数表示:
  uint32_t FSMC_DataLatency;            //处于同步成组模式的NOR闪存,需要定义在读取第一个数据之前等待的存储器周期数目。
                                        //这个时间参数不是以HCLK表示,而是以闪存时钟(CLK)表示。在访问异步NOR闪存、SRAM或ROM时,这个参数不起作用。操作CRAM时,这个参数必须为0。
  uint32_t FSMC_AccessMode;             //访问模式
}FSMC_NORSRAMTimingInitTypeDe
FSMC_Init()
{
    
    //当前配置的SRAM访问模式为A所以读写时序可以不同分别进行配置
    FSMC_NORSRAMTimingInitTypeDef  readWriteTiming; //
    FSMC_NORSRAMTimingInitTypeDef  writeTiming;////初始化FSMC
    FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
    
    
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);    //使能FSMC时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOG|RCC_APB2Periph_AFIO,ENABLE);//使能PORTB,D,E,G以及AFIO复用功能时钟
    
    //初始化 FSMC相关的 GPIO口
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                 //PB0 推挽输出 背光
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽输出
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOB, &GPIO_InitStructure);
    
     //PORTD复用推挽输出  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_14|GPIO_Pin_15;                 //    //PORTD复用推挽输出  
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;          //复用推挽输出   
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOD, &GPIO_InitStructure); 
       
    //PORTE复用推挽输出  
    GPIO_InitStructure.GPIO_Pin = 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;                 //    //PORTD复用推挽输出  
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;          //复用推挽输出   
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOE, &GPIO_InitStructure);                                                              

       //    //PORTG12复用推挽输出 A0    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_12;     //    //PORTD复用推挽输出  
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;          //复用推挽输出   
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOG, &GPIO_InitStructure); 
    
    //读时序FSMC_BTRx寄存器操作
    readWriteTiming.FSMC_AddressSetupTime = 0x01;     //地址建立时间(ADDSET)为2个HCLK 1/36M=27ns
      readWriteTiming.FSMC_AddressHoldTime = 0x00;     //地址保持时间(ADDHLD)模式A未用到    
      readWriteTiming.FSMC_DataSetupTime = 0x0f;         // 数据保存时间为16个HCLK,因为液晶驱动IC的读数据的时候,速度不能太快,尤其对1289这个IC。
      readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
      readWriteTiming.FSMC_CLKDivision = 0x00;
      readWriteTiming.FSMC_DataLatency = 0x00;
      readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;     //模式A 
        
    //写时序FSMC_BTRx寄存器操作
     writeTiming.FSMC_AddressSetupTime = 0x00;     //地址建立时间(ADDSET)为1个HCLK  
      writeTiming.FSMC_AddressHoldTime = 0x00;     //地址保持时间(A        
      writeTiming.FSMC_DataSetupTime = 0x03;         ////数据保存时间为4个HCLK    
      writeTiming.FSMC_BusTurnAroundDuration = 0x00;
      writeTiming.FSMC_CLKDivision = 0x00;
      writeTiming.FSMC_DataLatency = 0x00;
      writeTiming.FSMC_AccessMode = FSMC_AccessMode_A;     //模式A 
    
      FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;//  这里我们使用NE4 ,也就对应BTCR[6],[7]。
      FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不复用数据地址
      FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM;  //SRAM   
      FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为16bit   
      FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable; 
      FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
    FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable; 
      FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;   
      FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;  
      FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;    //  存储器写使能
      FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;   
      FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; // 读写使用不同的时序
      FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; 
      FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //读写时序
      FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming;  //写时序
    
      FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  //初始化FSMC配置
    
     FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);  // 使能BANK1 
            
    

}

 

posted @ 2021-05-09 15:31  hkaihang  阅读(245)  评论(0)    收藏  举报