Pico 系列

零基础也能照做

完整移植流程,目标是:

  • 在树莓派 Pico(RP2040)上用 pico-sdk + LVGL 9.0.0
  • ST7796 320×480 SPI 屏显示官方 Demo(stress、widgets 等)
  • 不需要操作系统,纯 C 工程

整套流程分 6 步,跟着做即可:


1. 准备环境

1.1 安装 pico-sdk(官方推荐方式)

# 假设工作目录 ~/pico
cd ~
git clone -b master https://github.com/raspberrypi/pico-sdk.git
cd pico-sdk
git submodule update --init
export PICO_SDK_PATH=$PWD   # 以后编译要用

1.2 安装编译工具

sudo apt update
sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi build-essential

2. 拉取 LVGL 9.0.0 源码

cd ~/pico
git clone -b v9.0.0 https://github.com/lvgl/lvgl.git

精简(可选):
只保留 srcexamples/portinglv_conf_template.h 即可,其余删除。


3. 生成最小工程骨架

3.1 新建工程目录

cd ~/pico
mkdir lvgl_pico && cd lvgl_pico

3.2 复制并改名配置模板

cp ../lvgl/lv_conf_template.h lv_conf.h
cp ../lvgl/examples/porting/lv_port_disp_template.c lv_port_disp.c
cp ../lvgl/examples/porting/lv_port_disp_template.h lv_port_disp.h
# 如果以后用触摸再复制 indev 模板

3.3 修改 lv_conf.h
把开头的 #if 0 改成 #if 1 使能整份配置。
关键选项打开:

#define LV_COLOR_DEPTH          16   /* 与 ST7796 RGB565 对应 */
#define LV_COLOR_16_SWAP        0    /* 如屏幕颜色异常可改 1 */
#define LV_USE_DEMO_STRESS      1    /* 运行 stress demo */

其余保持默认即可。


4. 把驱动文件放进工程

4.1 把你已准备好的 lv_port_disp.c / .h 复制进来,覆盖刚才生成的模板。
(你给出的文件已经适配 ST7796 + SPI,直接可用)

4.2 创建 CMakeLists.txt(工程描述)

cmake_minimum_required(VERSION 3.13)
include($ENV{PICO_SDK_PATH}/pico_sdk_init.cmake)
project(lvgl_pico C CXX ASM)
pico_sdk_init()

# 源文件
file(GLOB LVGL_SRC
    lvgl/src/*.c
    lvgl/src/draw/*.c
    lvgl/src/core/*.c
    lvgl/src/hal/*.c
    lvgl/src/misc/*.c
    lvgl/src/widgets/*.c
    lvgl/src/layouts/*.c
    lvgl/src/themes/*.c
    lvgl/src/font/*.c
)
add_executable(lvgl_demo
    main.c
    lv_port_disp.c
    ${LVGL_SRC}
)

# 头文件路径
target_include_directories(lvgl_demo PRIVATE
    .
    lvgl
)

# 链接库
target_link_libraries(lvgl_demo
    pico_stdlib
    hardware_spi
    hardware_gpio
)

# 生成 uf2 / bin
pico_add_extra_outputs(lvgl_demo)

5. 编写 main.c

#include "pico/stdlib.h"
#include "lvgl/lvgl.h"
#include "lv_port_disp.h"

int main(void)
{
    stdio_init_all();

    lv_init();               // 1. 初始化 lvgl 本体
    lv_port_disp_init();     // 2. 注册显示屏

    /* 3. 运行官方 demo(lv_conf.h 里已使能) */
    lv_demo_stress();        // 你也可以换成 lv_demo_widgets() 等

    /* 4. 主循环:给 lvgl 喂时基 + 任务调度 */
    while (true) {
        lv_timer_handler();  // 处理所有 lvgl 任务
        lv_tick_inc(5);      // 告诉 lvgl 过去了 5 毫秒
        sleep_ms(5);         // 简单延时
    }
    return 0;
}

6. 编译 & 烧录

cd ~/pico/lvgl_pico
mkdir build && cd build
cmake .. -DPICO_BOARD=pico
make -j4

生成的 lvgl_demo.uf2 拖到 Pico 的 BOOTSEL 盘即可运行。


常见问题速查

  • 屏幕花屏/颜色反色 → 把 lv_conf.h 里的 LV_COLOR_16_SWAP 取反试试
  • 触摸要加 → 用 lv_port_indev_template.c 模板,把 SPI/I2C 触摸 IC 驱动填进去即可
  • 内存不够 → 把 lv_port_disp.c 中的缓冲区改小,例如 buf_1[MY_DISP_HOR_RES * 8]
  • 编译提示找不到头文件 → 确认 CMakeLists.txttarget_include_directories 路径正确

一句话总结

把 LVGL 9 源码、你自己写好的 ST7796 驱动、官方示例整合进一个最小 pico-sdk 工程,编译后烧录即可跑 Demo,以上 6 步照抄即可。