FMC/FSMC
FMC 灵活存储控制器
FSMC 灵活静态存储控制器
FMC是STM32F429/439专有的,因为驱动SDRAM时需要定时刷新,而FSMC存在于F1和F4中我们常用的芯片中。
看名字就知道,既然是存储控制器,就是用来控制存储器的。
RAM有两大类:静态RAM(SRAM) 和 动态RAM(DRAM)
静态RAM(SRAM):
不需要刷新电路,掉电丢失数据,而且一般不是行列地址复用的
动态RAM(DRAM):
需要每隔一段时间刷新一次数据,才能保存数据,掉电丢失数据,是行列地址复用的,许多都有页模式。
同步动态存储器(SDRAM)
数据的读写需要时钟来同步。
存储单元不是线性排列的,是分页的。
DRAM和SDRAM由于实现工艺问题,容量较SRAM大。但是读写速度不如SRAM。
FMC驱动LCD屏
正点原子在STM32F429阿波罗开发指南中提到,
STM32F429 的 FMC 将外部设备分为 3 类:NOR/PSRAM 设备、NAND 设备和 SDRAM 设备。他们共用地址数据总线等信号,他们具有不同的 CS 以区分不同的设备,比如外设 TFTLCD 就是用的 FMC_NE1 做片选,其实就是将 TFTLCD 当成 SRAM 来控制。
之所以可以将LCD屏当作SRAM来控制,是因为外部SRAM的控制一般有:
地址线(A0~A18),数据线(D0~D15),写信号 WE,读信号 OE,片选信号 CS,
如果SRAM支持字节控制,那么还有高/低字节 UB/LB信号。
而 TFTLCD 的信号包括:
数据线D0~D15、命令/数据选择信号 RS、写信号 WR、读信号RD 和 片选信号CS。
RS,寄存器选择信号,又被称为命令/数据选择信号
FMC 支持 8/16/32位数据宽度,LCD一般是16位宽度的
FMC 将外部存储器划分为 6 个固定大小为 256M 字节的存储块,也就是总共管理 1.5GB 空间。每个块又被分为 4 个区,一个区 64 M。
STM32 将
0x6000 0000 ~0x9FFF FFFF
0xC000 0000~ 0xDFFF FFFF
这1.5G 地址作为外部存储器地址。
0x6000 0000~0x6FFF FFFF BANK1 SRAM使用
0x7000 0000~0x7FFF FFFF BANK2
0x8000 0000~0x8FFF FFFF BANK3 FLASH使用
0x9000 0000~0x9FFF FFFF BANK4 PC卡使用
0xC000 0000~0xCFFF FFFF BANK5
0xD000 0000~0xDFFF FFFF BANK6 SDRAM使用
将 TFTLCD 当作SRAM设备来用,需要用到的 FMC 存储块是 BANK1。
BANK1 的 256M 字节空间由 28 根地址线 ADDR[27:0] 寻址,地址线是 AHB 地址总线,
其中ADDR[27:26]用于对 4 个区进行寻址,
ADDR[25:0] 来自外部存储器地址 FMC_A[25:0]
ADDR[25:0] 位为外部存储器地址,
由于 ADDR 按字节寻址,存储器可以按字寻址,
根据存储器数据宽度的不同,向存储器发送的地址也有所不同。
由于 TFT 屏使用的是16位数据宽度,因此 ADDR[0] 并没有用到
相当于 ADDR[25:1] 用来寻址存储器的 FMC_A[24:0],以16bit为单位的空间
至于于 ADDR[27:26] 的设置,当使用 FMC_NE1 来连接外部设备的时候,是直接在寄存器中配置区域1 的寄存器组。
FMC 的 SRAM/NOR FLASH 控制器支持同步突发访问和异步突发访问两种方式。
同步突发访问:
FMC 将 系统时钟HCLK 分频后,发送给外部存储器作为 同步时钟信号FMC_CLK。此时需要设置的时间参数有时钟分频系数(CLKDIV)、获取第1个数据所需要的等待延迟(DATLAT)。
异步突发访问:
FMC 主要设置 3 个时间参数:
地址建立时间(ADDSET)、数据建立时间(DATAST) 和 地址保持时间(ADDHLD)。
FMC综合了 SRAM、PSRAM和 NOR Flash 产品的信号特点,定义了 4 种不同的异步时序模型。选用不同的时序模型时,需要设置不同的时序参数。
具体的读写时序就不放了,时序一确定,把 FMC 当作桥梁,访问 LCD 外设。
FMC寄存器
BANK控制寄存器 BCR1/2/3/4
32位寄存器,
EXTMOD:扩展模式使能。是否允许读写时序分开控制(是否启用BWTR)。
WREN:写使能位。
MTYP[1:0]: 存储器类型。00 SRAM 01 PSRAM 10 FLASH 11 保留
MBKEN:存储块使能位。
BANK时序寄存器 BTR1/2/3/4
时序寄存器包含了每个存储器块的控制信息。如果 BCR 中设置了 扩展模式使能EXTMOD,则有 时序寄存器BTR 用来读 和 写时序寄存器BWTR 用来写。
控制读操作的相关时序,需要用到:
ACCMOD[1:0]:访问模式A/B/C/D。
DATAST[7:0]:数据保持时间。0为保留设置。其他设置代表保存时间多少个HCLK时钟周期。最大255个时钟周期。其实就是时序中读信号RD的持续时间。
ADDSET[3:0]:地址建立时间。最大15个HCLK周期。其实就是RD高电平持续时间。
BANK写时序寄存器 BWTR1/2/3/4
写时序寄存器BWTR 和 时序寄存器WTR 类似,也是 访问模式、数据保持时间、地址建立时间 这三个设置。数据保持时间和地址建立时间对应的是 WR 高/低电平的持续时间。
注意事项
MDK将FMC的寄存器组合成 BTCR[8]寄存器组,他们的对应关系如下:
BTCR[0]对应 FMC_BCR1,BTCR[1]对应 FMC_BTR1
BTCR[2]对应 FMC_BCR2,BTCR[3]对应 FMC_BTR2
BTCR[4]对应 FMC_BCR3,BTCR[5]对应 FMC_BTR3
BTCR[6]对应 FMC_BCR4,BTCR[7]对应 FMC_BTR4
FSMC和FMC的区别
这是 FMC接口 的存储器映射图像。
FSMC 只支持
0x6000 0000 ~ 0x6FFF FFFF,
0x7000 0000 ~ 0x7FFF FFFF, (SRAM)
0x8000 0000 ~ 0x8FFF FFFF, (FLASH)
0x9000 0000 ~ 0x9FFF FFFF (PC)
4 个256M 的块。
FMC 可以额外支持 (SDRAM)
0xC000 0000 ~ 0xCFFF FFFF
0xD000 0000 ~ 0xDFFF FFFF
2 个256M 的块
STM32F429芯片带有LTDC控制器,可以直接外接RGB屏,实现液晶驱动。