李小川希比的个人空间 https://bbs.21ic.com/?1270694 [收藏] [复制] [RSS]

日志

STM32 -- -- FSMC 的内存映射 (有未明白问题!!!)

已有 782 次阅读2017-9-22 00:18 |个人分类:电小二的征程之STM32|系统分类:单片机

部分摘抄自https://www.mianbaoban.cn/blog/post/13157

接上一个日志:FSMC最大的优点可能在于它可以满足很多的外设的通行协议,因此可以广泛利用。
18.1.2 FSMC简介

大容量,且引脚数在100脚以上的STM32F103芯片都带有FSMC接口,ALIENTEK战舰STM32开发板的主芯片为STM32F103ZET6,是带有FSMC接口的。

FSMC,即灵活的静态存储控制器,能够与同步或异步存储器和16位PC存储器卡接口,STM32的FSMC接口支持包括SRAM、NAND FLASH、NOR FLASH和PSRAM等存储器。FSMC的框图如图1所示:

 

                                                        图1  FSMC框图

       从上图我们可以看出,STM32的FSMC将外部设备分为3类:NOR/PSRAM设备、NAND设备、PC卡设备。他们共用地址数据总线等信号,他们具有不同的CS以区分不同的设备,比如本章我们用到的TFTLCD就是用的FSMC_NE4做片选,其实就是将TFTLCD当成SRAM来控制。

这里我们介绍下为什么可以把TFTLCD当成SRAM设备用:首先我们了解下外部SRAM的连接,外部SRAM的控制一般有:地址线(如A0~A18)、数据线(如D0~D15)、写信号(WE)、读信号(OE)、片选信号(CS),如果SRAM支持字节控制,那么还有UB/LB信号。而TFTLCD的信号我们在18.1.1节有介绍,包括:RS、D0~D15、WR、RD、CS、RST和BL等,其中真正在操作LCD的时候需要用到的就只有:RS、D0~D15、WR、RD和CS。其操作时序和SRAM的控制完全类似,唯一不同就是TFTLCD有RS信号,但是没有地址信号。

TFTLCD通过RS信号来决定传送的数据是数据还是命令,本质上可以理解为一个地址信号,比如我们把RS接在A0上面,那么当FSMC控制器写地址0的时候,会使得A0变为0,对TFTLCD来说,就是写命令。而FSMC写地址1的时候,A0将会变为1,对TFTLCD来说,就是写数据了。这样,就把数据和命令区分开了,他们其实就是对应SRAM操作的两个连续地址。当然RS也可以接在其他地址线上,战舰STM32开发板是把RS连接在A10上面的。

STM32的FSMC支持8/16/32位数据宽度,我们这里用到的LCD是16位宽度的,所以在设置的时候,选择16位宽就OK了。我们再来看看FSMC的外部设备地址映像,STM32的FSMC将外部存储器划分为固定大小为256M字节的四个存储块,如图2 所示:

 

                                    图2  FSMC存储块地址映像

       从上图可以看出,FSMC总共管理1GB空间,拥有4个存储块(Bank),本章,我们用到的是块1,所以在本章我们仅讨论块1的相关配置,其他块的配置,请参考《STM32参考手册》第19章(324页)的相关介绍。

       STM32的FSMC存储块1(Bank1)被分为4个区,每个区管理64M字节空间,每个区都有独立的寄存器对所连接的存储器进行配置。Bank1的256M字节空间由28根地址线(HADDR[27:0])寻址(地址总线是这样的:一根地址线,代表一个bit位,n位宽度的地址总线可寻址范围是2的n次方个地址。比如:若只有一根地址总线,那么可以索引地址0、地址1的两个内存地址若有两根地址总线,那么可以索引2^2=4个内存地址:00、01、10、11。 以此类推,30位地址总线,能够索引2的30次方个地址,即1G内存地址空间。然而这里为甚么是28根地址线呢? )。   这里HADDR是内部AHB地址总线,其中HADDR[25:0]来自外部存储器地址FSMC_A[25:0],而HADDR[26:27]对4个区进行寻址。如下所示:

Bank1所选区

片选信号

地址范围

HADDR

[27:26]

[25:0]

第1区

FSMC_NE1

0X6000,0000~63FF,FFFF

00

FSMC_A[25:0]

第2区

FSMC_NE2

0X6400,0000~67FF,FFFF

01

第3区

FSMC_NE3

0X6800,0000~6BFF,FFFF

10

第4区

FSMC_NE4

0X6C00,0000~6FFF,FFFF

11

表18.1.2.1 Bank1存储区选择表

       表18.1.2.1中,我们要特别注意HADDR[25:0]的对应关系:(这部分还是不大明白!

当Bank1接的是16位宽度存储器的时候:HADDR[25:1]à FSMC[24:0]。

当Bank1接的是8位宽度存储器的时候:HADDR[25:0]à FSMC[25:0]。

不论外部接8位/16位宽设备,FSMC_A[0]永远接在外部设备地址A[0]。 这里,TFTLCD使用的是16位数据宽度,所以HADDR[0]并没有用到,只有HADDR[25:1]是有效的,对应关系变为:HADDR[25:1]à FSMC[24:0],相当于右移了一位,这里请大家特别留意。另外,HADDR[27:26]的设置,是不需要我们干预的,比如:当你选择使用Bank1的第三个区,即使用FSMC_NE3来连接外部设备的时候,即对应了HADDR[27:26]=10,我们要做的就是配置对应第3区的寄存器组,来适应外部设备即可。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)