FSMC可变静态存储控制器配置加速获取速度

FSMC(Flexible Static Memory Controller,可变静态存储控制器)是STM32系列微控制器中的一个重要外设,用于扩展外部存储器和连接具有类似存储接口的外设。

一、功能和作用

         1. 外部存储器扩展 - FSMC可以连接不同类型的外部存储器,包括SRAM、PSRAM、NOR Flash和NAND Flash等。这使得STM32微控制器能够访问更大的存储容量,满足复杂应用程序的需求。 - 通过FSMC,单片机可以像访问内部存储器一样方便地访问外部存储器,提高了系统的存储资源和灵活性。

        2. 外设连接 - 除了存储器,FSMC还可以连接一些具有类似存储接口的外设,如LCD控制器、SD卡接口等。这为系统集成提供了便利,减少了外部电路的复杂性。

二、工作原理*

        1. 存储区域划分 - FSMC将外部存储器空间划分为多个存储块,每个存储块可以独立配置其存储类型、地址范围、数据宽度等参数。 - 不同的存储块可以连接不同类型的存储器或外设,实现灵活的存储扩展和外设连接。

        2. 地址映射 - FSMC通过地址映射将外部存储器的地址空间映射到STM32微控制器的地址空间中。这样,单片机可以通过访问特定的地址来读写外部存储器或外设的数据。 - 地址映射可以根据实际需求进行配置,确保外部存储器和外设的地址与单片机的地址空间相匹配。

        3. 控制信号生成 - FSMC根据配置参数生成相应的控制信号,如片选信号、读写信号、地址线和数据线等。这些控制信号用于与外部存储器或外设进行通信,实现数据的读写操作。 - 控制信号的生成可以根据不同的存储类型和通信协议进行调整,以确保正确的数据传输。

        4. 数据传输 - 当单片机需要读写外部存储器或外设的数据时,FSMC通过控制信号将地址发送到外部设备,并根据读写操作的类型生成相应的读或写信号。 - 数据在地址线和数据线之间进行传输,FSMC负责协调数据的传输过程,确保数据的正确性和完整性。

三、配置和使用 

        1. 时钟配置 - FSMC需要使用特定的时钟源,通常是AHB时钟。在使用FSMC之前,需要确保时钟配置正确,以提供稳定的时钟信号给FSMC模块。

        2. 存储块配置 - 根据连接的外部存储器或外设的类型,配置相应的存储块参数,包括存储类型、地址范围、数据宽度、读写时序等。 - 这些参数可以通过STM32的寄存器进行配置,以满足不同设备的通信要求。

        3. 初始化和使能 - 在使用FSMC之前,需要进行初始化操作,包括设置时钟、配置存储块、使能FSMC模块等。 - 初始化完成后,可以通过相应的函数或寄存器操作来读写外部存储器或外设的数据。

四、应用场景 

        1. 大容量存储扩展 - 在需要存储大量数据的应用中,如数据采集系统、图像存储等,可以使用FSMC连接外部存储器来扩展存储容量。

        2. 图形显示 - FSMC可以连接LCD控制器,实现图形显示功能。通过FSMC,单片机可以将图像数据快速传输到LCD控制器,实现流畅的图形显示效果。

        3. 外部设备连接 - 一些外部设备,如SD卡、以太网控制器等,具有类似存储接口。可以使用FSMC连接这些设备,实现与外部设备的通信和数据交换。

总之,FSMC为STM32微控制器提供了强大的外部存储器扩展和外设连接功能,使得单片机能够满足各种复杂应用的需求。在使用FSMC时,需要根据实际情况进行配置和编程,以确保正确的数据传输和系统的稳定性。

我写的:
 void FSMC_Init(void)
{  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE);
    // 2. 配置 GPIO 功能
    // 2.1 数据线配置
    // PD 口
    GPIO_InitTypeDef GPIO_InitStructPD;
    GPIO_InitStructPD.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;
    GPIO_InitStructPD.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructPD.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructPD.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructPD.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOD, &GPIO_InitStructPD);

    // PE 口
    GPIO_InitTypeDef GPIO_InitStructPE;
    GPIO_InitStructPE.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;
    GPIO_InitStructPE.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructPE.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructPE.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructPE.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOE, &GPIO_InitStructPE);

    // 2.2 地址线配置
    // PD 口
    GPIO_InitTypeDef GPIO_InitStructPD_Addr;
    GPIO_InitStructPD_Addr.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
    GPIO_InitStructPD_Addr.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructPD_Addr.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructPD_Addr.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructPD_Addr.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOD, &GPIO_InitStructPD_Addr);

    // PF 口
    GPIO_InitTypeDef GPIO_InitStructPF;
    GPIO_InitStructPF.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_InitStructPF.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructPF.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructPF.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructPF.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOF, &GPIO_InitStructPF);

    // PG 口
    GPIO_InitTypeDef GPIO_InitStructPG;
    GPIO_InitStructPG.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_10;
    GPIO_InitStructPG.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructPG.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructPG.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructPG.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOG, &GPIO_InitStructPG);

    // 2.3 控制线配置
    // PE 口
    GPIO_InitTypeDef GPIO_InitStructPE_Control;
    GPIO_InitStructPE_Control.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
    GPIO_InitStructPE_Control.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructPE_Control.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructPE_Control.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructPE_Control.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOE, &GPIO_InitStructPE_Control);

    // PG 口
    GPIO_InitTypeDef GPIO_InitStructPG_Control;
    GPIO_InitStructPG_Control.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructPG_Control.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructPG_Control.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructPG_Control.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructPG_Control.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOG, &GPIO_InitStructPG_Control);


     // 3. 设置 GPIO 复用功能
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource11, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource0, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource1, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource7, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource8, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource9, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource10, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource11, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource12, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource13, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource14, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource15, GPIO_AF_FSMC);

    GPIO_PinAFConfig(GPIOF, GPIO_PinSource0, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource1, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource2, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource3, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource4, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource5, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource12, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource13, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource14, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOF, GPIO_PinSource15, GPIO_AF_FSMC);

    GPIO_PinAFConfig(GPIOG, GPIO_PinSource0, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOG, GPIO_PinSource1, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOG, GPIO_PinSource2, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOG, GPIO_PinSource3, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOG, GPIO_PinSource4, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOG, GPIO_PinSource5, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOG, GPIO_PinSource10, GPIO_AF_FSMC);

    //4. 配置FSMC  把LCD的第4区改成第3个区。
    RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
    FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStruct = {0};
    
//    FSMC_NORSRAMTimingInitTypeDef FSMC_ReadWriteTimingStruct = {0};
//    FSMC_ReadWriteTimingStruct.FSMC_AddressHoldTime = 9;
//    FSMC_NORSRAMTimingInitTypeDef FSMC_WriteTimingStruct = {0};
//    FSMC_WriteTimingStruct.FSMC_AddressHoldTime = 9;
    
//    FSMC_NORSRAMInitStruct.FSMC_AsynchronousWait = 
    FSMC_NORSRAMInitStruct.FSMC_Bank             = FSMC_Bank1_NORSRAM3;  //nor被分为四块,其中这个参数是说明对第三块编程
    FSMC_NORSRAMInitStruct.FSMC_BurstAccessMode  = FSMC_BurstAccessMode_Disable; //是否进行成组模式访问
    FSMC_NORSRAMInitStruct.FSMC_DataAddressMux   = FSMC_DataAddressMux_Disable;  //地址\数据是否复用
    FSMC_NORSRAMInitStruct.FSMC_ExtendedMode     = FSMC_WaitSignal_Disable;      //是否使能读写时序不同
    FSMC_NORSRAMInitStruct.FSMC_MemoryDataWidth  = FSMC_MemoryDataWidth_16b;     //数据总线宽度 8位/16位
    FSMC_NORSRAMInitStruct.FSMC_MemoryType       = FSMC_MemoryType_SRAM;         //存储器模式
    FSMC_NORSRAMInitStruct.FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime = 9;
//    FSMC_NORSRAMInitStruct.FSMC_WaitSignal            //当闪存存储器处于成组传输模式时,这一位允许/禁止通过NWAIT信号插入等待状态
//    FSMC_NORSRAMInitStruct.FSMC_WaitSignalActive
//    FSMC_NORSRAMInitStruct.FSMC_WaitSignalPolarity
//    FSMC_NORSRAMInitStruct.FSMC_WrapMode
//    FSMC_NORSRAMInitStruct.FSMC_WriteBurst
    FSMC_NORSRAMInitStruct.FSMC_WriteOperation   = FSMC_WriteOperation_Enable; //该位指示FSMC是否允许/禁止对存储器的写操作 
    FSMC_NORSRAMInitStruct.FSMC_WriteTimingStruct->FSMC_AddressHoldTime = 9;
    FSMC_NORSRAMInit(&FSMC_NORSRAMInitStruct);
    FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE);

}

//GPIOx:GPIOA~GPIOI.
//BITx:0~15,代表IO引脚编号.
//AFx:0~15,代表AF0~AF15.
//AF0~15设置情况(这里仅是列出常用的,详细的请见407数据手册,56页Table 7):
//AF0:MCO/SWD/SWCLK/RTC   AF1:TIM1/TIM2;            AF2:TIM3~5;               AF3:TIM8~11
//AF4:I2C1~I2C3;          AF5:SPI1/SPI2;            AF6:SPI3;                 AF7:USART1~3;
//AF8:USART4~6;           AF9;CAN1/CAN2/TIM12~14    AF10:USB_OTG/USB_HS       AF11:ETH
//AF12:FSMC/SDIO/OTG/HS   AF13:DCIM  
void Set_GPIO_AF(GPIO_TypeDef* GPIOx,u8 BITx,u8 AFx)
{  
    GPIOx->AFR[BITx>>3]&=~(0X0F<<((BITx&0X07)*4));
    GPIOx->AFR[BITx>>3]|=(u32)AFx<<((BITx&0X07)*4);
}  

void wv51216_write(u32 write_address,u16 *buffer,u32 cnt)
{
    while(cnt--) //11次
    {
        *(u16*)(0x68000000+write_address) = *buffer;
        buffer++;
        write_address+=2;
    }
    
}
//
//
void wv51216_read(u32 read_address,u16 *buffer,u32 cnt)
{
    while(cnt--)
    {
        *buffer = *(u16*)(0x68000000+read_address);
        buffer++;
        read_address+=2;
    }
}
写的是存储区域以及读取存取的东西,一般来说,小屏幕可以用这种方法让屏幕更快读取到我们要显示的数据,所以有时候屏幕刷新数据慢的话,可以试试这种方法,再大的就要用到FPGA了。

今天就先到这咯!文中有误欢迎指出哦,感谢友友们啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值