
这次我们来完整走一遍 STM32H757XIH6 6.86 寸 MIPI DSI 竖屏 LVGL V9.4 的嵌入式 GUI 项目。标题里的三个关键词每一个都有实际工程量H757 这颗双核 MCU 能不能喂饱一块竖屏、MIPI DSI 接口初始化有多少坑、LVGL V9.4 在改动不小的新 API 下能不能跑顺动画和触摸。这篇文章把项目从硬件接线拆到动画回调再把实测验证方法和常见问题一并列出来适合手上正好有 H7 系列板子、准备接 MIPI 屏做 HMI 或仪表面板的开发者直接参考。需要提前说清楚6.86 寸竖屏常见规格一般在 480x1280 或 540x1200 这个区间不同批次面板的 MIPI 时序和触摸芯片并不完全一样。下面会给出完整移植框架和调试验证流程但具体屏幕参数、DSI 时钟、触摸 I2C 地址一定要以自己的屏幕规格书为准不能硬套。1. STM32H757XIH6 MIPI 竖屏项目核心能力速览能力项说明主控平台STM32H757XIH6Cortex-M7 Cortex-M4 双核主频高适合 GUI 业务逻辑分离显示接口板载 LTDC MIPI DSI Host通过 DSI 驱动 6.86 寸竖屏显示分辨率按面板实际规格竖屏常见 480x1280 / 540x1200项目里按规格书配置UI 框架LVGL V9.4使用新版 lv_display_t / lv_indev_t / lv_anim_t 接口动画能力V9 原生动画 API支持页面切换、滑动列表、控件过渡动画触摸交互电容触摸屏I2C 接口需在 LVGL 侧注册输入设备并做坐标旋转映射帧缓冲方案大分辨率下建议外挂 SDRAM 或使用 LVGL 分段刷新由具体板卡内存决定硬件加速DMA2D 可用于颜色格式转换和帧缓冲搬运降低 CPU 负担开发环境STM32CubeMX STM32CubeIDE / Keil配合 STM32CubeH7 固件包适合场景工业 HMI、仪器仪表、智能家居面板、手持设备、竖屏多媒体界面从这张表能看出这个项目的重点不是 LVGL 控件怎么画而是三层链路怎么打通LTDC 输出到 DSI、DSI 输出到屏幕、屏幕反向把触摸坐标送回来给 LVGL。链路每层的初始化顺序、时钟参数、中断和 DMA 配置都会影响最终效果。2. 适用场景与使用边界先说适合什么人。如果你是做 HMI 类产品、仪器仪表、充电桩屏幕、智能家居中控面板或者想在 STM32 上验证 LVGL V9 新特性的这个组合非常合适。STM32H757 双核结构的经典用法是 M7 核跑 LVGL 和显示任务M4 核跑通信、采集、控制逻辑两边通过 IPC 或共享内存交互这样动画不会被外部事件打断实时控制也不容易被 UI 拖累。但它不适合以下情况需要播放高帧率视频或者跑复杂 3D 效果。这类场景更适合带 GPU 的 MPU 平台比如 RT1170、全志、瑞芯微方案。产品必须极致省电。MIPI DSI 高分辨率屏幕本身就比小尺寸 SPI 屏耗电高H757 高性能也意味着功耗不会低。没有仔细看屏幕规格书就想直接点亮。MIPI 屏对初始化序列、DSI 时钟、面板时序极其敏感跳过规格书只能靠猜猜的代价是白屏、花屏严重时可能损坏面板驱动芯片。使用边界上还要注意合规。这个项目涉及屏幕显示、触摸交互、可能接入产品业务系统如果用在人脸识别、支付、医疗等场景必须满足对应行业的认证和数据隐私要求。触摸和显示数据的传输不涉及敏感网络协议但做产品发布时需要确认元器件选型是否合规、是否满足 EMC 测试要求。3. 硬件平台与开发环境准备3.1 硬件清单搭建这个项目最少需要以下硬件硬件说明STM32H757XIH6 核心板/开发板优先选择带 SDRAM 的版本大分辨率 UI 需要足够帧缓冲空间6.86 寸 MIPI DSI 竖屏确认是 DSI 接口而非 RGB 接口确认触摸芯片型号ST-Link / J-Link 调试器下载程序、在线调试、观察变量和帧率5V/3.3V 电源模块屏幕背光和逻辑电源规格不同需按屏幕规格书提供USB-TTL 串口模块输出日志方便排查启动位置和 LVGL 运行状态杜邦线/FFC 排线注意 DSI 是高速信号尽可能使用正规 FPC 连接器这里要强调MIPI DSI 是差分高速接口不像 SPI 屏可以随便飞线。实际项目里如果核心板和屏幕是分离的尽量用短排线连接并且避免 DSI 信号和 PWM、电机驱动等干扰源贴近走线否则容易出现花屏或信号不稳定。3.2 软件工具链STM32CubeMX用来初始化时钟、LTDC、DSI、I2C、GPIO、DMASTM32CubeIDE 或 Keil MDK编译下载STM32CubeH7 固件包提供 HAL 驱动DSI 和 LTDC 的驱动封装可以直接用LVGL V9.4 源码从 GitHub 拉取 release/v9.4 分支串口工具PuTTY、MobaXterm 或任意串口助手逻辑分析仪/示波器验证 I2C 触摸通信和 MIPI 相关信号没有示波器至少要有 I2C 逻辑分析仪。3.3 STM32CubeMX 基础配置打开 STM32CubeMX选择 STM32H757XIH6需要关注以下外设RCC配置外部高速晶振确认 HSE 频率SDRAM如果板载 SDRAM配置 FMC分配帧缓冲LTDC配置显示时序DSI Host配置 lane 数、时钟、DPI 和 DSI 映射I2C配置触摸芯片通信GPIO配置触摸中断、背光控制、DSI 复位引脚DMA2D可选用于图形加速。时钟树是第一时间要处理的。LTDC 需要像素时钟DSI 需要字节时钟两者不是独立的。常见配置方式是先算像素时钟再根据 DSI lane 数和位宽反推 DSI 时钟然后在 CubeMX 里把 PLL 配置对应上。如果 PLL 配错会出现屏幕完全无显示或者图像偏移/闪烁的问题。4. MIPI 竖屏显示链路设计与启动4.1 STM32H757 显示链路结构STM32H757 内部显示链路不是 MCU 直接就能输出 MIPI 信号的。它的结构是CPU/内部总线 → LTDC帧缓冲读取 时序生成 → DSI HOST协议打包 → MIPI DSI 物理层 → 屏幕LTDC 负责从内存中读取像素数据生成符合面板时序的 RGB 信号DSI HOST 把这些并行 RGB 数据按照 MIPI DSI 协议的 Video Mode 或 Command Mode 打包成高速串行差分信号送到面板。所以 DSI 屏并不是把 LTDC 的 RGB 引脚直接接到屏上就完了中间必须经过 DSI 控制器做协议转换。对于 6.86 寸竖屏这类中等分辨率屏幕一般走 Video Mode也就是 DSI HOST 持续把行场时序同步信息、像素数据通过高速 lane 发送给屏幕屏幕端不需要显存属于实时显示。4.2 DSI 主机配置步骤在 CubeMX 中启用 DSI Host按以下步骤配置选择激活的 lane 数。常见的 MIPI DSI 屏支持 2-lane 或 4-lane4-lane 带宽更高但引脚多时序要求也更严格。配置 DSI 时钟。DSI 有 HS 时钟和 LP 时钟参数HS 时钟用来发送高速视频数据LP 时钟用于低功耗命令模式。配置 DPI 接口和 DSI 接口的映射关系。LTDC 提供给 DSI 的 DPI 输入要和 DSI 打包格式匹配比如 RGB888 或 RGB666。生成 DSI 初始化代码后一般还需要在用户代码里按面板规格书补上屏幕的初始化命令序列。有些屏幕通过 DSI DCS 命令初始化有些通过厂商专用命令这块很难有统一模板。一个 DSI Host 初始化的代码框架如下实际参数必须替换为当前面板规格。/* 示例DSI 初始化具体参数必须按屏幕规格书设置 */ DSI_ModeCfg dsiModeCfg {0}; DSI_PLLInitTypeDef dsiPllInit {0}; dsiModeCfg.CommunicationMode DSI_VIDEO_MODE; dsiModeCfg.VirtualChannelID 0; dsiModeCfg.ColorCoding DSI_RGB888; dsiModeCfg.LaneNumber DSI_TWO_LANES; dsiModeCfg.NumberOfActiveLanes 2; dsiModeCfg.Polarity DSI_LP_POLARITY; /* 根据画面尺寸填写 HSA/HBP/HFP/VSA/VBP/VFP */ dsiModeCfg.HorizontalSyncActive 8; dsiModeCfg.HorizontalBackPorch 20; dsiModeCfg.HorizontalFrontPorch 20; dsiModeCfg.VerticalSyncActive 4; dsiModeCfg.VerticalBackPorch 8; dsiModeCfg.VerticalFrontPorch 8; /* DSI PLL 配置输入时钟根据 CubeMX 时钟树决定 */ dsiPllInit.PLLNDIV 50; dsiPllInit.PLLIDF DSI_PLL_IN_DIV1; dsiPllInit.PLLODF DSI_PLL_OUT_DIV1; HAL_DSI_Init(hdsi, dsiPllInit); HAL_DSI_ConfigVideoMode(hdsi, dsiModeCfg); HAL_DSI_Start(hdsi);这段代码不是完整可用的因为真正的 PLL 参数取决于像素时钟、lane 数、位宽和外部晶振频率。实际开发时先根据屏幕 datasheet 里的时序确定 pixel clock然后用 CubeMX 向导生成 DSI 和 LTDC 的所有参数最后再手写屏幕厂商要求的 DCS 命令序列比纯手写寄存器效率高得多。4.3 LTDC 屏参与时序LTDC 配置在 CubeMX 里相对直观只需要把水平同步、水平后肩、水平前肩、垂直同步、垂直后肩、垂直前肩以及有效显示区域宽高填进去。竖屏显示时宽高是反过来的例如分辨率 480x1280则 LTDC 的 Active Width 480Active Height 1280。在代码里对应的配置是/* 示例LTDC 显示时序具体数值来自面板规格书 */ htcdc.Init.HorizontalSync 8; htcdc.Init.VerticalSync 4; htcdc.Init.AccumulatedHBP 8 20; htcdc.Init.AccumulatedHFP 480 8 20 20; htcdc.Init.AccumulatedVBP 4 8; htcdc.Init.AccumulatedVFP 1280 4 8 8; htcdc.Init.BackColor.Blue 0; htcdc.Init.BackColor.Green 0; htcdc.Init.BackColor.Red 0;需要留意的是LTDC 的累积值不是简单地把每个时序相加在 CubeMX 图形界面上会直接给出最终参数生成的代码也是计算好的累积形式。手动修改时一定要按照驱动头文件里的字段定义来避免把 AccumulatedHBP 和 HBP 的概念混掉。4.4 启动时序与白屏问题MIPI 屏的上电时序比普通 SPI 屏更严格。常见顺序是给屏送电源等待电源稳定拉高或拉低复位引脚维持一段时间初始化 DSI 控制器通过 DSI 发送屏幕初始化序列启动 LTDC开背光。这个顺序不能随意颠倒。很多白屏问题出现在“刚上电就开背光”或者“DSI 初始化没完成就开始发视频流”。最稳妥的调试方法是把背光控制引脚单独留出来先确认屏幕已经收到正确图像后再开背光。5. LVGL V9.4 移植与显示驱动适配5.1 获取与配置 LVGL V9.4LVGL V9 和 V8 的 API 变化不小。V9 里lv_disp_drv_t改成了lv_display_tlv_disp_draw_buf_t改成了lv_draw_buf_t输入设备也统一用lv_indev_create()创建。如果你的参考代码是 V8 的直接搬会有一堆编译错误。获取源码# 拉取 LVGL V9.4 源码建议放进项目 libs/lvgl 目录 git clone -b release/v9.4 https://github.com/lvgl/lvgl.git libs/lvgl然后复制lvgl/lv_conf_template.h为lv_conf.h放到项目 include 路径下。LVGL 的编译开关全部集中在 lv_conf.h 里需要手动打开或关闭。5.2 lv_conf.h 关键配置针对 STM32H757 驱动大屏的场景重点看这几个配置#define LV_COLOR_DEPTH 16 /* RGB565节省带宽和内存 */ #define LV_DEF_REFR_PERIOD 16 /* 默认刷新周期 16ms约 60fps 目标 */ #define LV_MEM_CUSTOM 1 /* 使用标准 malloc/free方便对接 FreeRTOS */ #define LV_USE_OS 1 /* 如果跑操作系统则打开 */ #define LV_FONT_MONTSERRAT_14 1 /* 至少开一个内置字体 */ #define LV_USE_LOG 1 /* 开发期开日志发布前关掉 */ #define LV_USE_ANIMATION 1 /* 动画必须开启 */ #define LV_USE_EVENTS 1 /* 触摸点击事件需要 */内存方面LVGL 默认使用内部 heap但 STM32H757 的内部 SRAM 并不算大分配到 LVGL 的 heap 大小要结合帧缓冲策略来定。不要试图在一小块 SRAM 里同时放全屏帧缓冲和 LVGL 图形对象缓存。帧缓冲放 SDRAMLVGL 管理的内存放内部 SRAM这是一个比较理想的分配方案。5.3 显示缓冲与 flush_cb 实现LVGL V9 的显示驱动初始化方式如下#include lvgl.h /* 显示缓冲两个小 buffer 比一个大 buffer 更灵活 */ static lv_draw_buf_t draw_buf_a; static lv_draw_buf_t draw_buf_b; static lv_color_t buf_a[128 * 480]; /* 按实际分辨率规划大小 */ static lv_color_t buf_b[128 * 480]; static void my_flush_cb(lv_display_t *disp, const lv_area_t *area, uint8_t *px_map) { /* 把 px_map 指向的像素数据拷贝到 LTDC 当前帧缓冲对应区域 */ /* 拷贝完成后调用 lv_display_flush_ready 通知 LVGL */ lv_display_flush_ready(disp); } void lvgl_display_init(void) { lv_display_t *disp lv_display_create(480, 1280); lv_draw_buf_init(draw_buf_a, 128, 480, (void *)buf_a, sizeof(buf_a)); lv_draw_buf_init(draw_buf_b, 128, 480, (void *)buf_b, sizeof(buf_b)); lv_display_set_draw_buffers(disp, draw_buf_a, draw_buf_b); lv_display_set_flush_cb(disp, my_flush_cb); }对于 480x1280 这种分辨率直接在内部 SRAM 放两个全屏缓冲是不现实的。一般有两个方向一个是外挂 SDRAM把完整帧缓冲放到 SDRAM再配合 DMA2D 做区域拷贝另一个是使用 LVGL 分段缓冲比如一次刷新 128 行把局部像素数据搬运到 LTDC 帧缓冲的对应行。两种方式都能跑但 SDRAM 方案更接近传统“整帧显示”思路动画撕裂和闪烁更容易控制。5.4 接入 RTOS 的方式STM32H757 经常跑 FreeRTOSLVGL 可以放到独立任务里。典型结构是void gui_task(void *arg) { lv_init(); lvgl_display_init(); lvgl_touch_init(); while (1) { lv_timer_handler(); /* LVGL 心跳处理动画、刷新和事件 */ vTaskDelay(pdMS_TO_TICKS(5)); } }建议把lv_timer_handler()执行周期控制在 5ms-10ms这样动画能跑到接近显示器的刷新率。如果任务调度被高优先级任务抢占太久动画会出现卡顿。可以用串口打印 LVGL 的帧率和任务耗时确认是否被其他中断拖累。6. 触摸驱动与坐标处理6.1 触摸芯片与硬件连接6.86 寸 MIPI 竖屏上的电容触摸常见走 I2C 接口典型芯片有 GT911、FT5x06、CST3xx 等。硬件连接上需要四根基本信号I2C 的 SCL、SDA、触摸中断脚、复位脚。部分屏幕模组触摸和显示是通过同一个 FPC 排线连接的注意引脚定义。I2C 地址是第一个坑。GT911 的地址有 0x5D / 0x14 两种具体由复位时序和引脚电平决定。调试触摸无反应时先用 I2C 扫描工具扫一下能否枚举到设备地址如果扫不到大概率是复位时序没做对而不是代码逻辑问题。6.2 触摸驱动注册到 LVGLLVGL V9 输入设备创建方式如下#include lvgl.h static int32_t touch_x; static int32_t touch_y; static void touch_read_cb(lv_indev_t *indev, lv_indev_data_t *data) { uint8_t touch_count 0; /* 从触摸芯片读取坐标写 touch_x / touch_y */ >#define TOUCH_WIDTH 1280 /* 触摸芯片输出宽 */ #define TOUCH_HEIGHT 480 /* 触摸芯片输出高 */ #define DISP_WIDTH 480 #define DISP_HEIGHT 1280 static void touch_read_cb(lv_indev_t *indev, lv_indev_data_t *data) { int32_t raw_x read_touch_raw_x(); int32_t raw_y read_touch_raw_y(); switch (display_rotation) { case ROTATE_CW_90: touch_x DISP_WIDTH - 1 - raw_y; touch_y raw_x; break; case ROTATE_CCW_90: touch_x raw_y; touch_y DISP_HEIGHT - 1 - raw_x; break; default: touch_x raw_x; touch_y raw_y; break; } >void start_anim(lv_obj_t *obj) { lv_anim_t a; lv_anim_init(a); lv_anim_set_var(a, obj); lv_anim_set_exec_cb(a, (lv_anim_exec_xcb_t)lv_obj_set_x); lv_anim_set_values(a, 0, 100); lv_anim_set_time(a, 300); lv_anim_set_path_cb(a, lv_anim_path_ease_out); lv_anim_set_delay(a, 0); lv_anim_start(a); }这是最常规的 exec_cb 动画。lv_anim_set_path_cb可以切换缓动曲线ease_out 适合按钮弹出ease_in_out 适合页面切换linear 适合进度条和滚动。实际测试后300ms 左右是竖屏 UI 比较舒服的动画时长500ms 以上会显慢200ms 以下感觉生硬。V9 里还大量使用对象样式过渡也就是在lv_obj_set_style_*变化时自动触发过渡动画。这个方式写起来更简洁也不需要手动管理动画对象生命周期。7.2 页面切换与滑动列表动画竖屏 HMI 最常见的动画是页面切换。用 LVGL 的话可以做一个“当前页 新页同时移动”的效果创建一个大的容器作为页面根节点页面切换时旧页面往左移出新页面从右侧移入动画结束时删除旧页面设置新页面为当前页。如果能用lv_screen_load_anim这类系统级切换函数会省很多事。测试时关注两点切换过程中是否闪烁、切换完成到响应触摸之间的时间差。闪烁通常和帧缓冲刷新区有关时间差则和动画回调生命周期有关。7.3 动画性能观察动画的性能不能靠肉眼感觉建议用数据说话。方法有在 GUI 任务里用lv_timer_get_idle()观察 LVGL 所有定时器的空闲占比用串口打印lv_display_get_fps(disp)用调试器在线看 CPU 占用观察 DMA2D 和屏幕刷新是否抢占总线。如果在动画过程中 LVGL 空闲占比很低说明刷新压力很大这时候优先检查像素格式。RGB565 比 ARGB8888 少一半带宽对 H7 来说通常是更实际的选择。其次是增大 flush 行数或使用 SDRAM 双缓冲让 DMA 搬运和 CPU 渲染可以并行。7.4 性能调优一个比较有效的调优组合是使用 RGB565LVGL 颜色深度 16 位打开 DMA2D 加速 flush 拷贝LTDC 使用两层或单层避免叠加层过多禁止使用阴影、高斯模糊等开销大的样式图片资源用 LVGL 内置的图片转换工具预转换到适合 MCU 的颜色格式不要用 PNG 解码字体使用自定义小字号字库不要全量加载大字体。8. 实测流程与效果验证做完整验证时建议按以下顺序执行第一步纯硬件测试。上电后不烧录程序用万用表检查背光供电、逻辑电源是否正常确认 DSI 排线连接没有松动。第二步CubeMX 生成的裸机工程验证。只初始化 LTDC DSI往帧缓冲里填充纯色例如全红、全绿、全蓝看屏幕能否正常显示纯色。这一步能排除 LVGL 的影响先证明 MIPI 链路是通的。第三步LVGL 基础显示验证。接上 LVGL显示一个静态页面包含文本、矩形、图片确认显示方向、颜色、坐标都正确。第四步触摸验证。做一个触摸测试页面点击屏幕时在对应位置显示一个圆点拖动时画线观察坐标是否跟手、是否有反向偏移。第五步动画验证。跑按钮过渡动画、页面切换动画、列表滚动动画观察流畅度和内存占用。第六步长时间稳定性测试。让动画和触摸事件循环跑 8-12 小时观察是否出现花屏、卡死、内存泄漏。每一步的通过标准测试项判断标准纯色显示三基色颜色准确无花屏、无闪烁、无水波纹静态页面文字清晰、图片颜色正确、上下方向正确触摸点位点击位置和目标控件响应位置一致四角无偏移动画流畅顺滑无跳变页面切换不闪烁长时间运行不卡死、不花屏、内存不持续增长9. 常见问题与排查方法问题现象可能原因排查方式解决方案屏幕全白/黑背光亮DSI 初始化失败或 LTDC 未启动检查 DSI 时钟配置确认初始化命令是否执行按规格书重配 DSI 时序补初始化序列花屏MIPI lane 数配置错误/时序不对对照规格书检查 lane 数和 dsiModeCfg修正 DSI lane 配置和 HBP/HFP图像偏移LTDC 累积时序填错CubeMX 重新生成确认 Accumulated 字段计算方式颜色偏色/反色RGB 颜色格式不匹配检查 LTDC 和 DSI ColorCoding统一 RGB888/RGB565触摸无响应I2C 地址错/复位时序错I2C 扫描查看触摸芯片是否有 ACK修正硬件复位或地址配置触摸坐标反向未做坐标旋转映射点击四角测试按旋转角度修正映射公式动画卡顿刷新带宽不足/缓冲太小查看 fps 和 CPU 占用减小缓冲行间距开 DMA2D关阴影编译后 flash 过大LVGL 启用太多功能/字体检查 lv_conf.h 裁剪关闭不需要的解码器和调试日志程序进入 HardFaultLVGL 内存不足/缓冲区越界查看调用栈检查堆大小增大 LV_MEM_SIZE简化控件树DMA2D 与 CPU 数据竞争没有同步访问帧缓冲检查刷新时序和 cache 一致性对 SDRAM 区域做 cache 维护或使用 MPU 配置DMA2D 和 cache 的关系是 H7 平台一个容易被忽视的点。H7 的 core 使用 D-Cache 时DMA2D 搬运的内部和外部内存区域如果被 CPU cache 缓存了就容易出现数据不一致表现就是花屏或者偶发性颜色错误。解决办法是给帧缓冲所在内存区域配置 MPU 属性为 non-cacheable或者在翻页时执行 cache clean/invalidate 操作。10. 最佳实践与工程建议第一把显示初始化、触摸初始化、LVGL 移植三块代码分开。不要在一个文件里同时写 DSI 时序、触摸读取和 LVGL 回调后续调试或换屏时会非常痛苦。建议至少分三个模块bsp_lcd、bsp_touch、app_gui。第二建立一个配置文件管理“屏幕参数”的所有宏。分辨率、时序、lane 数、触摸芯片型号、I2C 地址、是否反转坐标全部集中在一两个头文件里。换屏幕时改宏而不是改逻辑代码。第三开发阶段保留 LVGL 日志输出。LVGL 的LV_USE_LOG打开后内存分配失败、控件创建失败都会打印日志。发布时再关掉能省不少 CPU 时间。第四大分辨率 UI 不要全部使用动态创建控件。固定页面可以构建好对象树后隐藏反复显示隐藏比反复创建销毁更省内存也避免内存碎片。第五动画资源要控制数量。一个页面同时跑太多动画对象会明显拉低帧率。如果动画很多优先用样式 transition而不是单独lv_anim_t对象。第六涉及触摸和显示时一定要定义清楚“横竖屏安装方向”和“触摸坐标系”的对应关系写一个独立的坐标转换函数并且在换不同屏时优先检查这个函数。第七面板初始化序列不要靠猜。有些 MIPI 屏厂商会在规格书里给整段初始化 code直接把这段 code 放进初始化流程里通常比手工配置更可靠。如果产品后续要小批量生产务必和供应链确认这批屏幕的初始化时序是否完全一致。11. 总结与下一步STM32H757XIH6 6.86 寸 MIPI 竖屏 LVGL V9.4 这个项目最值得验证的不是某个控件能不能画出来而是整条数据链路能不能稳定跑起来。先把 DSI 链路点亮纯色再接入 LVGL 做静态页面随后加触摸最后加动画每一步都有明确判断标准。最容易踩的坑集中在三块DSI 时钟和时序配置、I2C 触摸地址和复位时序、H7 的 cache 与 DMA2D 数据一致性问题。下一步可以从这几个方向延伸把 M7/M4 双核跑起来M7 专管 GUIM4 处理业务逻辑用 DMA2D 做图像格式转换把界面响应速度再拉高接入更多 LVGL V9 高级组件如图表、键盘、日历如果产品化则重点做低功耗和长时间运行稳定性测试。先把屏点亮再让它稳定跑起来这个项目的价值就出来了。