简介
FSMC(Flexible Static Memory Controller,可变静态存储控制器),相当于是STM32单片机对外部存储器的一个控制接口。
你可以直接简单粗暴地理解为STM32预留的一个对外存储器进行操作的接口,这样的好处就是我们只需要把线接上,而并不用去关心单片机与存储器通信的时序,这样只要我们配置好了对外的是那种类型的存储器,只需要在程序中发送数据,引脚就会自动切换发送我们想要发送的数据。这样使用起来十分地方便。
框图
存储器的映像地址
注意这个很重要,因为我们在后面使用 LCD 80接口的几根线是不能完全对上的,必须要做一些小的修改。
为什么可以用来驱动8080接口的LCD?
这里我们来对比一下8080的时序图,和我们STM32 自带的FSMC 在SRAM模式下 A模式的时序图
这是 8080 的写时序图
然后看下 SRAM模式下的A模式的写时序图
我们可以看到 写时序基本是一致的,但是这里有个问题,我们有发现LCD有RS线而没有地址线;FSMC有地址线但是没有RS线。那么我们要怎么解决这个问题呢?其实很简单,只要选出一根地址线用作与LCD的RS线即可。
这里解释一下为什么可以使用地址线来代替LCD的RS线
打个比方,我使用的是A10地址线作为我的LCD的RS线,此时我想要往LCD当中写数据,写数据就要求我们的RS线是置0的,但是我们总不能直接拉低这个IO口吧。所以我们在0x6000 0800的位置上写数据
因为我们软件上的地址都是要反应到物理硬件上去的,所以说我们往这个地址写内容的话 bit12就会被置1,为什么是bit12而不是bit11呢?因为我么传输的是16位数据,所以需要向右移1位。
如何配置?
首先我们选择配置的外设内存类型是 NOR/PSRAM,这部分的地址我们可以在上图得到:
6000 000h--- 6FFF FFFFh 一共是4 X 64MB 的地址空间
这里我们选择第四个存储块
我使用板子是正点原子F103系列的开发板,这里使用的是16位数据传输
注意:当 Bank1 接的是 16 位宽度存储器的时候: HADDR[25:1]→ FSMC_A [24:0],这就意味单片机内部定义的地址和我们引出IO口物理地址是偏移了一位的,这就需要我们在后面操作的时候,将对应的数据位都整体向右移一位。(我也不是很理解,看了网上的一些说法是为了更加灵活使用而设计的)
这里我使用的正点原子的开发板是 将RS接到了A10,CS接到了NE4
这样也没有关系我们软件上按照他的配置来就行了
这里只提一个重要的点
这里需要注意的是 我们结构体内的LCD_REG 以及 LCD_RAM,他们的数据大小都是两个字节,所以指针在递增的时候是+2,这也就解释了为什么是0x000007FE 而不是 0x000007FF,只要看懂这个基本上就没啥大问题了。
使用CubeMX配置
首先找到FSMC
然后选择第四块区域
然后开始选择数据位和地址,这个地址你只要超过A10就可以了
然后打开拓展使能,因为我们这里读写都给他设置一下
这里讲一下上面几个配置信息
第一个 Address setup time 是你读操作时 建立地址所持续的时间
第二个 DATA setup time 是你数据在总线上维持的有效时间
下面的就是写操作了
这里的时间是 (1/72M)*n 要看你液晶芯片的数据手册来确定建立时间,我没看,直接搬的正点原子的时间,然后生成之后,在给一大堆初始化命令就可以啦。
小结
学习的过程中还是挺多坎坷的,有很多概念不理解,一点小错可能就要花费一个下午找bug T.T。不管怎么说,保持进步吧~ _~