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

在MDK中自动部署LVGL,在stm32f407ZGT6移植LVGL-8.3,运行demo,显示label

在MDK中自动部署LVGL,在stm32f407ZGT6移植LVGL-8.3

  • 一、硬件平台
  • 二、实现功能
  • 三、移植步骤
    • 1、下载LVGL-8.4
    • 2、MDK中安装LVGL-8.4
    • 3、配置RTE
    • 4、配置头文件 lv_conf_cmsis.h
    • 5、配置lv_port_disp_template
  • 四、添加心跳相关文件
    • 1、在STM32CubeMX中配置TIM7的参数
    • 2、使能中断,中断优先级尽可能高
    • 3、编写中断回调函数
    • 4、在main函数中调用配置、初始化和使能中断的HAL库函数
  • 五、修改main函数
    • 1、对LVGL进行初始化
    • 2、在while中,增加lv_task_handler函数。
    • 3、运行lv_demo_benchmark
  • 六、配置MDK编译选项
    • 1、修改堆栈大小
    • 2、增加预编译宏
    • 3、注意:移植 LVGL 必须开启 C99 模式
  • 七、在LVGL中显示字符串
    • 1、修改lv_conf_cmsis.h
    • 2、增加预编译宏
    • 3、修改main函数
    • 4、while中的lv_task_handler函数,在心跳的控制下处理事务

一、硬件平台

核心板:正点原子 探索者 STM32F407ZGT6
4’3寸电容触摸屏

二、实现功能

1、运行lv_demo_benchmark.c这个demo实例;
2、在屏幕上显示字符串。

三、移植步骤

1、下载LVGL-8.4

下载的渠道很多:

  1. 微信公众号:裸机思维
    这里有两个版本的 cmsis-pack:
  • v8.4.0 : 官方的维护性更新,这是目前最稳定也最推荐的版本。
  • v9.2.1: LVGL9 的稳定性更新。加入对ST-DMA2D的支持,加入对Ne maGFX的支持。加入新Demo eBike。
  1. gitee
    lvgl/lvgl - Gitee.com

2、MDK中安装LVGL-8.4

直接通过MDK的Pack-Installer进行直接安装。
下载解压之后,得到pack包:
在这里插入图片描述
然后在Pack Installer中安装即可。
在这里插入图片描述
安装成功,可以在RTE中可以看到安装的LVGL。
在这里插入图片描述
为了确保工程文件的完整性,把C:\Keil_v5\ARM\PACK\LVGL\lvgl\8.4.0目录下的demo、examples、src、lvgl.h复制到自己的工程目录…\MDK-ARM\RTE\LVGL中。
在这里插入图片描述
在这里插入图片描述

3、配置RTE

在MDK中通过菜单 Project->Manage->Run-Time Enviroment 打开RTE配置窗口,找到LVGL将其展开,勾选benchmark、Essential、Extra Themes和porting。
单击“OK”,可以看到LVGL已经自动加入到工程列表中。
在这里插入图片描述

4、配置头文件 lv_conf_cmsis.h

是对lvgl组件进行配置,包括屏幕尺寸、颜色深度、RGB565模式等。具体请参考LVGL配置与移植指南-CSDN博客 。
重要的是:将开头处 #if 0 修改为 #if 1,使整个头文件生效。
可以根据实际情况,修改其他参数,例如把所需内存改小一些:

#define LV_MEM_SIZE (16U * 1024U)          /*[bytes]*/

5、配置lv_port_disp_template

  1. 打开 lv_port_disp_template.h,将开头处#if 0修改为 #if 1,使整个头文件生效。
  2. 包含lcd.h
#include lcd.h
  1. 打开 lv_port_disp_template.c,将开头处#if 0修改为 #if 1,使整个头文件生效。
  2. 修改屏幕分辨率
    #define MY_DISP_HOR_RES    480#define MY_DISP_VER_RES    800
  1. 选择定义缓冲区的方式。LVGL提供了三种缓冲的方式:第一种只有一个缓冲区;第二种有2个缓冲区,用于DMA;第三种是2个全缓冲区。本次选择第一种,把其他2种定义缓冲区的代码删除。否则,可能在编译时出现容量不足的错误。
  2. 修改disp_init函数,增加LCD驱动中的初始化代码。
static void disp_init(void)
{/*You code here*/lcd_init();
}
  1. 修改disp_flush函数,增加正点原子的填充函数。
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{lcd_color_fill(area->x1, area->y1, area->x2, area->y2, (uint16_t *)color_p);/*IMPORTANT!!!*Inform the graphics library that you are ready with the flushing*/lv_disp_flush_ready(disp_drv);
}
  1. 在RTE_Components.h文件中,定义宏:
    #define LV_LVGL_H_INCLUDE_SIMPLE

四、添加心跳相关文件

LVGL的 30ms 心跳 通过调用定时器7的中断来实现。

1、在STM32CubeMX中配置TIM7的参数

预分频8400-1,时钟计数300-1,那么30ms产生一次更新中断。
在这里插入图片描述

2、使能中断,中断优先级尽可能高

在这里插入图片描述
配置完成之后,自动生成TIM7的配置和初始化代码。

3、编写中断回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM6) {//HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10);  // LED1翻转 }else if(htim->Instance == TIM7) {lv_tick_inc(30);  // 关键!通知LVGL时间流逝30ms }
}

4、在main函数中调用配置、初始化和使能中断的HAL库函数

  MX_TIM7_Init();HAL_TIM_Base_Start_IT(&htim7);// 启动TIM7中断

五、修改main函数

1、对LVGL进行初始化

  1. 增加包含头文件
#include "RTE_Components.h"
#include "lv_port_disp_template.h"
  1. 在main函数中增加初始化函数
	lv_init();			  // lvgl系统初始化lv_port_disp_init();  // lvgl显示接口初始化,放在lv_init()的后面

2、在while中,增加lv_task_handler函数。

在 LVGL 中,lv_task_handler() 是 核心任务处理函数,负责执行 LVGL 的内部任务调度(如界面刷新、动画处理、输入设备事件处理等)。

  while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */delay_ms(1000);lv_task_handler(); // lvgl的事务处理}

3、运行lv_demo_benchmark

  1. 在main函数中增加头文件
#include "lv_demo_benchmark.h"
  1. 在“魔术棒”->“C/C++”->“Define”中,添加LV_USE_DEMO_BENCHMARK

在这里插入图片描述

  1. 调用lv_demo_benchmark函数
	lv_init();			  // lvgl系统初始化lv_port_disp_init();  // lvgl显示接口初始化,放在lv_init()的后面lv_demo_benchmark();

六、配置MDK编译选项

1、修改堆栈大小

注意的是:要跑这个Demo,Stack(栈)和 Heap(堆)各自都不能小于 4K,切记,切记!
在STM32CubeMX中修改
在这里插入图片描述

2、增加预编译宏

在“魔术棒”->“C/C++”->“Define”中,添加LV_CONF_SKIPLV_LVGL_H_INCLUDE_SIMPLE
在这里插入图片描述

3、注意:移植 LVGL 必须开启 C99 模式

在这里插入图片描述

七、在LVGL中显示字符串

利用LVGL的Labe标签显示字符串。参考资料:
LVGL lv_label标签控件

1、修改lv_conf_cmsis.h

在\RTE\LVGL\lv_conf_cmsis.h文件中,修改成

 #define LV_FONT_MONTSERRAT_32 1

2、增加预编译宏

在“魔术棒”->“C/C++”->“Define”中,添加LV_FONT_MONTSERRAT_32
在这里插入图片描述

3、修改main函数

	lv_init();			  // lvgl系统初始化lv_port_disp_init();  // lvgl显示接口初始化,放在lv_init()的后面lv_demo_benchmark();lv_obj_t * label = lv_label_create(lv_scr_act()); // 在活动屏幕上创建标签 lv_label_set_text(label, "Hello LVGL!");          // 设置文本 lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);       // 居中显示 lv_obj_set_style_text_font(label, &lv_font_montserrat_32, LV_PART_MAIN);
  • lv_label_create(lv_scr_act())
    创建一个标签对象,并绑定到当前活动屏幕(lv_scr_act() 返回默认屏幕)。
    lv_obj_t* 是 LVGL 中所有控件的基类(类似面向对象中的父类)。

  • lv_label_set_text()
    设置标签的文本内容(支持动态更新,如显示传感器数据)。

  • lv_obj_align()
    将标签对齐到屏幕中心(LV_ALIGN_CENTER),后两个参数是偏移量(这里为 0)。

  • lv_obj_set_style_text_font()
    设置字体为 lv_font_montserrat_32(32 像素高的 Montserrat 字体)。

4、while中的lv_task_handler函数,在心跳的控制下处理事务

编译下载运行结果如下:
在这里插入图片描述

http://www.lryc.cn/news/2392321.html

相关文章:

  • ArcGIS 与 HEC-RAS 协同:流域水文分析与洪水模拟全流程
  • 树莓派设置静态ip 永久有效 我的需要设置三个 一个摄像头的 两个设备的
  • 多模态大语言模型arxiv论文略读(九十九)
  • Fine-tuning:微调技术,训练方式,LLaMA-Factory,ms-swift
  • vscode连接的linux服务器,上传项目至github
  • XCTF-web-mfw
  • indel_snp_ssr_primer
  • 图论核心:深度搜索DFS 与广度搜索BFS
  • Java 调用 HTTP 和 HTTPS 的方式详解
  • Redis--基础知识点--28--慢查询相关
  • 目标检测:YOLO 模型详解
  • HDFS存储原理与MapReduce计算模型
  • 电机控制选 STM32 还是 DSP?技术选型背后的现实博弈
  • .NET 开源工业视觉系统 OpenIVS 快速搭建自动化检测平台
  • 从0到1掌握Kotlin高阶函数:开启Android开发新境界!
  • 【OSS】 前端如何直接上传到OSS 上返回https链接,如果做到OSS图片资源加密访问
  • AI智能分析网关V4室内消防逃生通道占用检测算法打造住宅/商业/工业园区等场景应用方案
  • 商城前端监控体系搭建:基于 Sentry + Lighthouse + ELK 的全链路监控实践
  • Kotlin 中的数据类型有隐式转换吗?为什么?
  • 基于 HTTP 的邮件认证深入解读 ngx_mail_auth_http_module
  • 关于无法下载Qt离线安装包的说明
  • Java开发经验——阿里巴巴编码规范实践解析4
  • HTML应用指南:利用GET请求获取全国捞王锅物料理门店位置信息
  • 算法日记32:埃式筛、gcd和lcm、快速幂、乘法逆元
  • 黑马点评-分布式锁Lua脚本
  • P7-大规模语言模型分布式训练与微调框架调研文档
  • 机械师安装ubantu双系统:三、GPT分区安装Ubantu
  • ORM++ 封装实战指南:安全高效的 C++ MySQL 数据库操作
  • kafka学习笔记(三、消费者Consumer使用教程——从指定位置消费)
  • 【后端高阶面经:架构篇】46、分布式架构:如何应对高并发的用户请求