立即注册 找回密码

微雪课堂

搜索
微雪课堂 图形用户界面(GUI) 查看内容

STM32之littlevGL系列教程:移植littlevGL到STM32(二)

2020-3-28 20:36| 发布者: imliubo| 查看: 3460| 评论: 1|原作者: IAMLIUBO

摘要: Hi,大家好,欢迎来到STM32之littlevGL课堂,我们在上一篇文章中已经将工程的工程树搭建好了,但是由于剩下的内容比较多,没法发在一篇文章内,所以这里我们再继续上一篇文章的内容,如果没有看过的同学,请先去查看 ...
Hi,大家好,欢迎来到STM32之littlevGL课堂,我们在上一篇文章中已经将工程的工程树搭建好了,但是由于剩下的内容比较多,没法发在一篇文章内,所以这里我们再继续上一篇文章的内容,如果没有看过的同学,请先去查看第一节的内容。




对接littlevGL
我们先来修改下lv/port目录下的两个接口文件,我们需要把两个文件开头部分的 #if 0都修改为 #if 1,当然对应的头文件中的也要一并修改,这里很简单就不贴图片了,然后我们还需要将lv_port_indev.c文件中的一部分我们不需要的注释掉,或者直接删除掉,因为lvgl支持多种输入方式,像键盘、鼠标、按键等等,不过这里我们只需要触摸就可以,所以我们只留下我们需要的,然后我们将GT911触摸部分的接口对接一下,由于代码比较多,大家直接点击下载附件,然后解压,将文件的内容复制到lv_port_indev.c文件中即可:
我们在上面的代码中增加了一些我们自己添加的,这里我是在GT911驱动中新增加了两个函数,原型如下,大家可以直接复制到GT911驱动文件中:
bool GT911_isPressed(void)
{
	if(Dev_Now.Touch == 1){
		Dev_Now.Touch = 0;
		return true;
	}
	return false;
}

void GT911_X_Y(int16_t *x, int16_t *y)
{
	uint8_t buf[41];
  uint8_t Clearbuf = 0;
	
	GT911_RD_Reg(GT911_READ_XY_REG, buf, 1);		

	if ((buf[0]&0x80) == 0x00)
	{
		GT911_WR_Reg(GT911_READ_XY_REG, (uint8_t *)&Clearbuf, 1);
		HAL_Delay(10);
	}
	else
	{
		Dev_Now.TouchpointFlag = buf[0];
		Dev_Now.TouchCount = buf[0]&0x0f;
		if (Dev_Now.TouchCount > 5)
		{
			GT911_WR_Reg(GT911_READ_XY_REG, (uint8_t *)&Clearbuf, 1);
			return ;
		}
		GT911_RD_Reg(GT911_READ_XY_REG+1, &buf[1], Dev_Now.TouchCount*8);
		GT911_WR_Reg(GT911_READ_XY_REG, (uint8_t *)&Clearbuf, 1);
		
		Dev_Now.Touchkeytrackid[0] = buf[1];
		Dev_Now.X[0] = ((uint16_t)buf[3] << 8) + buf[2];
		Dev_Now.Y[0] = ((uint16_t)buf[5] << 8) + buf[4];
		Dev_Now.S[0] = ((uint16_t)buf[7] << 8) + buf[6];
		
		if(Dev_Now.X[0] < 1024 && Dev_Now.X[0] > 0){
			if(Dev_Now.Y[0] < 600 && Dev_Now.Y[0] > 0){
				*x = (int16_t)Dev_Now.X[0];
				*y = (int16_t)Dev_Now.Y[0];
				
				Dev_Backup.X[0] = Dev_Now.X[0];
				Dev_Backup.Y[0] = Dev_Now.Y[0];
			}
		}
		else
		{
				*x = (int16_t)Dev_Backup.X[0];
				*y = (int16_t)Dev_Backup.Y[0];
		}
	}
}
大家不要忘记在touchpad_init函数中,调用一下GT911触摸IC的初始化函数。
然后我们再来对接一下显示部分的接口,这部分相比触摸就有点麻烦了,我也是调了不少时间,因为我们是使用的DMA2D,这样速度更快,所以这里直接大家贴出完整代码来,大家参考下,不过还是建议大家直接下载完整工程,因为很多地方你不注意就可能会出错,对于LCD的驱动部分,还是建议大家去微雪我在上面给出的链接中的文章去学习一下,本系列文章我们着重讲应用层,太底层的内容我们不怎么涉及到,由于代码比较多,这里大家直接点击下载,然后解压后,将内容全部复制到lv_port_disp.c文件中即可:
其中这两行代码是根据你的显示屏来修改的:
    disp_drv.hor_res = 1024;
    disp_drv.ver_res = 600;
到这里,我们就已经将接口配置好了,接下来我们测试一下Demo,也就是我们添加到lv/example目录下的demo,这一部分很简单,我贴一下主要代码:
要包含的头文件:
#include 
#include "stm32746i_lcd.h"
#include "stm32746i_sdram.h"
#include "../lvgl/lvgl.h"
#include "../lv_conf.h"
#include "../lv_ex_conf.h"
#include "../lvgl/porting/lv_port_disp.h"
#include "../lvgl/porting/lv_port_indev.h"
#include "../lv_examples/lv_apps/demo/demo.h"
用户要添加的代码:
 /* USER CODE BEGIN 2 */
	lv_init();
	lv_port_disp_init();
	lv_port_indev_init();
	demo_create();
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		lv_task_handler();
		HAL_Delay(5);
  }
  /* USER CODE END 3 */
没错,就是这些,不过还有最重要的一件事,就是我们需要给lvgl一个时基,这里我是直接将它放到了滴答定时器中:
/**
  * @brief This function handles System tick timer.
  */
void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  /* USER CODE BEGIN SysTick_IRQn 1 */
	lv_tick_inc(1);
  /* USER CODE END SysTick_IRQn 1 */
}
其中lv_tick_inc(1)参数1就是我们每隔几ms调用这个函数的频率,因为我们滴答定时器是1ms调用一次,所以这里设置为1。
最后大家编译并下载代码应该就会看到效果了,我这里照了一张照片给大家看一下:

可以看到,我还在上面打了点字,恭喜你,到这里,就说明你的配置没有什么问题了,就可以开开心心的学习后面的课程了,建议新手第一次还是先下载完成工程测试,尽量使用相同的硬件,等你真正弄懂后你就知道自己怎么去配置工程了,最后附上完整代码下载地址:


37

顶一下

刚表态过的朋友 (37 人)

关键词STM32 littlevGL

相关阅读

发表评论

最新评论

引用 游客 2020-12-31 14:05
压缩文件  提示损坏!

查看全部评论(1)

微雪官网|产品资料|手机版|小黑屋|微雪课堂. ( 粤ICP备05067009号 )

GMT+8, 2021-1-18 21:11 , Processed in 0.012793 second(s), 14 queries .

返回顶部