打印
[应用相关]

STM32硬件基础--FSMC/FMC总线控制器

[复制链接]
1279|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
【海东青电子原创**,转载请注明出处:https://www.jianshu.com/p/62d1ef042d0c
TouchGFX是一套图形中间件代码,属于嵌入式软件范畴,它不可避免的要跟STM32的硬件资源发生联系,在使用STM32CUBEMX配置TouchGFX时,要配置FMC(FSMC)、显示接口(DSI或LTDC等)、QSPI等,就是这个原因。归纳起来,TouchGFX主要用到的MCU的资源有:
1)内存(RAM):为了处理图像,需要RAM来作为图像的缓存(buffer)。这个RAM,可以是MCU片内的,也可以是片外扩展的。LCD的显示像素一般都比较多,需要的RAM也比较大,所以TouchGFX应用基本上都需要MCU扩展RAM,而MCU与RAM最方便的连接方式就是通过FMC(或FSMC)接口。
2)显示接口(DSI或LTDC等)。
3)代码和静态图形存储区。实际应用中,可能要用到不止一个背景图形,这些图形资源被编译到代码中,存储在flash里。如果MCU的片内flash不够用,就需要外扩flash,常用的接口是QSPI。



作者:海东青电子
链接:https://www.jianshu.com/p/62d1ef042d0c
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

使用特权

评论回复
沙发
functions|  楼主 | 2020-6-24 14:51 | 只看该作者
了解了上述几个接口,再使用CUBEMX配置TouchGFX时,就容易的多了。我们先从配置FMC接口开始,并且从F103具有的FSMC开始,因为它更简单一些。

使用特权

评论回复
板凳
functions|  楼主 | 2020-6-24 14:52 | 只看该作者
FSMC,Flexible Static Memory Controller,灵活的静态存储控制器,是MCU里的一个硬件结构,它的作用主要是简化了连接外设的接口。如果使用过IIC总线,就会知道,大致有2种使用IIC的方式:一种是用2根IO口线模拟IIC的时序、用户自己写相关的代码。另一种方法是,利用MCU提供的IIC总线控制器,先配置好IIC有关的一些控制寄存器(可以使用CUBEMX),然后通过HAL函数(或中断)直接读写IIC数据即可。后者是“流程化”的,是IIC操作的标准流程,使用起来更方便,也更稳定。

使用特权

评论回复
地板
functions|  楼主 | 2020-6-24 14:53 | 只看该作者
FSMC于此类似,它包含了连接外设(静态RAM,NOR,NAND)所必须的接口信号:

1)片选信号CS;

2)数据总线D0-D15(16bit,也支持8-bit);

3)地址总线(可以跟数据总线复用,接LCD显示屏时,经常用来配置LCD的指令信号,见下面例子);

4)读信号;

5)写信号。

使用特权

评论回复
5
functions|  楼主 | 2020-6-24 14:53 | 只看该作者
本例中,我们将实现STM32F103通过FSMC接口对 ILI9325 (ILI9320) 显示屏的驱动,接口示意图如下:

使用特权

评论回复
6
functions|  楼主 | 2020-6-24 14:54 | 只看该作者
对于 ILI9325 ,还需要一个reset复位信号,将MCU的一个GPIO配置成输出模式,并与 LCD 连接即可。

使用特权

评论回复
7
functions|  楼主 | 2020-6-24 14:54 | 只看该作者
先来看看STM32F103的FSMC的结构(从103的用户手册中截图):

使用特权

评论回复
8
functions|  楼主 | 2020-6-24 15:07 | 只看该作者
为了简化,我们只关心 NOR/SRAM 部分:

使用特权

评论回复
9
functions|  楼主 | 2020-6-24 15:07 | 只看该作者
其中,做了标记的信号线是实例中要用到的。下面结合一个具体的例子来说明这些信号线的用法。本例是一个STM32F103通过FSMC连接了一个 ILI9325 LCD。在STM32F103板子上,MCU与LCD接口电路如图:

使用特权

评论回复
10
functions|  楼主 | 2020-6-24 15:08 | 只看该作者
MCU电路:

使用特权

评论回复
11
functions|  楼主 | 2020-6-24 15:08 | 只看该作者
16根数据线D0-D15不多说了,这里重点说一下几个控制信号:

使用特权

评论回复
12
functions|  楼主 | 2020-6-24 15:09 | 只看该作者
上表说明了读、写、片选信号是如何对应MCU的管脚编号的(是pin脚的复用功能,通过CUBEMX配置FSMC时,这些pin的复用功能被自动配置好了)。RS控制信号需要单独解释一下:RS用来告诉 ILI9325 控制器,当前收到MCU送来的数据是“命令”、还是“数据”(详见 ILI9325 数据手册),MCU与RS信号连接有2种方式:一种是通过一个MCU的GPIO与RS相连,每次MCU向 ILI9325 发送数据之前,都根据是发送命令、还是数据,对应地设置GPIO为0或1;另一种方法是将MCU的一个地址线(本例中是A16)与RS相连,并且在代码中使用与该地址线(A16)对应的“地址”来访问 ILI9325 即可(下面的代码会详述如何实现)。

使用特权

评论回复
13
functions|  楼主 | 2020-6-24 15:11 | 只看该作者
A16对应的pin如下:

使用特权

评论回复
14
functions|  楼主 | 2020-6-24 15:12 | 只看该作者
下面开始使用CUBEMX配置STM32F103的FSMC:

使用特权

评论回复
15
functions|  楼主 | 2020-6-24 15:14 | 只看该作者
使用外部晶振:

使用特权

评论回复
16
functions|  楼主 | 2020-6-24 15:15 | 只看该作者
FSMC的配置:

使用特权

评论回复
17
functions|  楼主 | 2020-6-24 15:16 | 只看该作者
FSMC的NOR(这里用来驱动LCD)区块部分,内部又分成了4个“子区块”:

使用特权

评论回复
18
functions|  楼主 | 2020-6-24 15:17 | 只看该作者
这里要注意FSMC占用的地址,这是一个32位的地址,连接不同的外设,FSMC对应地使用不同的地址,比如连接NOR的话,MCU内部地址是从0x6000 0000 开始的,如果连接的是NAND,则地址是0x7000 0000 。

使用特权

评论回复
19
functions|  楼主 | 2020-6-24 15:17 | 只看该作者
而NOR的内部又分成了4个部分,起始地址由32位地址的bit[27:26]决定,用二进制表示为:

Bank1:0110-0000 0000-0000 0000-0000 0000-0000 ,即 60 00 00 00;

Bank1:0110-0100 0000-0000 0000-0000 0000-0000 ,即 64 00 00 00;

Bank2:0110-1000 0000-0000 0000-0000 0000-0000 ,即 68 00 00 00;

Bank3:0110-1100 0000-0000 0000-0000 0000-0000 ,即 6c 00 00 00;

使用特权

评论回复
20
functions|  楼主 | 2020-6-24 15:18 | 只看该作者
本例中使用的是Bank1,则地址范围为0x6000 0000-0x63ff ffff (共64M个byte地址)。对应的,访问这个地址空间时,FSMC自动输出NE1片选信号(即,PD7输出0)。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

446

帖子

1

粉丝