嵌入式LCD软件驱动流程与调试

前言

        LCD屏在嵌入式中是应用比较广泛的,很多电子产品都是需要用到它来进行人机交互,那么工作中我们就少不了要对lcd进行软件驱动和调试。调试LCD需要掌握的学问有很多,没有一定的调试经验就很难对问题进行分析并解决。

博文推荐

LCD屏接口与模式详解:干货超多

1.查阅屏驱数据手册

下面均以st7789的屏驱为例来作说明

1.1 获取屏基本信息

首先,拿到一块需要调试的屏,我们需要先查阅它的datasheet,获取屏的基本信息

如下图所示,我们可以直接获取到

显示分辨率为240*RGB(H)*320(V),是个竖屏;

帧内存大小为240 x 320 x 18-bit=1,382,400 bits;

像素数据的数据格式可以是RGB444、RGB565 和 RGB666;

屏接口模式有MCU、RGB、SPI接口等;

屏VGH、VGL等的电压范围(初始化需配置)。

这些都是我们需要知道的,确定LCD显示器的型号和参数,还有其他一些特性可以简单过一遍。

1.2 查阅初始化命令及数据参数

在datasheet中可以查看到初始化中配置屏驱相应寄存器的命令和数据参数,调试过程中改的最多的就是这些,需要去熟悉,通常这部分有不懂的地方可以找屏厂fae支持。

1.3 配置屏寄存器

如下图所示,

RST为屏的复位信号接口;

CS为片选信号;

SCL、SDA分别为时钟线和数据线。

通常对屏寄存器的配置接口为SPI或者I2C接口协议,这里以SPI接口为例,如果主控没有spi功能的pin引脚,可以任意引出3个gpio口,将其模拟SPI协议输出,分别模拟cs、scl和sda。

SPI接口时序图

驱动部分软件驱动代码如下,这里使用的是gpio模拟spi协议。

static void lcd_gpio_spi_config_write(unsigned char bit_9,unsigned char cmd)
{int i=0;unsigned char cmd_val = 0;gpio_spi_disable_cs();//csusleep(10);gpio_spi_init_clk();//sckgpio_spi_enable_cs();usleep(2);if(st7789v2dev.spi_is_9bit == 1){gpio_spi_set_mosi(bit_9);//sda dat=0usleep(3);gpio_spi_generate_clk();}for(i=8;i>0;i--){cmd_val = (cmd>>(i-1))&0x1;gpio_spi_set_mosi(cmd_val);usleep(2);gpio_spi_generate_clk();}usleep(2);gpio_spi_disable_cs();gpio_spi_set_mosi(0);usleep(10);
}void st7789_init()
{............st7789v2_write_command(0x2B);// 分辨率设置st7789v2_write_data(0x00);st7789v2_write_data(0x00);st7789v2_write_data(0x01);st7789v2_write_data(0x3F);st7789v2_write_command(0x2A);//分辨率设置st7789v2_write_data(0x00);st7789v2_write_data(0x00);st7789v2_write_data(0x00);st7789v2_write_data(0xEF);st7789v2_write_command(0x21); //反色st7789v2_write_command(0x29); //开显示
}

1.4 模式Timing参数设置

在HV模式中,通常我们还需要去设置它的行、场信号的前后延、像素时钟等参数

如下图所示,Data bus中有部分数据是Invaild无效的数据,所以配置Timing前后沿的作用就是避开这些无效数据,配置参数值可以参考datasheet中给的参考值设定

每个平台的配置方法都有些差异,示例参考代码:

output-clock = <9>;h-total-len = <314>;
v-total-len = <348>;h-active-len = <240>;
v-active-len = <320>;h-front-len = <18>;
h-sync-len = <46>;
h-back-len = <10>;v-front-len = <8>;
v-sync-len = <10>;
v-back-len = <10>;
/* bool type, 0 or 1*/
h-sync-level = <0>;
/* bool type, 0 or 1*/
v-sync-level = <0>;
active-polarity = <1>;

1.5 配置GPIO

最后我们需要将使用到的gpio口配置成相对应的功能,如rgb数据口,根据查看主控端数据手册,将相应gpio配置为rgb功能口。

如果使用的是linux框架,可以在dts上进行配置,如:

rgb {pinmux-active = <PINPAD_T01 PINMUX_T01_PRGB_R2PINPAD_T02 PINMUX_T02_PRGB_R3PINPAD_T03 PINMUX_T03_PRGB_R4PINPAD_T04 PINMUX_T04_PRGB_R5PINPAD_T05 PINMUX_T05_PRGB_R6PINPAD_T06 PINMUX_T06_PRGB_R7PINPAD_T09 PINMUX_T09_PRGB_G2PINPAD_T00 PINMUX_T00_PRGB_G3PINPAD_T11 PINMUX_T11_PRGB_G4PINPAD_T12 PINMUX_T12_PRGB_G5PINPAD_T13 PINMUX_T13_PRGB_G6PINPAD_T14 PINMUX_T14_PRGB_G7PINPAD_L01 PINMUX_L01_PRGB_B2PINPAD_L02 PINMUX_L02_PRGB_B3PINPAD_L03 PINMUX_L03_PRGB_B4PINPAD_L04 PINMUX_L04_PRGB_B5PINPAD_L05 PINMUX_L05_PRGB_B6PINPAD_L06 PINMUX_L06_PRGB_B7PINPAD_L07 PINMUX_L07_PRGB_CLKPINPAD_L08 PINMUX_L08_PRGB_HSYNPINPAD_L09 PINMUX_L09_PRGB_VSYNCPINPAD_L10 PINMUX_L10_PRGB_DE>;status = "okay";};

2. LCD屏调试

2.1 屏不显示

1.首先确定硬件连线是否有问题,屏本身是否排线问题是坏的,把硬件问题排除完后,那剩下的只能是软件驱动的问题了;

2.用万用表测量屏电压、VGH、VGL等电压范围是否正常,不正常的话在初始化中根据相应的命令去配置电压值;

3.初始化配置寄存器是否有配置进去,这个可以使用逻辑分析仪看CS、CLK、SDA的数据是否正常;

4.如果是HV模式,行、场信号的极性配置不对也可以造成不显示,或异常。

2.2 屏显示异常

2.2.1 闪屏

可能的原因有LCD刷新频率过低、LCD刷新时序不稳定、LCD刷新数据不同步等。

可以有提高刷新频率(加大像素时钟输出)或降低分辨率、优化刷新时序或使用同步信号、使用双缓冲或DMA传输等。

2.2.2 花屏

可能的原因有LCD数据线干扰、LCD数据信号错误、LCD数据缓冲区溢出等。

可以使用屏蔽线或抗干扰措施、校验数据信号或纠正错误、增加数据缓冲区或清空缓冲区;

有时候颜色显示不正常,也可能是屏驱给反色了,可以去配置寄存器。

总结

总之,调屏我们需要掌握基本的驱动流程,如果遇到问题就一步步排除可能的原因,其它有很多细节点,是需要去积累经验的,调试多了自然就懂了。

如果本文理解上有不对的地方,欢迎指出,共同进步!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/181954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shell脚本完成内容筛选并下载

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

Linux:虚拟机安装Ubuntu系统

一、下载Ubuntu 地址&#xff1a;https://cn.ubuntu.com/download/desktop 二、安装 以上配置完成后&#xff0c;点击完成按钮&#xff0c;接下来就是一段较长时间的等待安装过程。 安装完成后&#xff0c;还有一些系统性配置。 系统配置非常简单&#xff0c;全部next即可。…

使用Typecho搭建个人博客网站,并内网穿透实现公网访问

使用Typecho搭建个人博客网站&#xff0c;并内网穿透实现公网访问 文章目录 使用Typecho搭建个人博客网站&#xff0c;并内网穿透实现公网访问前言1. 安装环境2. 下载Typecho3. 创建站点4. 访问Typecho5. 安装cpolar6. 远程访问Typecho7. 固定远程访问地址8. 配置typecho 前言 …

DHCP协议讲解(含DHCP状态机)

加个目录 一、概述 大家都知道&#xff0c;为了使用TCP/IP协议族&#xff0c;每台主机和路由器需要一定的配置信息。 下面是一个简单的例子&#xff1a; 某学校的教学办公区域将要布置数百台计算机&#xff0c;每台都需要分配IP&#xff0c;如何实现对这些数量巨大的主机进…

哈希_快乐数

//编写一个算法来判断一个数 n 是不是快乐数。 // // 「快乐数」 定义为&#xff1a; // // // 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 // 然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。 // 如果…

Seata简介与常用模式解决方案概述

Seata 是什么? Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。 Seata事务管理中有三个重要的角色&#xff1a; TC (Transaction Coordinator) - 事务协调者&#xff1a;维护全局和分支事务的状态&#xff0c;协调全局事务提…

挑战传统IT:RPA以更低的成本和更高的效率领跑数字化转型

在企业数字化进程中&#xff0c;传统的IT解决方案往往带来高成本和低效率的问题。因此&#xff0c;如何顺利地、平稳地进行数字化转型对企业来说是核心考虑。 为此&#xff0c;本文将深入探讨RPA&#xff08;Robotic Process Automation&#xff09;如何以其独特的优势&#xf…

牛客 算法题 golang语言实现

题目 HJ101 输入整型数组和排序标识&#xff0c;对其元素按照升序或降序进行排序 描述 输入整型数组和排序标识&#xff0c;对其元素按照升序或降序进行排序数据范围&#xff1a; 1 ≤ &#xfffd; ≤ 10001≤n≤1000 &#xff0c;元素大小满足 0 ≤ &#xfffd; &#…

CONTROLLING VISION-LANGUAGE MODELS FOR MULTI-TASK IMAGE RESTORATION

CONTROLLING VISION-LANGUAGE MODELS FOR MULTI-TASK IMAGE RESTORATION (Paper reading) Ziwei Luo, Uppsala University, ICLR under review(6663), Cited:None, Stars: 350, Code, Paper. 1. 前言 像CLIP这样的视觉语言模型已经显示出对零样本或无标签预测的各种下游任务…

AutoDIR: Automatic All-in-One Image Restoration with Latent Diffusion

AutoDIR: Automatic All-in-One Image Restoration with Latent Diffusion (Paper reading) Yitong Jiang, The Chinese University of Hong Kong, arXiv23, Code, Paper 1. 前言 我们提出了一种具有潜在扩散的一体化图像恢复系统&#xff0c;名为AutoDIR&#xff0c;它可以…

西南科技大学信号与系统A实验三(线性连续时间系统的分析)

一、实验目的 1.掌握用 matlab 分析系统时间响应的方法 2.掌握用 matlab 分析系统频率响应的方法 3.掌握系统零、极点分布与系统稳定性关系 二、实验原理 1. 系统函数 H(s) 系统函数:系统零状态响应的拉氏变换与激励的拉氏变换之比. H(s)=R(s)/E(s) 在 matlab 中可采用…

图片伪装,将RAR文件隐藏到图片里

下载链接 效果图&#xff1a; 代码&#xff1a; ECHO OFF TITLE PtoR MODE con COLS55 LINES25 color 0A:main cls echo.当前时间&#xff1a;%date% %time% echo.欢迎使用图片伪装&#xff0c;本脚本可以将RAR文件隐藏到图片里. echo.set /p "imagefile①请拖入图像文件…

数据仓库数据管理模型

数据仓库分为贴源层、数据仓库层、数据服务层&#xff0c;有人叫做数仓数据模型&#xff0c;或者叫"数据管理模型”。 我们为什么要进行数据分层管理&#xff0c;下图的优点介绍已经说得比较明确&#xff0c;再补充几点&#xff1a; 保障数据一致性&#xff1a;上层的数…

最简单的Python程序员编辑器——学习Python的第二篇

第二章 基础 安装python 按照上一期的教程安装&#xff0c;如果有什么问题可以提出阿莱 安装完之后&#xff0c;在电脑的程序中查找SHELL 这里是Win10&#xff0c;win11你也是到程序菜单查找。 你可以把把它点击右键&#xff0c;保存到桌面上&#xff0c;或者固定到开始菜单…

数组元素积的符号

数组元素积的符号 描述 : 已知函数 signFunc(x) 将会根据 x 的正负返回特定值&#xff1a; 如果 x 是正数&#xff0c;返回 1 。如果 x 是负数&#xff0c;返回 -1 。如果 x 是等于 0 &#xff0c;返回 0 。 给你一个整数数组 nums 。令 product 为数组 nums 中所有元素值的…

leetcode 283. 移动零

代码&#xff1a; class Solution {public void swap(int[] nums,int m,int n){int tmpnums[m];nums[m]nums[n];nums[n]tmp;}public void moveZeroes(int[] nums) {int cur0;int dest-1;int nnums.length;for(;cur<n;cur){if(nums[cur]!0){dest;swap(nums,cur,dest);}}} } …

数字系列——数字经济(2)​

上次呢&#xff0c;已经为大家捋了什么是数字经济&#xff1f;、数字经济的特点有哪些&#xff1f;和数字经济的构成&#xff0c;对于数字经济有了基础性的了解&#xff0c;今天继续为大家捋一捋。 数字经济的发展 1.互联网的普及 互联网作为数字经济的坚实基础&#xff0c;其…

香港身份、香港永居身份、香港护照区别,三种证件之间是什么关系?

香港身份、香港永居身份、香港护照区别&#xff0c;三种证件之间是什么关系&#xff1f; 在港“通常性”住满7年之后&#xff0c;可以申请永居身份&#xff01; 香港身份&#xff1a;也可以称之为临时身份&#xff0c;无论通过香港优才计划、高才通计划、专才计划或者留学拿身份…

基于QT的俄罗斯方块游戏设计与实现

基于QT的俄罗斯方块游戏设计与实现 摘要&#xff1a;信息时代正处于高速发展中&#xff0c;而电子游戏已经成为人生活中或不可少的消磨工具之一。科技时代在不断地高速发展中&#xff0c;游戏相关编程设计也随着发展变得越来越重要&#xff0c; 俄罗斯方块游戏是一款古老传遍世…

引领Serverless构建之路,亚马逊云科技re:Invent 2023首日主题演讲重磅发布

在每年的亚马逊云科技re:lnvent大会&#xff0c;由Peter DeSantis带来的《周一晚间直播》是re:lnvent大会的第一个并让人值得期待的主题演讲。作为亚马逊云科技高级副总裁&#xff0c;Peter发布了数据库和应用领域的三项Serverless创新&#xff0c;使客户能够更快、更轻松地扩展…