2. 准备工作:开发板选型、获取LVGL源码、搭建交叉编译环境、准备烧录工具
好,咱们正式开始动手之前,得先把家伙事儿备齐。我见过不少新手,一上来就急着写代码,结果卡在编译环境上折腾好几天。说白了,嵌入式开发里,工具链的准备工作往往比写代码本身更磨人。这一章,我就带你把这四样东西一一搞定。
2.1 开发板选型:别贪大,够用就行
选开发板,我个人的原则是:先看需求,再看预算,最后看社区活跃度。你想想看,如果板子冷门到连个像样的论坛都没有,遇到问题连个问的人都没有,那得多痛苦。
对于咱们这个LVGL移植课程,我建议你选一块带RGB或MIPI接口的屏幕的板子。为什么呢?因为LVGL的核心是图形渲染,你得有块能跑起来的屏。我早期用过一个只有SPI接口的板子,刷新率上不去,动画卡得跟幻灯片似的,后来果断换了带RGB接口的板子,效果立竿见影。
这里我列几个常见的选型方向,供你参考:
| 芯片系列 | 典型型号 | 适合场景 | 注意点 |
|---|---|---|---|
| STM32F4/F7 | STM32F429, STM32F746 | 入门级,资料多,社区活跃 | RAM较小,复杂动画需优化 |
| ESP32系列 | ESP32-S3, ESP32-P4 | 带WiFi/蓝牙,适合物联网屏 | PSRAM延迟较高,注意帧率 |
| NXP i.MX RT | i.MX RT1050, RT1060 | 高性能,适合复杂UI | BGA封装,焊接难度大 |
| 全志/Rockchip | F1C200s, RV1126 | 带Linux,适合大屏应用 | 启动流程复杂,需熟悉uboot |
2.2 获取LVGL源码:别下错版本
LVGL的源码托管在GitHub上,地址是 https://github.com/lvgl/lvgl。但这里有个坑——版本选择。
我记得有一次,我图省事直接下了最新的master分支,结果发现API跟教程里对不上,折腾了半天才发现是版本不兼容。所以,我建议你锁定一个稳定版本。目前最推荐的是 v8.3.x 系列,这个版本功能完善,文档齐全,而且市面上大部分教程都是基于这个版本写的。
获取源码的方式有两种:
- 直接下载ZIP包:去GitHub的Release页面,找到v8.3.x,下载Source code (zip)。简单粗暴,适合一次性使用。
- 用Git克隆:如果你打算后续自己改源码,或者想跟踪更新,用Git更合适。
# 克隆指定版本,速度慢的话可以加个 --depth=1 只拉最新提交
git clone --branch v8.3.11 --depth=1 https://github.com/lvgl/lvgl.git
下载完后,你会看到源码目录里有个 lvgl 文件夹。里面最重要的几个东西:
src/:核心源码,所有控件、绘图、输入设备驱动都在这里。examples/:官方示例,移植完后可以先跑这里面的demo验证。lv_conf_template.h:配置文件模板,你需要把它复制出来改名为lv_conf.h。
lv_conf_template.h,一定要复制一份出来改名。否则下次更新源码时,你的配置会被覆盖掉。我曾经就吃过这个亏,改了半天配置,一更新全没了。
2.3 搭建交叉编译环境:这是最磨人的一步
交叉编译,说白了就是在你的电脑上编译出能在开发板上运行的代码。这一步最容易出问题,因为环境变量、工具链版本、路径设置,任何一个地方错了,编译就报错。
我个人习惯用 ARM GCC 工具链,也就是 arm-none-eabi-gcc。这个工具链是开源的,支持ARM Cortex-M和Cortex-A系列芯片。安装方式如下:
2.3.1 下载工具链
去ARM官网下载 gcc-arm-none-eabi 的Linux版本。我建议下载 10.3-2021.10 这个版本,比较稳定。下载后解压到 /opt/ 目录下:
# 解压
tar -xjf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 -C /opt/
# 添加环境变量(建议写到 ~/.bashrc 里)
export PATH=$PATH:/opt/gcc-arm-none-eabi-10.3-2021.10/bin
2.3.2 验证安装
打开终端,输入以下命令:
arm-none-eabi-gcc --version
如果能看到版本号,说明安装成功。如果提示 command not found,检查一下路径写对了没有。
undefined reference to `__aeabi_uidiv'。后来发现是工具链版本太新,跟我的库文件不兼容。换回10.3版本就好了。所以,别追新,稳定第一。
2.3.3 配置CMake(可选但推荐)
LVGL官方推荐用CMake来管理工程。你需要在项目根目录下创建一个 CMakeLists.txt,指定工具链文件。这里我贴一个我常用的模板:
cmake_minimum_required(VERSION 3.10)
project(lvgl_port)
# 设置交叉编译工具链
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
# 添加LVGL源码
add_subdirectory(lvgl)
# 添加你的主程序
add_executable(main main.c)
target_link_libraries(main lvgl)
然后执行:
mkdir build && cd build
cmake ..
make
如果一切顺利,你会在 build/ 目录下看到一个 main 文件。这就是编译好的二进制文件。
2.4 准备烧录工具:把程序塞进板子
编译好了,怎么把程序烧到板子里?这取决于你的开发板。我常用的几种方式:
| 开发板类型 | 烧录工具 | 连接方式 | 备注 |
|---|---|---|---|
| STM32系列 | STM32CubeProgrammer | ST-Link / USB DFU | 官方工具,稳定可靠 |
| ESP32系列 | esptool.py | USB串口 | Python脚本,跨平台 |
| i.MX RT系列 | MCUXpresso Secure Provisioning | USB HID / JTAG | 配置稍复杂 |
| 全志/Rockchip | PhoenixCard / rkdeveloptool | SD卡 / USB OTG | 需要制作启动卡 |
以STM32为例,我一般用 STM32CubeProgrammer。操作步骤很简单:
- 用ST-Link连接开发板和电脑。
- 打开STM32CubeProgrammer,选择对应的芯片型号。
- 加载编译好的
.hex或.bin文件。 - 点击 Download,等进度条走完。
esptool.py --chip esp32s3 --port /dev/ttyUSB0 write_flash 0x0 build/main.bin
记得把 /dev/ttyUSB0 换成你实际的串口号。
2.5 本章知识体系总览
说了这么多,我画了一张图帮你理清思路。这四步是环环相扣的,缺一不可。