如何将LVGL成功移植到正点原子教程中?

摘要:引言 学习 LVGL 的同时,记录学习过程,分享踩坑经历。 注意!!!后面 LVGL 的内容都仅作为个人笔记,无参考价值!!! LVGL 下面都是从正点原子的 pptx 中截取下来的,他们写的很详细了。 GUI 简介 LVGL 简介 LVG
引言 学习 LVGL 的同时,记录学习过程,分享踩坑经历。 注意!!!后面 LVGL 的内容都仅作为个人笔记,无参考价值!!! LVGL 下面都是从正点原子的 pptx 中截取下来的,他们写的很详细了。 GUI 简介 LVGL 简介 LVGL 移植要求 优化 LVGL 的方法 LVGL 库文件 前置知识 正点原子移植教程 正点原子的移植教程非常详细,他们使用的是 LVGL v8.2 版本的,现在 LVGL v8 版本最高也才到了 v8.4 版本,所以我们可以直接移植 LVGL v8.4 版本的,移植大体上没有什么区别。 【正点原子】基础篇-LVGL移植(准备) 【正点原子】基础篇-LVGL移植(无操作系统1) 【正点原子】基础篇-LVGL移植(无操作系统2) 【正点原子】基础篇-LVGL移植(无操作系统3) 【正点原子】基础篇-LVGL移植(无操作系统4) 踩坑 屏幕显示不正常 解决方法: 在 startup_stm32h743xx.s 文件中将栈大小从 0x400 修改为 0x800。 屏幕显示正常触摸无效 解决方法: 由于是触摸的问题,我们就在触摸上找问题。在 lv_port_indev_template.c 文件中找到以下函数: static bool touchpad_is_pressed(void) { /*Your code comes here*/ gtxxxx_scan(); if (gtxxxx_dev.sta & TP_PRES_DOWN) /* 如果检测到被按下,返回真 */ { return true; } return false; /* 否则返回假 */ } 将if (gtxxxx_dev.sta & TP_PRES_DOWN)修改为if (gtxxxx_dev.sta & (TP_PRES_DOWN >> 15)),并且将正点原子提供代码中的TP_PRES_DOWN都改为(TP_PRES_DOWN >> 15)。 附 TOUCH 程序:【LTDC】RGB LCD 电容触摸屏的配置和程序 原因: 正点原子提供的程序中对于状态位 sta 的处理是这样的: #define TP_PRES_DOWN 0x8000 /* 触屏被按下 */ #define TP_CATH_PRES 0x4000 /* 有按键按下了(兼容电阻屏) */ /* 状态位赋值 */ gtxxxx_rd_reg(GTXXXX_GSTID_REG, &mode, 1); /* 读取触摸点的状态 */ temp = 0XFFFF << (mode & 0XF); /* 将点的个数转换为1的位数,匹配tp_dev.sta定义 */ gtxxxx_dev.sta = (~temp) | TP_PRES_DOWN; /* 状态位恢复 */ if ((mode & 0X8F) == 0X80) /* 无触摸点按下 */ { if (gtxxxx_dev.sta & (TP_PRES_DOWN >> 15)) /* 之前是被按下的 */ { gtxxxx_dev.sta &= ~(TP_PRES_DOWN >> 15); /* 标记按键松开 */ } else /* 之前就没有被按下 */ { gtxxxx_dev.x[0] = 0xffff; gtxxxx_dev.y[0] = 0xffff; gtxxxx_dev.sta &= 0XE000; /* 清除点有效标记 */ } } 通过调试,我们可以知道,当只有一个触点按下的时候: tamp 的值为0xFFFE,即1111 1111 1111 1111 1111 1111 1111 1110。 则~tamp 的值为0x0001,即0000 0000 0000 0001。 TP_PRES_DOWN 的值为0x8000,即1000 0000 0000 0000。 (~temp) | TP_PRES_DOWN 的值即为1000 0000 0000 0001 sta & TP_PRES_DOWN 的值即为0000 0000 0000 0000 那么这个按键按下的接口函数中的 if 将永远都不会进入。
阅读全文