嵌入式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,一经查实,立即删除!

相关文章

Vue3 反应性全套基础知识都单独附带实例

在Vue3中&#xff0c;反应性&#xff08;Reactivity&#xff09;是其核心特性之一&#xff0c;它使得数据和视图之间的同步变得非常简单。以下是Vue3反应性的全套基础知识以及相应的实例&#xff1a; 响应式对象&#xff1a;在Vue3中&#xff0c;我们可以使用reactive函数来创…

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

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

【题解】洛谷 CF11D A Simple Task

CF11D 题目解题思路A Simple Task题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 分析Code更多方法 题目 原题链接 解题思路 A Simple Task 题面翻译 求无向图中的简单环个数&#xff0c;保证不存在重边和自环。 简单环&#xff1a;除起点外&#…

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;如何实现对这些数量巨大的主机进…

fastjson 怎么把List<User> 和 json字符串 相互转换 请提供代码

fastjson 怎么把List 和 json字符串 相互转换 请提供代码 FastJSON&#xff08;阿里巴巴的 JSON 库&#xff09;可以轻松实现 List<User> 和 JSON 字符串之间的相互转换。以下是一些简单的代码示例&#xff1a; 将 List 转为 JSON 字符串&#xff1a; import com.alib…

哈希_快乐数

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

Pytorch:torch.optim详解

本篇笔记主要介绍torch.optim模块&#xff0c;记录学习过程 在深度学习中&#xff0c;我们通常会使用优化算法来调整神经网络的权重和偏差&#xff0c;以便模型能够更好地拟合训练数据。torch.optim是PyTorch中的一个模块&#xff0c;它提供了各种优化算法的实现&#xff0c;用…

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

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

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

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

记一次mysql 3306端口映射到外网 frp

通过下面命令启动被访问机器的frp nohup ./frps -c ./frps.toml & 记一次mysql 3306端口映射到外网 坑 mysql本身没有配置远程访问 frp配置错误&#xff0c;没注意中文单引号和英文单引号的区别 mysql本身没有配置远程访问 问题 navacat 远程链接mysql 出现 Lost c…

Camunda 7.x 系列【58】自定义表单设计器

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 前言2.表单设计器3. 案例演示3.1 引入流程设计器3.2 表单数据存储3.3 测试1. 前言 Camu…

牛客 算法题 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;它可以…

sql23(Leetcode2356每位教师所教授的科目种类的数量)

代码&#xff1a; # Write your MySQL query statement below select teacher_id,count(distinct(subject_id)) as cnt from Teacher group by teacher_id

YoloV7改进策略:RefConv打造轻量化YoloV7利器

文章目录 摘要论文:《RefConv: 重参数化的重聚焦卷积》1、简介2、相关研究2.1、用于更好性能的架构设计2.2、结构重参数化2.3、权重重参数化方法3、重参数化的重聚焦卷积3.1、深度RefConv3.2、普通的RefConv3.3、重聚焦学习4、实验4.1、在ImageNet上的性能评估4.2、与其他重参…

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

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

GZ031 应用软件系统开发赛题第10套

2023年全国职业院校技能大赛 应用软件系统开发赛项&#xff08;高职组&#xff09; 赛题第10套 工位号&#xff1a; 2023年4月 竞赛说明 一、项目背景 党的二十大报告指出&#xff0c;要加快建设制造强国、数字中国&#xff0c;推动制造业高端化、智能化、…