STM32移植LVGL9.2.1教程

一、环境说明

(1)开发板:STM32F401RCT6核心板(网上很多,价格只有几块钱)

(2)屏幕:2.8寸spi屏+gt911触摸 + 转接板(某宝有卖,没有推广自行搜索)

(3)开发工具:stm32 cubemx + Keil5

(4)开发库:STM32 HAL库

(5)LVGL版本:9.2.1(和nxp gui guider版本保持一致,可图形化开发)

二、图片展示

效果图:

接线图:

三、视频展示

【开源!在7块钱的开发版上跑LVGL9.2?】 https://www.bilibili.com/video/BV1wQ8vz8EUG/?share_source=copy_web&vd_source=fe79bb5485e516d8c2620e2fed931723

说明:项目完整代码可以在视频评论区获取

四、 移植流程

1、裁剪代码

需要的代码不多主要就是lvgl的src目录和几个配置文件,自己可以再创建一个porting目录用来放自己的接口代码,如下:

lvgl.mk这个文件很重要可以查看所有的lvgl.c文件,根据自己需要包含进工程,或者干脆全部包含。

然后直接用官方的lv_conf_template.h文件修改为lv_conf.h,里面的配置项不要乱改,不改都可以,后面根据自己情况再调整。

2、清除报错

不要着急去改lvgl配置和移植接口,先保证工程编译不报错为止,缺少函数定义就去找函数定义的文件包含进工程,代码区超了就裁剪,内存超了就减少缓冲区定义大小。

3、lvgl移植

(1)在main函数中调用lv_init(),然后如果有报错就继续解决报错。在while循环中调用lv_timer_handler(),我是在自己写的接口函数lv_porting中调用lv_init的,放lcd_init后面就行,都一样。

cpp 复制代码
	gt911_init();
	LCD_Init();
	lv_porting();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		lv_timer_handler();
		gt911_scan(&gt911_point);
    HAL_Delay(10);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

(2)在systick中断中添加lv_tick_inc(1)函数,如下:

cpp 复制代码
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 */
}

4、驱动移植

主要就是注册显示设备和输入设备,代码如下,lvgl9相比lvgl8驱动接口写法简单太多了。

cpp 复制代码
int lv_porting(void)
{

  /*Initialize LVGL*/
  lv_init();
  /*Initialize the display, and the input devices*/
  hal_init(MY_DISP_HOR_RES, MY_DISP_VER_RES);
  /*Open a demo or an example*/
	gui_test();
  /*To hide the memory and performance indicators in the corners
   *disable `LV_USE_MEM_MONITOR` and `LV_USE_PERF_MONITOR` in `lv_conf.h`*/
  return 0;
}


static void disp_flush(lv_display_t * disp_drv, const lv_area_t * area, uint8_t * px_map)
{
		/*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/
		uint16_t wr_color = RED;
		uint16_t * p_color = (uint16_t *)px_map;
		LCD_Color_Fill(area->x1,area->y1,area->x2,area->y2,p_color);
    /*IMPORTANT!!!
     *Inform the graphics library that you are ready with the flushing*/
    lv_display_flush_ready(disp_drv);
}


static void tslib_read(lv_indev_t * drv, lv_indev_data_t * data)
{
    data->point.x = gt911_point.points.x1;
    data->point.y = gt911_point.points.y1;
    data->state = gt911_point.press ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED;
}

lv_indev_t * lv_gt911_touchscreen_create(void)
{
		lv_indev_t * indev = lv_indev_create();

    lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER);
    lv_indev_set_read_cb(indev, tslib_read);

    lv_indev_set_mode(indev, LV_INDEV_MODE_TIMER);
		return indev;
}


/**
 * Initialize the Hardware Abstraction Layer (HAL) for the LVGL graphics
 * library
 */

static lv_display_t * hal_init(int32_t w, int32_t h)
{
	LV_ATTRIBUTE_MEM_ALIGN
	static uint8_t buf_2_1[MY_DISP_HOR_RES * 20 * BYTE_PER_PIXEL];

	LV_ATTRIBUTE_MEM_ALIGN
	static uint8_t buf_2_2[MY_DISP_HOR_RES * 20 * BYTE_PER_PIXEL];

	lv_display_t * disp;
  lv_group_set_default(lv_group_create());
	disp = lv_display_create(w, h);
  lv_display_set_flush_cb(disp, disp_flush);

	lv_display_set_buffers(disp, buf_2_1, buf_2_2, sizeof(buf_2_1)-MY_DISP_HOR_RES*3, LV_DISPLAY_RENDER_MODE_PARTIAL);
	lv_display_set_default(disp);
	
	lv_indev_t * touchscreen = lv_gt911_touchscreen_create();
  lv_indev_set_display(touchscreen, disp);
  lv_indev_set_group(touchscreen, lv_group_get_default());
	
  return disp;
}

五、总结

自己移植中间有很多坑不是三言两句说得清楚的,后面有事件可以考虑出个视频教程,有些我自己还没完全搞明白,也在摸索当中,总之先把屏幕点起来,然后再考虑优化等等问题。

有兴趣的可以从上面视频关注我的b站账号,视频评论区也有完整项目工程代码。

相关推荐
电子工程师成长日记-C513 小时前
51单片机电子打铃系统
单片机·嵌入式硬件·51单片机
iCxhust4 小时前
Keil µVision 调试指南---UART#1 模拟/调试窗口 完全使用教程
stm32·单片机·嵌入式硬件
iCxhust4 小时前
51单片机引脚 ALE EA PSEN的用途
单片机·嵌入式硬件·51单片机
碎像4 小时前
51单片机创建项目
单片机·嵌入式硬件·51单片机
木白CPP4 小时前
MCU 进程内存布局详解(.text, .rodata, .data, .bss, 堆, 栈)
单片机·嵌入式硬件
Lugas Luo4 小时前
车载录像存储性能模拟测试工具设计
linux·嵌入式硬件·测试工具
v132665623684 小时前
BK7258 wifi6音视频soc芯片应用分析
嵌入式硬件·物联网·音视频·iot·wifi6
風清掦5 小时前
【江科大STM32学习笔记-10】I2C通信协议 - 10.2 硬件 I2C 读写MPU6050
笔记·stm32·单片机·嵌入式硬件·学习
ALINX技术博客5 小时前
【黑金云课堂】FPGA技术教程Vitis开发:RTC中断讲解
单片机·嵌入式硬件·fpga开发
进击的小头5 小时前
第10篇:嵌入式芯片中断系统详解:NVIC与硬实时性优化设计
单片机·嵌入式硬件