STM32 的并口总线的所有接口类型解决方法

        STM32 的并口总线的所有接口类型解决方法


       STM32的并口总线支持NOR, SRAM, PSRAM,NAND接口,本文以PSRAM为例实现并口的同步非复用, 异步复用和异步非复用操作!以STM32F207IG(176脚)系列为例,步骤如下:

      1.  初始化并口的各个引脚

//Add[0-25] : F0-F5(6); F12-F15(4); G0-G5(6); D11-D13(3); E3-E6(4); E2(1); G13-G14(2)              
//Data[0-15]: D14-D15(2);D0-1(2);E7-15(9);D8-10(3)                                                 
//FSMC_NIORD: F6   NC           for PC CARD                                                        
//FSMC_NREG : F7   NC           for PC CARD                                                        
//FSMC_NIOWR: F8   NC           for PC CARD                                                        
//FSMC_CD   : F9   NC           for PC CARD                                                        
//FSMC_INTR : F10  NC           for PC CARD                                                        
//FSMC_INT2 : G6   NC           for COMMON                                                         
//FSMC_INT3 : G7   NC           for COMMON                                                         
//FSMC_CLK  : D3                for NOR/PSRAM                                                      
//FSMC_NOE  : D4                for COMMON                                                         
//FSMC_NWE  : D5                for COMMON                                                         
//FSMC_NWAIT: D6                for COMMON                                                         
//FSMC_NE1  : D7   FSMC_NCE2    for NOR/PSRAM  for NAND                                            
//FSMC_NE2  : G9   FSMC_NCE3    for NOR/PSRAM  for NAND                                            
//FSMC_NE3  : G10  NC           for NOR/PSRAM                                                      
//FSMC_NCE4 : G11  NC           for NOR/PSRAM                                                      
//FSMC_NE4  : G12  NC           for NOR/PSRAM                                                      
//FSMC_NL   : B7                for NOR/PSRAM                                                      
//FSMC_NBL0 : E0                for NOR/PSRAM                                                      
//FSMC_NBL1 : E1                for NOR/PSRAM

   

void FsmcInit(void)

    u8 i=0;

    // 1. 
    GPIO_InitTypeDef GPIO_InitStructure; 
    RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB  | RCC_AHB1Periph_GPIOD  |        RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG, ENABLE);
  
    for(i=0; i<FSMC_IO_NUMB; i++)
    {        
        GPIO_PinAFConfig((GPIO_TypeDef *)GPIOx,  GPIO_PinSourceX, GPIO_AF_FSMC);
    }
    
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0 ;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
    GPIO_Init(GPIOD, &GPIO_InitStructure); 
    
    for(i=0; i<FSMC_IO_NUMB; i++)
    {        
        GPIO_InitStructure.GPIO_Pin   = (1<<GPIO_PinSourceX);
        GPIO_Init((GPIO_TypeDef *)GPIOx,   &GPIO_InitStructure);
    }

// FSMC_NWAIT: D6  

    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6 ;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
    GPIO_Init(GPIOD, &GPIO_InitStructure); 

    FsmcBank1BusTypeInit(FSMC_TYPE_NOMUX_SYN, FSMC_Bank1_NORSRAM1, FSMC_MemoryType_PSRAM, FSMC_MemoryDataWidth_16b);
  //  FsmcBank1BusTypeInit(FSMC_TYPE_MUX_ASYN, FSMC_Bank1_NORSRAM1, FSMC_MemoryType_PSRAM, FSMC_MemoryDataWidth_16b);
   // FsmcBank1BusTypeInit(FSMC_TYPE_NOMUX_ASYN, FSMC_Bank1_NORSRAM1, FSMC_MemoryType_PSRAM, FSMC_MemoryDataWidth_16b);
}


2. 初始化FSMC

  u8 FsmcBank1BusTypeInit(u8 uchBusType, u32 uiBank1Numb, u32 uiMemType, u32 uiDataWide)

{
    FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
    FSMC_NORSRAMTimingInitTypeDef  FSMC_NORSRAMTimingRead;
    FSMC_NORSRAMTimingInitTypeDef  FSMC_NORSRAMTimingWrite;
   

    if(((FSMC_TYPE_NOMUX_SYN == uchBusType)||(FSMC_TYPE_MUX_SYN == uchBusType)) &&(uiMemType == FSMC_MemoryType_NOR))
    {//同步访问Nor 只支持读操作
        return FSMC_OPT_FAIL;
    }


    // 0.默认初始化结构体,读写的时序
    FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &FSMC_NORSRAMTimingRead;  
    FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct     = &FSMC_NORSRAMTimingWrite;
    FSMC_NORSRAMStructInit(&FSMC_NORSRAMInitStructure);


    // 1. 总线类型初始化
    FSMC_NORSRAMInitStructure.FSMC_Bank                  = uiBank1Numb;  
    FSMC_NORSRAMInitStructure.FSMC_MemoryType            = uiMemType;
    FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth       = uiDataWide;


    // 2.根据芯片类型初始化
    if((FSMC_TYPE_NOMUX_SYN == uchBusType)||(FSMC_TYPE_MUX_SYN == uchBusType))
    {//同PSRAM, 同步非复用
        //同步模式设置:
      
        // 2.1 总线类型         
        if(FSMC_TYPE_MUX_SYN == uchBusType)
        {
            FSMC_NORSRAMInitStructure.FSMC_DataAddressMux    = FSMC_DataAddressMux_Enable; 
        }
        else
        {
            FSMC_NORSRAMInitStructure.FSMC_DataAddressMux    = FSMC_DataAddressMux_Disable;
        }
        FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode       = FSMC_BurstAccessMode_Enable;   //同步模式下使用,for NOR Flash(PSRAM)
                     
        // 2.2. 其他设置,burst模式禁用,burst mode disable: Paras. valid only when accessing Flash memories in burst mode      
        FSMC_NORSRAMInitStructure.FSMC_WriteBurst            = FSMC_WriteBurst_Enable;          //在同步模式下支持Write burst,但读时无效; 异步模式下设0,禁用,表示在异步模式下写操作总是容许的
        FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait      = FSMC_AsynchronousWait_Disable;   //异步操作时是否采用NWAIT信号来进行数据准备的延时
        FSMC_NORSRAMInitStructure.FSMC_ExtendedMode          = FSMC_ExtendedMode_Disable;       //是否支持扩展模式A,B,C,D,根据需要来设定
        FSMC_NORSRAMInitStructure.FSMC_WaitSignal            = FSMC_WaitSignal_Enable;          //在burst模式下,是否插入NWAIT等待延时信号 ,同步必须插
        FSMC_NORSRAMInitStructure.FSMC_WriteOperation        = FSMC_WriteOperation_Enable;      //是否支持写操作
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive      = FSMC_WaitSignalActive_DuringWaitState; // 延时等待信号在FSMC_WaitSignalPolarity时表示正在等待,不是之前一个时钟周期类在等待
        FSMC_NORSRAMInitStructure.FSMC_WrapMode              = FSMC_WrapMode_Disable;           //对总线宽度不一致时使用
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity    = FSMC_WaitSignalPolarity_Low;    //异步操作若开启延时,此表示延迟等待的电平,非此电平表示延时结束,for NOR Flash(PSRAM) WAITEN、WAITCFG、WAITPOL 


        // 2.3 延时时间设置,根据芯片来设计,同步模式,下列前三个不用设置
        FSMC_NORSRAMTimingRead.FSMC_AddressSetupTime         = 10;  //地址建立时间的持续时间, 异步使用
        FSMC_NORSRAMTimingRead.FSMC_AddressHoldTime          = 5;   //地址的建立后的保持时间, 异步使用
        FSMC_NORSRAMTimingRead.FSMC_DataSetupTime            = 10;  //数据建立时间的持续时间,异步复用中使用
        FSMC_NORSRAMTimingRead.FSMC_BusTurnAroundDuration    = 2;   //总线周转时间?!,         复用模式使用
        FSMC_NORSRAMTimingRead.FSMC_CLKDivision              = 3;   //定义输出时钟分频,      同步使用, 0x0 to get CLK = HCLK(个别芯片不支持),0x1 to get CLK = 2 × HCLK,... , 0x0f;    ==2,clk == 40M,==3,clk == 30M 
        FSMC_NORSRAMTimingRead.FSMC_DataLatency              = 0;   //内存时钟周期数,        同步使用,  DataLatency = 1 for NOR Flash; DataLatency = 0 for PSRAM
        FSMC_NORSRAMTimingRead.FSMC_AccessMode               = FSMC_AccessMode_A;//Specifies the asynchronous access mode  


        memcpy((u8 *)&FSMC_NORSRAMTimingWrite, (u8 *)&FSMC_NORSRAMTimingRead, sizeof(FSMC_NORSRAMTimingInitTypeDef));
    }
    else if((FSMC_TYPE_MUX_ASYN == uchBusType) || (FSMC_TYPE_NOMUX_ASYN == uchBusType))
    { //异步复用模式,   异步非复用   
        // 2.1 总线类型        
        if(FSMC_TYPE_MUX_ASYN == uchBusType)
        {
            FSMC_NORSRAMInitStructure.FSMC_DataAddressMux    = FSMC_DataAddressMux_Enable; 
        }
        else
        {
            FSMC_NORSRAMInitStructure.FSMC_DataAddressMux    = FSMC_DataAddressMux_Disable; 
        }
        FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode       = FSMC_BurstAccessMode_Disable;   //同步模式下使用,for NOR Flash(PSRAM)
                     
        // 2.2. 其他设置,burst模式禁用,burst mode disable: Paras. valid only when accessing Flash memories in burst mode      
        FSMC_NORSRAMInitStructure.FSMC_WriteBurst            = FSMC_WriteBurst_Disable;         //在同步模式下支持Write burst ; 异步模式下设0,禁用,表示在异步模式下写操作总是容许的
        FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait      = FSMC_AsynchronousWait_Disable;    //异步操作时是否采用NWAIT信号来进行数据准备的延时
        FSMC_NORSRAMInitStructure.FSMC_ExtendedMode          = FSMC_ExtendedMode_Disable;       //是否支持扩展模式A,B,C,D,根据需要来设定
        FSMC_NORSRAMInitStructure.FSMC_WaitSignal            = FSMC_WaitSignal_Disable;         //在burst模式下,是否插入NWAIT等待延时信号 
        FSMC_NORSRAMInitStructure.FSMC_WriteOperation        = FSMC_WriteOperation_Enable;      //是否支持写操作
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive      = FSMC_WaitSignalActive_BeforeWaitState; // 延时等待信号在FSMC_WaitSignalPolarity时表示正在等待,不是之前一个时钟周期类在等待
        FSMC_NORSRAMInitStructure.FSMC_WrapMode              = FSMC_WrapMode_Disable;           //对总线宽度不一致时使用
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity    = FSMC_WaitSignalPolarity_High;    //异步操作若开启延时,此表示延迟等待的电平,非此电平表示延时结束,for NOR Flash(PSRAM) WAITEN、WAITCFG、WAITPOL 


        // 2.3 延时时间设置,根据芯片来设计
        FSMC_NORSRAMTimingRead.FSMC_AddressSetupTime         = 20;  //地址建立时间的持续时间, 异步使用
        FSMC_NORSRAMTimingRead.FSMC_AddressHoldTime          = 5;  //地址的建立后的保持时间, 异步使用
        FSMC_NORSRAMTimingRead.FSMC_DataSetupTime            = 30;  //数据建立时间的持续时间,异步复用中使用
        FSMC_NORSRAMTimingRead.FSMC_BusTurnAroundDuration    = 5;  //总线周转时间?!,         复用模式使用


        FSMC_NORSRAMTimingRead.FSMC_CLKDivision              = 1;  //定义输出时钟分频,      同步使用, 0x0 to get CLK = HCLK(个别芯片不支持),0x1 to get CLK = 2 × HCLK,... , 0x0f;   
        FSMC_NORSRAMTimingRead.FSMC_DataLatency              = 0;  //内存时钟周期数,        同步使用,  DataLatency = 1 for NOR Flash; DataLatency = 0 for PSRAM
        FSMC_NORSRAMTimingRead.FSMC_AccessMode               = FSMC_AccessMode_D;//Specifies the asynchronous access mode  


        memcpy((u8 *)&FSMC_NORSRAMTimingWrite, (u8 *)&FSMC_NORSRAMTimingRead, sizeof(FSMC_NORSRAMTimingInitTypeDef));
    }    
    else//FSMC_TYPE_MUX_SYN: 同步复用
    {      
        return FSMC_OPT_FAIL;
    }
    
    // 5.写配置到REG
    FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);    
    FSMC_NORSRAMCmd(uiBank1Numb, ENABLE);   

    
    return FSMC_OPT_OK;
}

      

3. 函数的调用

void PsramWrite(u32 uiRegAddr, u16 ushValue)
{
    // Transfer data to the memory 
    *(__IO u16 *) (cuistBank1BaseAddr[FSMC_FEC_BANK_NUMB] + (uiRegAddr<<1)) = ushValue;                
}

u16 PsramRead(u32 uiRegAddr)
{    
      u16 ushVal = 0;
    // Read data from the memory 
    ushVal = *(__IO u16*) (cuistBank1BaseAddr[FSMC_FEC_BANK_NUMB] + (uiRegAddr<<1));
    
    return ushVal;
}


    总结:一般异步模式下,需要调试建立时间,同步模式下则不用!

           特别说明,对于非STM32标准的接口,如motorola和intel总线的并口,需要在调用PsramWrite和PsramRead时,手动进行片选FSMC_NEx的上拉和下拉!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32F407的FSMC(Flexible Static Memory Controller)总线应用是指将FSMC用于连接外部存储器或外设的数据交换。FSMC是一个灵活的高性能静态存储器控制器,可以与各种存储器类型和外设相连接。 STM32F407的FSMC总线应用有以下几个方面: 1. 外部存储器扩展:通过FSMC总线,可以将外部存储器,如SRAM(静态随机存储器)或 NOR Flash(并行闪存),连接到STM32F407微控制器。这样可以扩展STM32F407的存储容量,适用于需要大容量内存的应用,如图像处理、音频处理等。 2. 外设连接:FSMC还可以用于连接外部设备,如LCD液晶显示屏。通过FSMC总线,可以将STM32F407与LCD控制器相连接,实现彩色图像的实时显示。此外,FSMC还可以连接其他外设,如触摸屏控制器、摄像头模块等。 3. 并行:FSMC总线是一个高速的并行,支持多种总线协议。除了SRAM和NOR Flash之外,FSMC还可以连接其他外部存储器,如PSRAM(伪静态随机存储器)、NAND Flash(并行闪存)等。通过FSMC的并行,可以实现高速数据传输和存取。 4. DMA支持:FSMC与STM32F407的DMA(直接存储器访问)控制器相结合,可实现高效的数据传输。DMA可以直接从外部存储器读取数据或向外部存储器写入数据,减轻了CPU的负担,提高了数据传输的效率。 总之,STM32F407的FSMC总线应用广泛,可以连接各种外部存储器和外设,具有灵活性和高性能。它在大容量存储、图像处理、音频处理等应用中发挥着重要作用,同时通过DMA支持提供了高效的数据传输解决方案。 ### 回答2: STM32F407的FSMC(Flexible Static Memory Controller)总线可以用于处理与外部静态存储器的通信。它提供了多种接和功能,方便与不同类型的存储器进行连接,包括SRAM、NOR Flash和PSRAM等。 在SRAM应用中,FSMC总线可以为外部SRAM提供直接访问功能。通过配置FSMC控制寄存器和时序寄存器,可以实现读取和写入SRAM中的数据。这种方式可以扩展MCU的内存空间,提高数据处理能力。 在NOR Flash应用中,FSMC总线可以实现对外部闪存的读取和写入。通过配置FSMC的控制寄存器和时序寄存器,可以设置访问闪存的时序和模式。这种方式可以用于存储嵌入式应用程序代码和数据,提高系统的运行速度和效率。 在PSRAM应用中,FSMC总线可以连接并访问外部并行存储器。通过配置FSMC的控制寄存器和时序寄存器,可以实现对PSRAM的读取和写入。这种方式可以提供高速存储器的访问能力,适用于对存储速度要求较高的应用场景。 总之,STM32F407的FSMC总线应用广泛,能够满足不同类型的外部存储器的连接和通信需求。它提供了灵活的接和丰富的功能,可以大幅拓展内存空间,提高系统性能和效率。 ### 回答3: STM32F407的FSMC(Flexible Static Memory Controller)总线是一种用于连接外部存储器设备的接。它提供了与静态存储器(SRAM和NOR闪存)、NAND闪存、SDRAM等设备进行高速数据传输的功能。FSMC总线的应用范围广泛,包括但不限于以下几个方面: 首先,FSMC总线可以连接静态存储器设备,例如SRAM和NOR闪存。SRAM是一种快速且易于访问的存储器,适用于对读写速度要求较高的应用场景。NOR闪存则在数据存储方面提供了非常大的存储容量,适用于嵌入式系统中的代码存储需求。 其次,FSMC总线还可以连接NAND闪存,这是一种使用较多的闪存存储设备,适用于对存储容量要求较高的应用场景。NAND闪存不仅具备较大的存储容量,还具备良好的擦除和写入性能。 另外,FSMC总线还支持连接SDRAM,这是一种用于动态存储的存储器设备。SDRAM具备较大的存储容量和高速的数据传输速度,适用于对存储容量和数据读写性能要求较高的应用场景,如图像处理、音频处理等。 总之,STM32F407的FSMC总线广泛应用于嵌入式系统中需要连接外部存储器设备的场景。通过高速、稳定的数据传输,实现了对静态存储器(SRAM和NOR闪存)、NAND闪存和SDRAM等存储设备的有效控制和访问,为嵌入式系统的数据存储和处理提供了良好的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值