1、LVGL移植前的准备工作:了解硬件平台、下载源码、准备工具链
做LVGL移植,最怕什么?
不是代码写不出来,而是准备工作没做透。我见过太多人拿到Demo板就开始敲代码,结果调了三天发现屏幕驱动IC不匹配,或者MCU的RAM根本跑不动LVGL的缓冲区。嗯,今天咱们就把这些坑提前填上。
1.1 摸清你的硬件底细
移植之前,先花半小时把硬件手册翻一遍。我个人习惯列个清单,逐项确认:
| 硬件要素 | 需要确认的内容 | 常见坑点 |
|---|---|---|
| MCU/MPU型号 | 内核架构(ARM Cortex-M/R/A、RISC-V、Xtensa等) | 不同架构的编译器和启动文件差异很大 |
| 主频与RAM | CPU主频、SRAM大小、是否有外部SDRAM | LVGL推荐至少8KB RAM做缓冲区,复杂UI需要更多 |
| 屏幕接口 | 并行8080、SPI、I2C、RGB、MIPI DSI | 接口类型决定了LVGL的flush回调怎么写 |
| 驱动IC型号 | ILI9341、ST7789、NT35510、GC9A01等 | 不同IC的初始化序列和像素格式不同 |
| 触摸IC | FT6236、GT911、CST816等 | 触摸协议和I2C地址要提前确认 |
我的习惯: 把硬件手册的关键页截图或复印出来,贴在工位旁边。尤其是屏幕的初始化时序图和寄存器表,移植时反复翻看能省很多时间。
1.2 下载LVGL源码——版本选择有讲究
LVGL现在有两个主要分支:v8.x和v9.x。我建议新手从v8.3.x开始,为什么?
- v8.3.x:文档最全,社区案例最多,网上能找到的移植教程90%都是基于这个版本
- v9.x:架构更新,但API变化大,很多老教程不适用
我曾经在一个项目里直接上了v9.0,结果发现之前写的lv_demo_widgets()函数名都改了,光改接口就花了两天。所以,除非你有特殊需求,否则先选v8.3.x。
下载方式很简单:
# 方式一:GitHub直接下载ZIP
https://github.com/lvgl/lvgl/releases
选择 v8.3.x 的最新版本,下载 Source code (zip)
# 方式二:Git克隆(推荐,方便后续更新)
git clone -b release/v8.3 https://github.com/lvgl/lvgl.git
注意: 不要直接下载master分支!master分支是开发版,可能包含未稳定的API。一定要选release标签下的版本。
1.3 准备编译工具链
工具链的选择取决于你的MCU架构。我整理了一个对照表:
| MCU架构 | 推荐工具链 | 备注 |
|---|---|---|
| ARM Cortex-M (STM32/GD32/AT32等) | ARM GCC + Makefile 或 Keil/IAR | ARM GCC免费,Keil/IAR需要许可证 |
| ARM Cortex-A (全志/瑞芯微等) | 交叉编译工具链 (arm-linux-gnueabihf-gcc) | 通常配合Buildroot或Yocto使用 |
| RISC-V (GD32V/CH32V等) | riscv64-unknown-elf-gcc | 注意区分32位和64位版本 |
| ESP32 (Xtensa) | ESP-IDF 或 Arduino框架 | ESP-IDF自带工具链,省心 |
我个人最常用的是ARM GCC + Makefile组合。为什么?因为LVGL官方示例就是用Makefile组织的,直接拿过来改改就能用。Keil虽然IDE方便,但工程配置比较繁琐,尤其是添加大量源文件时。
避坑指南: 我曾经在STM32F103上移植LVGL,用的Keil MDK v5,结果编译时发现LVGL的某些文件用了C99特性,而Keil默认的C89模式会报错。解决办法是在工程设置里把C语言标准改成C99或GNU99。
1.4 整体流程一览
为了让你对准备工作有个全局概念,我画了一张流程图:
1.5 最后检查清单
在正式开始移植之前,我建议你对照这个清单打勾:
- 硬件手册:MCU数据手册、屏幕规格书、触摸IC手册,全部在手边
- LVGL源码:已下载并解压,确认版本号(v8.3.x)
- 工具链:已安装并验证能编译一个空工程
- 调试工具:串口线、逻辑分析仪(或示波器)准备就绪
- 开发板:确认屏幕能正常点亮(至少能看到背光)
一个小技巧: 在正式开始移植前,先用厂商提供的裸机例程点亮屏幕,输出一个纯色或简单的图案。这能帮你确认硬件连接和驱动IC初始化是否正确,避免把问题带到LVGL移植阶段。