当前位置: 首页 > news >正文

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后面就行,都一样。

	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)函数,如下:

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驱动接口写法简单太多了。

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_ALIGNstatic uint8_t buf_2_1[MY_DISP_HOR_RES * 20 * BYTE_PER_PIXEL];LV_ATTRIBUTE_MEM_ALIGNstatic 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站账号,视频评论区也有完整项目工程代码。

http://www.dtcms.com/a/300853.html

相关文章:

  • 视频转GIF工具,一键批量制作高清动图
  • CLAP文本-音频基础模型: LEARNING AUDIO CONCEPTS FROM NATURAL LANGUAGE SUPERVISION
  • 设计模式(四)创建型:生成器模式详解
  • 设计模式(三)创建型:抽象工厂模式详解
  • 第五章第二节 对射式红外传感器计次旋转编码器计次
  • 8.c语言指针
  • 标签驱动的可信金融大模型训练全流程-Agentar-Fin-R1工程思路浅尝
  • AI驱动的金融推理:Fin-R1模型如何重塑行业决策逻辑
  • JSON格式化与结构对比
  • 2025年量子计算与前沿技术融合:六大变革性方向深度解析
  • Rust实战:高效开发技巧
  • 02人工智能中优雅草商业实战项目视频字幕翻译以及声音转译之以三方AI模型API制作方式预算-卓伊凡|莉莉
  • 【在Unity游戏开发中Dictionary、List介绍】
  • 基于Springboot+UniApp+Ai实现模拟面试小工具七:前端项目创建及框架搭建
  • 深入理解 Spring 中的 XmlBeanFactory 原理及实践
  • 【最新版】防伪溯源一体化管理系统+uniapp前端+搭建教程
  • ArKTS:List 数组
  • 机器学习特征选择 explanation and illustration of ANOVA
  • ROS2总结(二)
  • UDS 0x29 身份验证服务 Authentication service
  • Rust Web 全栈开发(十一):WebAssembly 尝鲜
  • 2507rust,rust写驱动
  • rust- 定义模块以控制作用域和隐私
  • 无刷电机三项霍尔连接线序组合详细分析与波形实例
  • ETF历史每笔成交分钟级高频数据深度解析
  • 墨者:通过手工解决SQL手工注入漏洞测试(MongoDB数据库)
  • Rust与Java DynamoDB、MySQL CRM、tokio-pg、SVM、Custors实战指南
  • 零基础 “入坑” Java--- 十四、字符串String
  • mybatis-plus实体类主键生成策略
  • 使用uni-app开发一个点餐收银台系统前端静态项目练习