STM32移植LVGL踩坑集锦

2023-11-03

这篇文章我主要讲解一下我在移植LVGL时所遇到的一些坑以及解决方法。LVGL的移植过程可以参考我前面的文章,http://t.csdn.cn/QSVOO。

第一个

问题:
在lvgl8.1以前的版本可能会出现MY_DISP_HOR_RES 和 MY_DISP_VER_RES 未定义的报错。
解决方法:
lvgl.conf.h 头文件里定义即可
在这里插入图片描述lvgl8.1以后的版本不需要我们自己添加了,它已经在lv_port.disp.c定义好了我们只需要修改成我们自己的屏幕参数。
在这里插入图片描述

第二个

问题:
报错提示内存不足
在这里插入图片描述解决方法:
1、修改lvgl可用内存的大小,在lv_conf.h中修改LV_MEM_SIZE的值,修改后的样子(原来是128U*1024U)
在这里插入图片描述2、增大STM32的空间,在stm32f407xx.s(我这里用的是STM32F407的板子)文件中修改,修改后的样子:
在这里插入图片描述

第三个

问题:
移植好后编译下载发现屏幕显示是乱的,这是lv_port_disp.c里的disp_flush函数修改错误导致的。
在这里插入图片描述我原来用正点原子的F103的精英板移植用这个方法显示是正常的,我现在换了其他板子和屏幕也用同样的方法结果就显示不正常了。
在这里插入图片描述
这里在disp_flush函数里添加的函数是填充指定颜色函数LCD_Draw_Picture,函数原型如下:

/****************************************************************************
* 名    称: void LCD_Draw_Picture(u16 sx,u16 sy,u16 ex,u16 ey,u16 *color)
* 功    能:在指定区域内画入图片
* 入口参数:(sx,sy),(ex,ey):填充矩形对角坐标
            color:要填充的图片像素颜色数组
* 返回参数:无
* 说    明:区域大小为:(ex-sx+1)*(ey-sy+1)  
****************************************************************************/
void LCD_Draw_Picture(u16 sx,u16 sy,u16 ex,u16 ey,u16 *color)
{  
	u16 height,width;
	u16 i,j;
	width=ex-sx+1; 			    //得到图片的宽度
	height=ey-sy+1;			    //得到图片的高度
 	for(i=0;i<height;i++)
	{
 		LCD_SetCursor(sx,sy+i); //设置光标位置 
		LCD_WriteGRAM();        //开始写入GRAM
		for(j=0;j<width;j++)
		   LCD_DATA=color[i*height+j];//写入颜色值
	}	  
}  

错误的显示效果。
在这里插入图片描述

解决方法
我当时在这里卡了好久,后来在百度上看到一位大佬的方法,他不是用的指定颜色填充函数而是用的颜色打点函数。于是我就想我用这个方法是否可行呢?一试,果然可以。修改过后的样子:
在这里插入图片描述颜色打点函数原型如下:

/****************************************************************************
* 名    称: void LCD_Color_DrawPoint(u16 x,u16 y,u16 color)
* 功    能:在设置的坐标处画相应颜色(在该点写入自定义颜色)
* 入口参数:x:x坐标
            y:y坐标
            color 此点的颜色值
* 返回参数:无
* 说    明:color:写入此点的颜色值   GUI调用该函数
****************************************************************************/
void LCD_Color_DrawPoint(u16 x,u16 y,u16 color)
{	       
	 LCD_DrawPoint(x,y);
	 LCD_CMD=write_gramcmd; 
	 LCD_DATA=color;  
}	

编译下载。显示效果正常
在这里插入图片描述

添加触摸功能

lv_port_indev.c文件就是跟触摸有关的。在lv_port_indev.c文件里添加自己的触摸函数的头文件。在lv_port_indev.c文件中找到lv_port_indev_init函数,进行修改。这里只添加触摸功能,所以把其他功能屏蔽掉。
在这里插入图片描述接在在下面找到touchpad_read函数进行修改 ,

static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
    static lv_coord_t last_x = 0;
    static lv_coord_t last_y = 0;

    /*Save the pressed coordinates and the state*/
//    if(touchpad_is_pressed()) {
//        touchpad_get_xy(&last_x, &last_y);
//        data->state = LV_INDEV_STATE_PR;
//    }
//    else {
//        data->state = LV_INDEV_STATE_REL;
//    }
	//上面注释的是原本的代码
		if(PEN==0)  //判断有按键按下,PEN在自己触摸函数头文件有定义,不同厂商提供的触摸函数不同,
				//如正点原子的,在这里就可以使用if(tp_dev.sta&TP_PRES_DOWN)
		{
			last_x = Xdown;   //按键按下抬起后的坐标,自己触摸函数头文件里定义的按键键值的存放变量
			last_y = Ydown;
			data->point.x = last_x;
			data->point.y = last_y;
			data->state = LV_INDEV_STATE_PR;
		}
		else
		{
			data->point.x = last_x;
			data->point.y = last_y;
			data->state = LV_INDEV_STATE_REL;
		}

    /*Set the last pressed coordinates*/
//    data->point.x = last_x;
//    data->point.y = last_y;
}

上述代码中我用PEN是否等于0判断是否触摸屏幕,还使用了Xdown和Ydown,这些在我使用的触摸函数头文件中有定义,如下:
在这里插入图片描述
这里还不能看出PEN的作用,在找到一个触摸扫描函数,
在这里插入图片描述
这里就可以看出当PEN为0即代表有屏幕被触摸。
这里不同的屏幕厂商提供的函数不同,所以判断方式也有不同,如正点原子的:
在这里插入图片描述可以看到正点原子定义了一个结构体,结构体中有存放键值的变量 u16 x[CT_MAX_TOUCH];
u16 y[CT_MAX_TOUCH]。还有用于判断屏幕是否被触摸的变量 u8 sta;此外还有宏定义 #define TP_CATH_PRES 0x40。我们可以查看他的屏幕扫描函数看看他怎么用的。
在这里插入图片描述我们可以看到他这里的屏幕扫描函数有返回值,返回的是 tp_dev.sta&TP_PRES_DOWN,代表当前屏幕状态,0,触屏无触摸;1,触屏有触摸,我们就可以在touchpad_read函数里使用 tp_dev.sta&TP_PRES_DOWN来进行判断。
正点原子的大家根据自己的屏幕实际情况进行修改,修改好了就可以添加测试代码,参考我前面的文章添加测试代码http://t.csdn.cn/qdxaY。

好了,我本次分享就结束了,大家有什么坑欢迎在评论区讨论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32移植LVGL踩坑集锦 的相关文章

  • C++ 11学习

    原始字符串字面量 就不需要转义引脚 原始字符串字面量以R 开头 以 结尾 string str R Hello World c 中 nullptr无法意识转换为整形 但是可以隐式匹配指针类型 在C 11校准下 相比NULL和0 使用null

随机推荐

  • Nginx 状态页详解

    Nginx 状态页详解 基于nginx 模块 ngx http stub status module 实现 在编译安装nginx的时候需要添加编译参数 with http stub status module 否则配置完成之后监测会是提示语
  • Linux命令大全,唯一以案例详解文,持续更新中

    系列文章目录 软件测试功能到自动化学习路线图 2022年最新版技术栈 软件测试01 从了解测试岗位职能和测试流程开始 附作业 软件测试02 6大实际案例手把手教你设计测试点 软件测试03 用例执行以及缺陷管理的学习 附禅道下载使用流程 软件
  • 信贷风险指标你都懂吗?

    转自 简书 信贷指标 风控基本概念 贷款不良率 不良贷款率 逾期率Vintage统计法 Now和Ever DPD1 DPD30 DPD60 DPD90 引言 17年3月份的时候 有一篇文章曾经引爆金融界 称某国内知名互联网金融逾期率高达30
  • linux下解压zip文件命令

    Linux下的压缩解压缩命令详解及实例 实例 压缩服务器上当前目录的内容为xxx zip文件 zip r xxx zip 解压zip文件到当前目录 unzip filename zip 另 有些服务器没有安装zip包执行不了zip命令 但基
  • Apache Tomcat AJP 文件包含漏洞复现(CVE-2020-10487)

    影响范围 tomcat 7 lt 7 0 100 tomcat 8 lt 7 5 51 tomcat 9 lt 9 0 31 利用条件 1 漏洞版本范围内 2 默认开启ajp服务 漏洞复现 nmap扫描 默认端口8009 经测试存在更改默认
  • AI绘画调用OpenAI-api接口【人工智能里的未来之城】:4 座未来派塔楼,天桥上覆盖着茂密的树叶,数字艺术

    OpenAI绘画数字艺术是一种利用人工智能算法生成数字艺术的技术 该技术使用了一种称为GAN Generative Adversarial Networks 生成对抗网络 的深度学习模型 这种模型由两个神经网络组成 生成器和判别器 生成器的
  • 07-2_Qt 5.9 C++开发指南_二进制文件读写(stm和dat格式)

    文章目录 1 实例功能概述 2 Qt预定义编码文件的读写 2 1 保存为stm文件 2 2 stm文件格式 2 3 读取stm文件 3 标准编码文件的读写 3 1 保存为dat文件 3 2 dat文件格式 3 3 读取dat文件 4 框架及
  • 【Maven】Maven下载,配置以及基本概念

    文章目录 1 Maven简介 2 Maven下载 3 Maven环境配置 4 Maven的基本概念 4 1 仓库 4 2 坐标 4 3 仓库配置 修改IDEA默认Maven库 1 Maven简介 Maven是一个Java项目管理工具和构建工
  • 本博客全文目录索引

    本专栏博文索引 目录 涵盖 C C STL Data Structure Algorithm TCP IP Linux Interface Driver Kernel Netfilter 和 Projects C C 详解C指针 C 对象模
  • Java BufferedInputStream原理及设计模式分析

    文章目录 背景 源码分析 FileInputStream BufferedInputStream 装饰器模式 总结 背景 BufferedInputStream和其他InputStream常常放在一起使用 BufferedInputStre
  • 梯度有关问题

    1 偏导数 方向导数 导数是函数随自变量的变化率 对于 一元函数 只有一个自变量x 那么函数y f x 的导数是 在某一点处沿x轴正方向的变化率 多元函数 多个自变量 是多维向量 那么函数随自变量的变化怎么刻画呢 一个方法 就是衡量函数在给
  • 【终极区分】iterable和iterator

    1 凡是可作用于for循环的对象都是Iterable类型 2 凡是可作用于next 函数的对象都是Iterator类型 它们表示一个惰性计算的序列 3 集合数据类型如list dict str等是Iterable但不是Iterator 不过
  • C#中的拆箱与装箱

    1 什么是拆箱和装箱 在C 中 值类型是直接将数据存储在栈空间中 而引用类型是将数据存储在堆空间中 同时在栈空间中存储一个对该数据的引用 那么如果将一个值类型转换为一个它实现的某个接口或object会发生什么 结果必然是对一个存储位置的引用
  • Nodejs源码解析之module

    http blog csdn net leoleocs article details 50245677 module管理是Nodejs中比较有特色的部分 官方有详细的文档https nodejs org api modules html
  • el-tabs通过动态组件来更新单个tab页

    使用element ui的el tabs时 加载页面时会将所有单个tab页渲染出来 如果两个有联系的单个tab页 其中一个添加了数据 另一个tab页只有刷新才会显示出新的数据 使用动态组件来更新单个tab页 在data中定义tab列表 da
  • UnboundLocalError: cannot access local variable XXX where it is not associated with a value解决办法

    代码如图 a 1 def test a 1 test 此时运行代码会产生以下报错 UnboundLocalError cannot access local variable a where it is not associated wit
  • 查找两个字符串的相同代码块--Java

    前提 两个字符串中只有一个最大相同子串 public String getMaxSameString String str1 String str2 if str1 null str2 null String maxStr str1 len
  • 视图的定义与操作

    数据库系统 实验报告 实验名称 视图的定义与操作 实验地点 实验楼423 实验日期 一 实验目的及要求 1 掌握创建视图的SQL语句的用法 2 掌握修改视图的方法 3 熟悉视图更新与基本表更新的区别与联系 4 认识视图的作用 二 实验环境
  • vue获取+设置光标位置 光标定位 选择输入框文本

    版本 vue2 vant2 在vue是用ref r e f s 获取 d o m 的 在
  • STM32移植LVGL踩坑集锦

    这篇文章我主要讲解一下我在移植LVGL时所遇到的一些坑以及解决方法 LVGL的移植过程可以参考我前面的文章 http t csdn cn QSVOO 第一个 问题 在lvgl8 1以前的版本可能会出现MY DISP HOR RES 和 MY