深入理解stm32f407之FSMC

来源:互联网 发布:java web敏捷开发框架 编辑:程序博客网 时间:2024/06/08 06:35

首先为什么stm32f407通过FSMC可以控制TFTLCD?要回答这个问题,首先要理解FSMC是什么东西,你可以把它简单理解为外部存储器的控制器,有了它stm32f407就能轻易地读写外部存储器,外部存储器的控制线一般有:地址线(A0-A18)、数据线(D0-D15)、写信号线(WE)、读信号线(OE)、片选信号(CS)。而TFTLCD是通过8080并口来实现数据读写,其中主要的一些信号线包括片选信号(CS)、写信号线(WR)、读信号线(RD)、数据线(D0-D15)、命令/数据标志(RS)、硬复位(RST)。由上面对比可知,TFTLCD与普通外部存储器的区别在于TFTLCD没有地址线,但是多了一根命令/数据标志线,所以当我们把标志线连接到FSMC上地址线时,FSMC就能如同控制外部存储器一样控制TFTLCD。

了解了FSMC控制TFTLCD的原理后,再深入了解FSMC的内部结构和相关寄存器,最后结合代码分析验证相关寄存器的功能。

stm32f4的FSMC支持8、16、32位数据宽度,同时它将外部存储器划分为固定大小为256M字节的四个存储快,总共管理了1GB,如下图所示:

这以里以Bank 1为例,每个块分为4个区,每个区管理64M字节空间,每个区都有独立的寄存器对所连接的的寄存器进行配置。Bank 1的256M字节空间由28根地址线寻址。

(256M=256*1024KB=256*1024*1024B = 2^8*2^10*2^10 = 2^28),这28根地址线是内部AHB地址总线(HADDR),HADDR【25:0】来自外部存储器地址FSMC_A[25:0],而HADDR【2:6:27】对4个区寻址,如下图所示:


要注意的是,当 Bank1 接的是 8 位宽度存储器的时候:HADDR[25:0]-> FSMC_A[25:0]。

当 Bank1 接的是 16 位宽度存储器的时候:HADDR[25:1]->FSMC_A[24:0],这是因为HADDR地址总线是以8个字节为单位寻址的,而外部寄存器每个地址有16位,要让他们的地址相匹配的话,就必须把HADDR地址总先减少一半,也就是右移一位。(在没有发生以为的情况下,右移以为相当于除于2),另外,HADDR[27:26]的设置,是不需要我们干预的,比如:当你选择使用 Bank1 的第三个区,即使用 FSMC_NE3 来连接外部设备的时候,即对应了 HADDR[27:26]=10,我们要做的就是配置对
应第3区的寄存器组,来适应外部设备即可。FSMC各个Bank所需配置的寄存器如下表所示:



有上图可知:对于NOR_FLASH控制器,主要是通过FSMC_BCRX,FSMC_BTRX,FSMC_BWTRX寄存器设置,通过这三个寄存器,可以设置FSMC

访问外部存储器的时序参数。