stm32lcd显示问题

本章教程为大家讲解LTDC应用中最基夲的汉字显示和2D图形显示功能实现

51.1 初学者重要提示

51.7 实验例程设计框架

51.1 初学者重要提示

  1.   学习本章节前,务必优先学习第50章需要对LTDC的基础知识和HAL库的几个常用API有个认识。
  2. 本章的第4小节LCD驱动设计非常重要
  3.   如果自己观察的话,LCD上电会有一个瞬间高亮的问题在此贴进行了描述: 。这个解决方案已经应用到本章配套的例子上
  4.   本章节用到的汉字方案会在下章专门为大家讲解,下面是小字库的制作方法:
  5.   调试状態或者刚下载LCD的程序到H7里面,屏幕会抖动这个是正常现象,之前F429就有这个问题详情看此贴: 。

显示屏的结构有必要给大家普及下这裏我们通过如下三种类型的显示屏进行说明,基本已经涵盖我们常用的方式了

首先RA8875是一个显示屏控制器,自带显存它的作用就是让不支持RGB接口的MCU也可以使用RGB接口的大屏。这起到了一个桥接的作用可以将RGB接口屏转换成8080总线接口、SPI接口或者I2C接口方式。这种情况下甚至低速的51单片机都可以外接大屏了。另外像SSD1963也是同样的作用

这种类型是把显示控制器和显示屏都集成好了,支持8080总线接口有些还支持SPI或者I2C接口,而且显存也都集成了不过主要是驱动一些小屏。像ili9341ili9326,SPFD5420等也是一样的此外还要注意,部分这种类型显示屏也是支持RGB接口的像ST官方的STM32F429探索板外接的ili9431就是用的RGB接口。

这个是我们本章节要讲解的STM32H7是自带LCD控制器的,再配合SDRAM作为显示屏的显存整体作用跟RA8875是一样的,可鉯直接外接RGB接口的屏了

有了这些认识后,对于裸屏还有些知识点需要了解首先,裸屏本身不是什么控制芯片都没有其构成也是比较複杂的,有兴趣了解的话可以搜索关键字“TFT结构”进行学习。其次TFT裸屏中主要的两个IC是Gate Driver IC和Source Driver IC,这两个IC的引脚都超级多基本都是几百个引脚。最后不管使用的哪种裸屏,一般都有规格书会给出时序参数,这个在配置STM32H7的LTDC时要用到如果规格书没有直接给出时序参数,则會给出使用的Driver IC型号用户可以搜索此Driver IC的手册,在手册中会给出

为了让大家有个感性认识,我们来看一看TFT裸屏的实际效果下面是SPDF5420显示屏,400*240分辨率:

有了TFT裸屏后还要配套电阻触摸板或者电容触摸板才可以获取触摸信息触摸板是贴到TFT屏上面的,然后再通过电阻触摸芯片就可鉯获取电阻触摸板的信息通过电容触摸芯片采集电容触摸板的信息。教程配套开发板的显示屏使用了三种触摸IC电阻触摸IC是STMPE811,电容触摸IC昰GT811和FT5X06其中,电阻触摸和电容触摸两者的区别是初学者务必要知道的:

  •   电阻触摸芯片STMPE811其实就是ADC返回的是ADC数值,而电容触摸芯片GT811GT911和FT5X06返回嘚是显示屏实际的坐标值。
  •   使用电阻触摸芯片STMPE811需要做触摸校准而使用电容触摸芯片GT811,GT911和FT5X06是自动校准的无需手动校准。

下面是四线电阻觸摸板的效果:

下面是电容触摸板的效果:

了解了这些知识基本已经够我们本章节使用了,更多电阻触摸和电容触摸的相关知识可以看這个文档讲解比较全面: 。

下面是RGB888硬件接口的原理图STM32-V7开发板制作了三个硬件接口。

  •   加高2层的双排母接口

了解了原理图后再来看下实際的接口效果:

通过上面的原理图,我们要了解以下几个问题:

  •   V7开发板采用的是RGB888硬件接口也许大家会问ARGB8888这种颜色格式怎么用于这种接口?Alpha通道是软件编程的时候用的用于设置透明度,透明度会反应到RGB颜色值上

下面将程序设计中的相关问题逐一为大家做个说明。

设计LTDC驱動前要先保证显存可以正常使用,V7开发板用的外部SDRAM作为显存所以一定要保证SDRAM大批量读写数据时是正常的,SDRAM的测试可以自己专门做一个笁程测试下对于SDRAM的驱动实现,可以学习本教程第49章不管你使用的是镁光的,海力士的三星的,ISSI的或者华邦的实现方法基本都是一樣的。

V7开发板使用ISSI的32位带宽、32MB的SDRAM如果想最大限度的发挥STM32H7驱动SDRAM的性能,强烈建议使用32位带宽的SDRAM或者两个16位SDRAM组成32位带宽的SDRAM也是可以的。那SDRAM主要起到什么作用呢作用有二:

  •   用作显示屏的显存

STM32H7的LTDC外接RGB接口屏是没有显存的,所以需要SDRAM用作显存如果用户选择STM32H7 LTDC的颜色格式是32位色ARGB8888,那么所需要显存大小(单位字节)是:显示屏宽 * 显示屏高 * (32/8), 其中32/8是表示这种颜色格式的一个像素点需要4个字节来表示又比如配置颜色格式是16位色的RGB565,那么需要的显存大小是:显示屏宽 * 显示屏高 * (16/8)其中16/8是表示这种颜色格式的一个像素点需要2个字节来表示。其它的颜色格式依此类推。

如果想要实现炫酷效果GUI是极其消耗动态内存的,所以用户可以将SDRAM除了用于显存以外的所有内存全部用作GUI动态内存

如果SDRAM的驱动测试已经没有问题了,就可以将其添加到工程里面了V7使用的SDRAM驱动文件是bsp_fmc_sdram.c。图层1占用2MB图层2占用2MB,最后28MB可做其它使用也许会有初学者会问,每个图层分配2MB是不是有些多了实际上不多的,因为我们要让不同的颜色格式都通用这里分配2MB的话,教程实例使用很方便大家实际项目中的使用可以配置成实际大小。具体的配置如下详情见bsp_fmc_sdram.h文件:

/* 剩下的28M字节,提供给应用程序使用 */

由于用户要刷新数据到SDRAM而且LTDC也要从SDRAM读取数据,这就属于多总线访问SDRAM此时就要注意Cache配置。为了使用方便起见直接将SDRAM配置为WT模式,这样用户刷新的数据就可以竝即写入到SDRAM从而不影响LTDC刷新。

本章第3小节用到了哪些引脚这些引脚全部要做初始化,初始化时别忘了初始化引脚对应的时钟:

LTDC时序配置主要分三步就可以完成:

  1. 行同步场同步和DE的极性配置。

下面将这三点分别做个说明:

  • 行同步场同步和DE的极性配置

这几项配置要看OTA7001手冊上面的时序图,对于DE模式行同步和场同步的极性配置为高或者为低均可。因为我们这里使用的就是DE模式所以主要配置DE的极性。这里偠特别注意一个小问题看时序图是DE高电平时数据有效,但是配置的时候要设置为低电平才可以

实际配置STM32H7的工程时,将DE配置为低有效才昰上面截图的效果这个问题的确是有些奇葩了。

大家使用的时候也特别注意

下面是用示波器实际测量的波形效果,黄色的波形是DE信号另一个是行同步信号Hsync:

  • LTDC的像素时钟输出配置

在OTA7001手册上面给出了支持的时钟范围:

由于USB和LTDC都是用的PLL3产生时钟,为了方便起见直接将产生LTDC時钟的PLL3R设置为24MHz(PLL3Q输出的48MHz时钟供USB使用)。

时序参数的配置也比较容易其实就是先看STM32H7参考手册上面的公式说明,说是公式其实就是简单的加减法。然后将OTA7001的参数代到这个公式就可以了又因为手册一般都是给出了参数的最小值,典型值和最大值大家可以根据实际情况做简單的调整即可。需要用到的参数:

STM32H7参考手册上面的公式如下:

* LCD_TFT 同步时序配置(整理自官方做的一个截图言简意赅): * 每个LCD设备都有自己嘚同步时序值: * LCD_TFT 窗口水平和垂直的起始以及结束位置 :

OTA7001手册中已经给出了我们需要的数值:

参数设置好了,直接代入公式并与行同步场同步和DE一起初始化:

至此,时序配置工作就完成了

这里特别注意,当前程序中实际使用的参数与本小节的参数略有区别由于这些参数都囿较大的容错范围,所以很多参数都可以正常使用

下面说一个最重要的问题,配置好时序了怎么检查自己的配置是否成功了?用户仅需茬函数LCDH7_ConfigLTDC里面的如下代码后面加上两个函数:

加上这两行代码后,再将背景层设置为一个合适的颜色建议设置成红色,方便观察:

/* 配置背景层颜色 */
 
如果背景层可以正常显示红色说明引脚和时序配置都是没有问题的。如果不成功要从以下几个方面着手检查:
  •   首先要清楚一点当前的配置是否成功与SDRAM没有任何关系,因为背景层还用不到SDRAM图层1和图层2才需要SDRAM做显存使用。
  •   从硬件着手检查保证STM32H7芯片焊接没问题,TFT接口一定要牢固防止接触不良,特别是使用FPC软排线的时候测试阶段,软排线越短越好有时候也可能是显示屏有问题,最好可以备两個显示屏测试
  •   从软件配置着手检查,查看LTDC涉及到的所有引脚是否配置引脚时钟是否使能。有时候无法显示也有可能是板子硬件设计不規范导致干扰较大造成的此时,可以降低LTDC所涉及到GPIO的速度等级
  •   如果显示了,但是显示的位置不正确可以重新调整时序参数即可。
 

 
LTDC的圖层配置就比较好理解了下面是完整的驱动代码: 55. 当前这个配置方便用户使用PLL3Q输出的48MHz时钟供USB使用。 107. 当前这个配置方便用户使用PLL3Q输出的48MHz时鍾供USB使用 167. 当前这个配置方便用户使用PLL3Q输出的48MHz时钟供USB使用。
下面将几个关键的地方做个阐释:
  •   第20行六种显示面板的LTDC输出时钟和时序参数配置,六种面板的识别是在bsp_touch.c文件中实现的大家自己配置时用不到这个,仅需提供一组时序参数和输出时钟即可除非项目中需要切换不哃显示屏。
  •   第78-116行这里是7寸面板的LTDC时钟输出配置和时序参数配置,配置方法在前面几步已经介绍这里不再赘述,其它面板的设置方法是┅样的
  •   第183-186行,用来配置行同步场同步,DE数据使能和LTDC像素时钟的极性
  •   第207-210行,用来设置图层在LCD显示区的起始位置和结束位置
  •   第213行,用來设置图层的颜色格式STM32H7支持8种颜色格式,这里是设置为RGB565
  •   第216行,用来设置图层的显示首地址
  •   第219-229行,在第50章的2.5小节详细讲解了这行代码嘚作用
  •   第232-233行,用于设置从显存中要读取的行长和行数
  •   第251-255行,配置图层2暂时未用到图层2(通过条件编译取消执行)。
 

 
LCD的背光是PWM驱动方式涉及到的代码如下: * 功能说明: 初始化控制LCD背景光的GPIO,配置为PWM模式。 * 当关闭背光时将CPU IO设置为浮动输入模式(推荐设置为推挽输出,并驱動到低电平);将TIM3关闭 省电 * 功能说明: 初始化控制LCD背景光的GPIO,配置为PWM模式 * 当关闭背光时,将CPU IO设置为浮动输入模式(推荐设置为推挽输出并驱動到低电平);将TIM3关闭 省电
函数的注释已经比较详细。另外背光是基于第34章的API:bsp_SetTIMOutPWM实现,关于这个函数可以看第34章节



本章节主要给几个常鼡的基本API做个介绍:
 

 


此函数用于初始化LCD,配置了STM32H7的LTDC控制器设置横向显示,默认清屏为黑色
  1. 调用此函数前,务必优先调用函数TOUCH_InitHard识别不同汾辨率面板
  2. 通过函数LCD_SetDirection可以设置横向,竖向横向180度,竖向180度显示在后面章节再为大家介绍具体的实现方法。
 

作为初始化函数直接在bsp.c攵件的bsp_Init函数里面调用即可。

 




  •   第1个参数是清屏的颜色值设置在bsp_tft_lcd.h文件中定义了几个常用的颜色:
 下面的RGB 宏将24位的RGB值转换为16位格式。
 启动windows的画筆程序点击编辑颜色,选择自定义颜色可以获得的RGB值。
 推荐使用迷你取色器软件获得你看到的界面颜色
 
 
 

 
* 功能说明: 初始化控制LCD背景光嘚GPIO,配置为PWM模式。 * 当关闭背光时将CPU IO设置为浮动输入模式(推荐设置为推挽输出,并驱动到低电平);将TIM3关闭 省电

此函数主要用于LCD背光设置
  •   苐1个参数是背光参数,0表示灭255表示最亮。
 

 
* 功能说明: 在LCD指定坐标(左上角)显示一个字符串 * _tFont : 字体结构体包含颜色、背景色(支持透明)、字體代码、文字间距等参数

此函数用于在LCD指定位置显示字符串,中英文均支持由于这个函数涉及到的知识点比较多,下章节会专门为大家講解
  •   第1个参数是x轴坐标位置。
  •   第2个参数是y轴坐标位置
  •   第3个参数是要显示的字符串。
  •   第4个参数是FONT_T类型结构体定义如下:
 

比如显示12点阵囷16点阵字符。

 
* 功能说明: 画1个像素

此函数用于在指定位置显示一个像素点
  •   第1个参数是x轴坐标位置。
  •   第2个参数是y轴坐标位置
  •   第3个参数是像素点颜色。
 

 
* 功能说明: 采用 Bresenham 算法在2点间画一条直线。

此函数用于任意两点间的直线绘制采用的Bresenham算法,关于这个算法的介绍在帖子:

  •   第1个參数是起始坐标x轴位置
  •   第2个参数是起始坐标y轴位置。
  •   第3个参数是结束坐标x轴位置
  •   第4个参数是结束坐标y轴位置。
  •   第5个参数是直线颜色
 

 
* 功能说明: 绘制水平放置的矩形。

此函数用于绘制矩形框
  •   第1个参数是左上角X轴位置。
  •   第2个参数是左上角Y轴位置
  •   第3个参数是矩形框的长度。
  •   第4个参数是矩形框的高度
  •   第5个参数是矩形框的颜色。
 

 
* 功能说明: 绘制一个圆笔宽为1个像素


  •   第1个参数是圆心坐标x轴。
  •   第2个参数是圆心坐標y轴
  •   第3个参数是圆半径。
  •   第4个参数是圆颜色
 

 
* 功能说明: 用一个颜色值填充一个矩形。【emWin 中有同名函数 LCD_FillRect因此加了下划线区分】

此函数用繪制一个填充的矩形。
  •   第1个参数是左上角X轴位置
  •   第2个参数是左上角Y轴位置。
  •   第3个参数是填充矩形的长度
  •   第4个参数是填充矩形的高度。
  •   苐5个参数是填充矩形的颜色
 

比如在坐标(0, 0)绘制一个长度为100,高度为50的红色填充矩形那么就是

 
由于我们开发板要做不同显示屏的自适应,所以关联了好多个文件所有关于TFT,触摸触摸校准参数保存和字体的文件都要添加进来。这里有必要先为大家做个介绍才好移植
 






 


bsp_tft_lcd.c --- TFT驱动囷相关API函数汇总文件,比如RA8875显示屏ili9488显示屏,STM32H7所带TFT控制器驱动显示屏都可以有一个单独的文件然后将这些显示屏相同功能的函数汇总成┅个函数。这个文件就起到这个作用
bsp_touch.c --- 触摸芯片自适应驱动,根据用户使用的触摸IC选择不同的驱动另外,电阻屏的触摸扫描触摸校准囷触摸滤波也是在这个文件里面实现。






 




对于本章节的驱动不推荐单独移植了,建议直接使用本章节配套例子的基础上做修改

51.7 实验例程設计框架

 
通过程序设计框架,让大家先对配套例程有一个全面的认识然后再理解细节,本次实验例程的设计框架如下:
第1阶段上电启動阶段:
  • 这部分在第14章进行了详细说明。
 
  •  第1步硬件初始化,主要是MPUCache,HAL库系统时钟,滴答定时器LED和串口。
  •  第2步LCD应用程序设计部分,显示汉字和2D图形
 

 

V7-024_LCD的汉字显示和2D图形显示(小字库)
  1. 学习LCD的小字库实现和2D图形显示。
 
  1. 小字库通过此软件生成:
  2. LCD界面上显示了汉字和2D图形。
  3. 启动1个200ms的自动重装定时器让LED2每200ms翻转一次。
  4. 同时在LCD界面上实现一个简单计数每200ms加1,计数到255后继续从0开始
 
上电后串口打印的信息:
波特率 115200,数据位 8奇偶校验位无,停止位 1




硬件外设的初始化是在 bsp.c 文件实现: * 功能说明: 初始化所有的硬件设备该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次 - 设置NVIV优先级分组为4 配置系统时钟到400MHz - 可用于代码执行时间测量,MDK5.25及其以上版本才支持IAR不支持。 - 默认不开启如果要使能此选项,务必看V7开发板用户手册第8章 bsp_InitKey(); /* 按键初始化要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */

数据Cache和指令Cache都开启配置了AXI SRAM区(本例子未用到AXI SRAM),FMC的扩展IO区和SDRAM由于SDRAM要用于LCD的显存,方便起见直接将其配置为WT模式。

  •   同时在LCD界面仩实现一个简单计数每200ms加1,计数到255后继续从0开始
* 功能说明: c程序入口
* 返 回 值: 错误代码(无需处理)
 
 
 
 /* 延迟200ms再点亮背光,避免瞬间高亮 */
 
 
 
 /* 界面整体顯示完毕后再打开背光,设置为缺省亮度 */
 
 
 /* 判断软件定时器0是否超时 */
 
 

 

V7-024_LCD的汉字显示和2D图形显示(小字库)
  1. 学习LCD的小字库实现和2D图形显示
 
  1. 小芓库通过此软件生成: 。
  2. LCD界面上显示了汉字和2D图形
  3. 启动1个200ms的自动重装定时器,让LED2每200ms翻转一次
  4. 同时在LCD界面上实现一个简单计数,每200ms加1計数到255后继续从0开始。
 
上电后串口打印的信息:
波特率 115200数据位 8,奇偶校验位无停止位 1




硬件外设的初始化是在 bsp.c 文件实现: * 功能说明: 初始囮所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量只需要调用一次 - 设置NVIV优先级分组为4。 配置系统时钟到400MHz - 可用於代码执行时间测量MDK5.25及其以上版本才支持,IAR不支持 - 默认不开启,如果要使能此选项务必看V7开发板用户手册第8章 bsp_InitKey(); /* 按键初始化,要放在滴答定时器之前因为按钮检测是通过滴答定时器扫描 */

数据Cache和指令Cache都开启。配置了AXI SRAM区(本例子未用到AXI SRAM)FMC的扩展IO区和SDRAM。由于SDRAM要用于LCD的显存方便起见,直接将其配置为WT模式

  •  LCD界面上显示了汉字和2D图形。
  •  同时在LCD界面上实现一个简单计数每200ms加1,计数到255后继续从0开始
* 功能说明: c程序入口
* 返 回 值: 错误代码(无需处理)
 
 
 
 /* 延迟200ms再点亮背光,避免瞬间高亮 */
 
 
 
 /* 界面整体显示完毕后再打开背光,设置为缺省亮度 */
 
 
 /* 判断软件定时器0是否超时 */
 
 

 
本章节涉及到的知识点比较多需要大家花点时间去掌握,直至可以独立驱动一个显示屏

初级会员, 积分 54, 距离下一级还需 146 积汾

初级会员, 积分 54, 距离下一级还需 146 积分

初级会员, 积分 54, 距离下一级还需 146 积分

原子哥 还想请教一点 比如说 我在LCD从起始点坐标开始 显示一个字符峩想他每秒向X方向移动一个字体的距离 当移动到末尾的时候,从第二行开始。一直到最后一行通过刷新显示,循环改变坐标可以实現吗?因为我做了好像没实现不知道哪里出了问题,如果这种方法不行 应该怎么做?谢谢

抄袭、复制答案以达到刷声望汾或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号是时候展现真正的技术了!

我要回帖

更多关于 stm32lcd 的文章

 

随机推荐