打印
[其他ST产品]

如何使用STM32 HAL库驱动TFT-LCD实现手画板功能

[复制链接]
1653|62
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
STM32L4简介
STM32L476RGT6是64脚的单片机,GPIO的数量有50多个,这么多的GPIO,拿来驱动一个26个引脚的8080端口TFT彩屏是可以的。STM32的C、K、R系列的芯片是不带FSMC(可变静态存储控制器),因此这三类STM32单片机只能采用IO模拟方式驱动TFT彩屏;

STM32L476RGT6内部的Flash大小为1MB,也就是说可以存储的const数组大小大约为0.9MB,可以存储0.9MB的const数组是什么概念呢,一张320x240的16位色BMP图片占用为320x240x16/8=153600B=150KB,而800x600的16位色BMP图片占用为800x600x16/8=937.5KB=0.91MB,就是说这个L476RGT6可以存放一张0.91MB的800x600的16位色BMP图片的const数组于内部Flash里面。

TFT-LCD简介
我们通过STM32的普通IO口模拟8080总线来控制TFT-LCD的显示。我们使用的是正点原子的2.8寸ALIENTEK TFT-LCD模块, 16位真彩显示,自带触摸屏,可以用来作为控制输入。该模块支持65K色显示,显示分辨率为320×240,接口为16位的8080并口,自带触摸屏(电阻触摸屏)。


  • 模块实物图如下所示:



使用特权

评论回复
沙发
等你下课|  楼主 | 2023-11-21 00:01 | 只看该作者
原理图如下所示(参考正点原子官方的文档):

使用特权

评论回复
板凳
等你下课|  楼主 | 2023-11-21 00:01 | 只看该作者
模块接口图如下所示:TFTLCD模块采用2*17的2.54公排针与外部连接。

使用特权

评论回复
地板
等你下课|  楼主 | 2023-11-21 00:01 | 只看该作者
ALIENTEK TFTLCD模块采用16位的并口方式与外部连接,之所以不采用8位的方式,是因为彩屏的数据量比较大,尤其在显示图片的时候,如果用8位数据线,就会比16位方式慢一倍以上。

使用特权

评论回复
5
等你下课|  楼主 | 2023-11-21 00:01 | 只看该作者
TFT-LCD显示实验
触摸屏芯片的接口如下所示:

CS:TFTLCD片选信号。
WR:向TFTLCD写入数据。
RD:从TFTLCD读取数据。
D[15:0]:16位双向数据线。
RST:硬复位TFTLCD。
RS:命令/数据标志(0,读写命令;1,读写数据)。

使用特权

评论回复
6
等你下课|  楼主 | 2023-11-21 00:02 | 只看该作者
模块的RST信号线是直接接到STM32的复位脚上,并不由软件控制,这样可以省下来一个IO口。另外我们还需要一个背光控制线来控制TFTLCD的背光。所以,我们总共需要的IO口数目为21个。这里还需要注意,标注的DB1~DB8,DB10~DB17,是相对于LCD控制IC标注的,实际上可以把他们就等同D0~D15(按从小到大顺序)。

使用特权

评论回复
7
等你下课|  楼主 | 2023-11-21 00:02 | 只看该作者
数据线有用的是:D17~D13和D11~D1,D0和D12没有用到,实际上在LCD模块里面,ILI9341的D0和D12压根就没有引出来,ILI9341的D17~D13和D11~D1对应MCU的D15~D0。 这样MCU的16位数据,最低5位代表蓝色,中间6位为绿色,最高5位为红色。

使用特权

评论回复
8
等你下课|  楼主 | 2023-11-21 00:02 | 只看该作者
数值越大,表示该颜色越深。另外,特别注意ILI9341所有的指令都是8位的(高8位无效),且参数除了读写GRAM的时候是16位,其他操作参数,都是8位的,这个和ILI9320等驱动器不一样,必须加以注意。

使用特权

评论回复
9
等你下课|  楼主 | 2023-11-21 00:02 | 只看该作者
这里指令不在做详细叙述了,正点原子官方网站可以下载。

TFTLCD使用流程如下所示:

使用特权

评论回复
10
等你下课|  楼主 | 2023-11-21 00:02 | 只看该作者
任何LCD,使用流程都可以简单的用以上流程图表示:

硬复位和初始化序列,只需要执行一次即可。
画点流程为:设置坐标 > GRAM指令 > 写入颜色数据,完成后就能在LCD上看到对应的点显示我们写入的颜色了。
读点流程为:设置坐标  > 读GRAM指令 > 读取颜色数据,这样就可以获取到对应点的颜色数据了。

使用特权

评论回复
11
等你下课|  楼主 | 2023-11-21 00:02 | 只看该作者
以上只是最简单的操作,也是最常用的操作,有了这些操作,一般就可以正常使用TFTLCD了。接下来我们将该模块用来来显示字符和数字,通过以上介绍,我们可以得出TFTLCD显示需要的相关设置步骤如下:

使用特权

评论回复
12
等你下课|  楼主 | 2023-11-21 00:02 | 只看该作者
设置STM32与TFT-LCD模块相连接的IO。
这一步,先将我们与TFTLCD模块相连的IO口进行初始化,以便驱动LCD。这里需要根据连接电路以及TFTLCD模块的设置来确定。

使用特权

评论回复
13
等你下课|  楼主 | 2023-11-21 00:03 | 只看该作者
2. 初始化TF-TLCD模块。
这里我们没有硬复位LCD,因为我们将TFT-LCD的RST同STM32的RESET连接在一起了,只要按下开发板的RESET键,就会对LCD进行硬复位。初始化序列,就是向LCD控制器写入一系列的设置值(比如伽马校准),这些初始化序列一般LCD供应商会提供给客户,我们直接使用这些序列即可,不需要深入研究。在初始化之后,LCD才可以正常使用。

使用特权

评论回复
14
等你下课|  楼主 | 2023-11-21 00:03 | 只看该作者
  3.通过函数将字符和数字显示到TFT-LCD模块上。
即:设置坐标,写GRAM指令,写GRAM来实现,但是这个步骤,只是一个点的处理,我们要显示字符/数字,就必须要多次使用这个步骤,从而达到显示字符/数字的目标,所以需要设计一个函数来实现数字/字符的显示,之后调用该函数,就可以实现数字/字符的显示了。

使用特权

评论回复
15
等你下课|  楼主 | 2023-11-21 00:03 | 只看该作者
4.TFTLCD模块与IO口的对应关系如下所示。

使用特权

评论回复
16
等你下课|  楼主 | 2023-11-21 00:03 | 只看该作者
    5. 软件设计
首先,我们介绍一下lcd.h里面的一个重要结构体:

使用特权

评论回复
17
等你下课|  楼主 | 2023-11-21 00:03 | 只看该作者
该结构体用于保存一些LCD重要参数信息,比如LCD的长宽、LCD ID(驱动IC型号)、LCD横竖屏状态等,这个结构体虽然占用了14个字节的内存,但是却可以让我们的驱动函数支持不同尺寸的LCD,同时可以实现LCD横竖屏切换等重要功能,所以还是利大于弊的。

使用特权

评论回复
18
等你下课|  楼主 | 2023-11-21 00:03 | 只看该作者
6.ILI93xx.c函数介绍
有了以上了解,下面我们开始介绍ILI93xx.c里面的一些重要函数。

第一个是LCD_WR_DATA函数:该函数在lcd.h里面,通过宏定义的方式申明。该函数通过8080并口向LCD模块写入一个16位的数据,使用频率是最高的,这里我们采用了宏定义的方式,以提高速度。其代码如下

使用特权

评论回复
19
等你下课|  楼主 | 2023-11-21 00:04 | 只看该作者
上面函数中的‘\’是C语言中的一个转义字符,用来连接上下文,因为宏定义只能是一个串,而当你的串过长(超过一行的时候),就需要换行了,此时就必须通过反斜杠来连接上下文。这里的‘\’正是起这个作用。在上面的函数中,LCD_RS_SET/ LCD_CS_CLR/ LCD_WR_CLR/ LCD_WR_SET/ LCD_CS_SET等是操作RS/CS/WR的宏定义,均是采用STM32的快速IO控制寄存器实现的,从而提高速度。

使用特权

评论回复
20
等你下课|  楼主 | 2023-11-21 00:04 | 只看该作者
第二个是:LCD_WR_DATAX函数:该函数在lcd.c里面定义,功能和LCD_WR_DATA一模一样,该函数代码如下:

使用特权

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

本版积分规则

34

主题

389

帖子

0

粉丝