引言 
 
学习 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 将永远都不会进入。- static bool touchpad_is_pressed(void)
 - {
 -     /*Your code comes here*/
 -     gtxxxx_scan();
 -     if (gtxxxx_dev.sta & TP_PRES_DOWN) /* 如果检测到被按下,返回真 */
 -     {
 -         return true;
 -     }
 -     return false; /* 否则返回假 */
 - }
 
  复制代码 故采取将TP_PRES_DOWN >> 15右移15位的方法,得到0000 0000 0000 0001,使其可以正常运行。 
当然,找到问题以后,解决的方法有很多,看你怎么选择。 
总结 
 
移植篇就到此结束了,跟着正点原子的视频来移植,不会很困难,就是有点繁琐,不过前提是你要非常熟悉文件管理相关的内容,才不至于眼花缭乱。主要就是踩的这两个坑,特别是第二个坑花了我点时间去寻找,网上搜索也没有答案,故在此分享出来,给需要帮助的人看到是最好的。 
博客导航 
 
博客导航 
  
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除 
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |