打印
[其他ST产品]

STM32F4使用FSMC驱动4.3寸触摸屏(HAL库+CubeMX)

[复制链接]
3032|79
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
o88ne|  楼主 | 2023-6-27 14:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
、前言

        最近一个项目需要用到触摸屏,然后手头恰好有一个正点原子家的4.3寸触摸屏,就是下图这个:



这是一个8080接口的TFT-LCD屏幕,可以用8080接口来驱动,也可以用stm32的FSMC(可变静态存储控制器——Flexible Static Memory Controller)接口来驱动,具体有关FSMC时序感兴趣的话可以去网上查,我这里就不再赘述了(我也不是很懂~)。然后它的触摸(touch)是采用IIC来进行通信的,比较奇怪的一点是PCBA上丝印却写着MOSI & MISO & SCK & CS,一度让我以为它是用SPI来通信。。。


使用特权

评论回复
沙发
o88ne|  楼主 | 2023-6-27 14:34 | 只看该作者
   然后手头还有一块STM32F4的最小系统板,类似下图这种:



主控芯片是STM32F407ZGT6,1M的flash以及192k的sram,恰好它有一个TFT接口,所以这两个搭配在一起可以满足我的需求。

使用特权

评论回复
板凳
o88ne|  楼主 | 2023-6-27 14:34 | 只看该作者
2、硬件连接
        在移植前,必要的步骤是连线。说实话这要连30多根杜邦线挺让人头疼的。。。下面先来看一下二者的原理图以及部分必要的资料。

使用特权

评论回复
地板
o88ne|  楼主 | 2023-6-27 14:34 | 只看该作者
LCD原理图:

使用特权

评论回复
5
o88ne|  楼主 | 2023-6-27 14:35 | 只看该作者
部分参数以及驱动芯片(稍微看看就好,主要是驱动芯片型号):

使用特权

评论回复
6
o88ne|  楼主 | 2023-6-27 14:35 | 只看该作者
stm32f4的LCD驱动原理图:

使用特权

评论回复
7
o88ne|  楼主 | 2023-6-27 14:36 | 只看该作者
然后这里的FSMC对应主控引脚比较乱,可以将就看一下:




使用特权

评论回复
8
o88ne|  楼主 | 2023-6-27 14:36 | 只看该作者
上面的原理图部分比较乱,,,细心找一下对应引脚还是能够找出来的。用途就是待会开启FSMC的时候需要对应引脚,防止选错了别的引脚。下面放一张详细的引脚对应图:



使用特权

评论回复
9
o88ne|  楼主 | 2023-6-27 14:36 | 只看该作者
图中3.3V和GND连接就不用解释了,仔细检查别连错了就行(不然就准备出魔法烟雾了~);然后NC表示(Normal Close)不需要连接;D0~D15表示16bit的数据线,对应连接就可以了;另外屏幕的V5引脚需要接到板子上的5V来给背光供电,否则屏幕不会亮的(被坑过...);RST复位引脚、BLK背光引脚对应连接;重点来了:上方的RD、RS、WR、CS于下方的FSMC_A6、FSMC_NOE、FSMC_NE4、FSMC_NWE怎么连呢?

使用特权

评论回复
10
o88ne|  楼主 | 2023-6-27 14:37 | 只看该作者
如下图:     以上就是屏幕显示部分的连线,下面来说一下touch部分的连线;其实是对应相连就好了,主要是要仔细检查一下是否连错线。CLK->T_SCK、MOSI->TMOSI、TCS->T_CS、PEN->T_PEN 然后NC和T_MISO是不用连接的(吐槽:明明是I2C通信,你就写SCL和SDA嘛,你写个MOSI和MISO啥意思啊,这不是纯纯坑人吗?它这里的SCK就是I2C里的SCL线,MOSI就是SDA线,然后CS是片选,PEN是读取触摸的时候使用,而MISO不需要连接)

使用特权

评论回复
11
o88ne|  楼主 | 2023-6-27 14:37 | 只看该作者
3、使用STM32CUBEMX & HAL库来驱动屏幕
        接下来用stm32cubemx来驱动屏幕:

首先开启外部晶振:

使用特权

评论回复
12
o88ne|  楼主 | 2023-6-27 14:37 | 只看该作者
打开串行调试接口:

使用特权

评论回复
13
o88ne|  楼主 | 2023-6-27 14:38 | 只看该作者
配置系统时钟(记住要选中HSE外部晶振,然后输入168M,再一直敲回车就行):

使用特权

评论回复
14
o88ne|  楼主 | 2023-6-27 14:38 | 只看该作者
选中Connectivity中的FSMC:

使用特权

评论回复
15
o88ne|  楼主 | 2023-6-27 14:38 | 只看该作者
然后选NOR Flash/.../LCD1,重点来了:Chip Select选择NE4,这是因为前面连线步骤中连的是FSMC_NE4,需要一一对应;Memory type选择LCD接口;同理,LCD Register Select选择A6,这是因为连的是FSMC_A6;最后Data选择16bit,数据位宽16位(D0~D15一共16根线):

使用特权

评论回复
16
o88ne|  楼主 | 2023-6-27 14:39 | 只看该作者
选完之后才会弹出Configuration,参数照抄就行(我也不知道怎么解释):

使用特权

评论回复
17
o88ne|  楼主 | 2023-6-27 14:39 | 只看该作者
选完之后才会弹出Configuration,参数照抄就行(我也不知道怎么解释):

使用特权

评论回复
18
o88ne|  楼主 | 2023-6-27 14:39 | 只看该作者
最后选择背光引脚,来控制屏幕的亮灭:




最后设置好Project Manager之后就可以愉快地Generate Code了~

使用特权

评论回复
19
o88ne|  楼主 | 2023-6-27 14:39 | 只看该作者
4、代码移植
        博主用的是原子家的代码,然后“略微”修改(开玩笑,CV战士可不是盖的),这里主要讲一下移植过程需要修改的地方,总的代码太长了,放上来影响观感,而且也很难看。(文末有链接,直接下载源工程;ps:最讨厌那种设置ji fen下载的,开源相互学习不好么hhh~)

        正点原子家的屏幕驱动代码是3个文件(不包含touch),分别是lcd.c、lcd.h以及font.h;拿到代码之后添加到自己工程中,font.h是字库文件,不需要修改;lcd.h是函数原型声明、宏定义、类型定义以及一些全局变量,也不需要怎么修改;重点是lcd.c源文件:首先找到HAL_SRAM_MspInit函数,然后全部注释掉,因为cubemx已经全部帮我们生成了;然后找到初始化函数LCD_Init,将所有初始化FSMC的部分注释掉,因为cubemx也已经全部生成了;

使用特权

评论回复
20
o88ne|  楼主 | 2023-6-27 14:40 | 只看该作者
最后找到LCD_Init函数的最尾部,关注点亮背光的那一句:

LCD_LED=1;                                //点亮背光
如果屏幕不亮的话,尝试改为LCD_LED=0;我这款板子就是下图这样:

如果给1的话三极管是不导通的,所以屏幕点不亮;所以要给0才能点亮。最后在主函数初始化部分调用LCD_Init();即可初始化屏幕显示。

使用特权

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

本版积分规则

62

主题

423

帖子

3

粉丝