ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Raspberry Pi PICO 运行 LVGL 指南:RT-Thread 平台从使能到显示对接的完整实践

Raspberry Pi PICO 运行 LVGL 指南:RT-Thread 平台从使能到显示对接的完整实践 操作系统嵌入式物联网嵌入式OSRTOS【免费下载链接】rt-threadRT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/项目地址https://gitcode.com/gh_mirrors/rt/rt-thread点击查看免费下载Raspberry Pi PICO 作为一款仅售数美元、搭载双核 Arm Cortex-M0 的微控制器开发板在 RT-Thread 物联网操作系统上运行 LVGL 图形引擎即可低成本打造一套完整的嵌入式 GUI 方案。本文基于当前仓库bsp/raspberry-pico/RP2040下的 LVGL 适配工程完整梳理从硬件准备、软件环境搭建、RT-Thread Studio 中使能 LVGL 组件、配置屏幕参数到显示/输入接口对接与 Demo 验证的全流程并深入到lv_port_disp.c、lv_port_indev.c等源码实现帮助你在 PICO 上快速跑通 LVGL 图形界面。硬件与软件环境准备硬件参数树莓派 PICO 与 ST7789 屏幕根据 README_zh.md 的说明本方案采用的硬件为树莓派 PICO 主控与 ST7789 SPI 接口屏幕拓展板主要参数如下主控双核 Arm Cortex-M0 133MHz存储芯片内置 264KB SRAM 和 2MB 板载闪存扩展存储通过专用 QSPI 总线支持最高 16MB 片外闪存DMA 控制器可用于加速显示数据传输GPIO30 个引脚其中 4 个可用作模拟输入外设2 个 UART、2 个 SPI 控制器、2 个 I2C 控制器、16 个 PWM 通道屏幕ST7789SPI 接口更多硬件信息可参考树莓派官方中文资料站pico.org.cn。值得说明的是PICO 的 264KB SRAM 在 RT-Thread LVGL 的组合下资源相对宽裕240×240 分辨率、16bit 颜色深度的全屏帧缓冲大约占用 240×240×2 115.2KB加上 RT-Thread 内核、线程栈与 LVGL 组件本身仍有较大余量这也是该板卡能流畅运行 LVGL Demo 的基础。软件环境本方案的软件环境由三部分组成RT-Thread IoT OS开源物联网实时操作系统提供内核调度、设备驱动框架与软件包生态RT-Thread StudioRT-Thread 官方免费 IDE内置工程管理、配置界面RT-Thread Settings与调试工具本教程的使能与配置操作均在此 IDE 中完成LVGL开源嵌入式图形库提供丰富的控件、动画与主题能力在 RT-Thread Studio 中使能 LVGL for LCD在 RT-Thread Studio 中打开 PICO 工程后通过RT-Thread Settings配置页签即可图形化使能 LVGL。操作路径为Hardware Drivers Config → Onboard Peripheral Drivers →Enable LVGL for LCD勾选该项后工程会自动完成 LVGL 软件包的引入select PKG_USING_LVGL以及 LCD 驱动的启用。从源码看这一开关对应 board/Kconfig 中的配置项config BSP_USING_LVGL bool Enable LVGL for LCD select PKG_USING_LVGL config BSP_USING_LVGL_DEMO depends on BSP_USING_LVGL bool Enable LVGL demo其中BSP_USING_LVGL总开关同时自动选中 LVGL 软件包PKG_USING_LVGLBSP_USING_LVGL_DEMO可选 Demo 开关依赖前者用于使能示例程序该开关通过 SConscript 构建脚本联动工程编译。例如 board/SConscript 中if GetDepend([BSP_USING_LVGL])决定是否纳入 LCD 驱动源文件applications/lvgl/SConscript 将 LVGL 移植代码编入LVGL-port组applications/lvgl/demo/SConscript 则在BSP_USING_LVGL与BSP_USING_LVGL_DEMO同时满足时编入LVGL-demo组。若只需跑通显示而不需要示例程序可只勾选第一项。配置屏幕参数使能 LVGL 后需要根据实际屏幕设置分辨率与方向。屏幕参数定义在 drv_lcd.h 中#define LCD_HEIGHT 240 #define LCD_WIDTH 240 #define HORIZONTAL 0 #define VERTICAL 1各参数含义如下宏定义默认值说明LCD_HEIGHT240屏幕高度像素与屏幕实际尺寸对应LCD_WIDTH240屏幕宽度像素与屏幕实际尺寸对应HORIZONTAL0水平方向枚举值用作LCD_Init()的方向参数VERTICAL1垂直方向枚举值作用同上在 drv_lcd.c 中方向参数决定内部LCD.HEIGHT与LCD.WIDTH的最终取值——水平方向时宽高互换垂直方向时保持原始宽高if (Scan_dir HORIZONTAL) { LCD.HEIGHT LCD_WIDTH; LCD.WIDTH LCD_HEIGHT; } else { LCD.HEIGHT LCD_HEIGHT; LCD.WIDTH LCD_WIDTH; }实操提示若使用 320×240 或其他分辨率的屏幕只需同步修改LCD_HEIGHT/LCD_WIDTH并保证 LVGL 侧的LV_HOR_RES_MAX/LV_VER_RES_MAX见下文与之一致屏幕方向旋转则通过LCD_Init(HORIZONTAL)或LCD_Init(VERTICAL)的参数切换。LVGL 显示接口对接LVGL 与硬件屏幕的解耦依赖显示驱动接口机制LVGL 负责绘制绘制完成后通过注册的flush_cb回调把像素数据交给 LCD 驱动输出。本工程的移植代码位于 lv_port_disp.c其入口函数lv_port_disp_init()完成三件事LCD 硬件初始化、显存缓冲初始化、显示驱动注册。初始化流程void lv_port_disp_init(void) { SPI_Init(); /* 初始化 SPI 总线 */ LCD_Init(HORIZONTAL); /* 初始化 ST7789方向为水平 */ /* 初始化显示缓冲 */ lv_disp_draw_buf_init(disp_buf, lv_disp_buf1, RT_NULL, DISP_BUF_SIZE); lv_disp_drv_init(disp_drv); /* 分辨率与 LVGL 侧保持一致 */ disp_drv.hor_res LV_VER_RES_MAX; disp_drv.ver_res LV_HOR_RES_MAX; disp_drv.draw_buf disp_buf; /* 绑定显示缓冲 */ disp_drv.flush_cb lcd_fb_flush; /* 绑定刷新回调 */ lv_disp_drv_register(disp_drv); /* 注册显示驱动 */ }显存缓冲的分配代码中以全分辨率帧缓冲的方式申请显存#define DISP_BUF_SIZE (LV_HOR_RES_MAX * LV_VER_RES_MAX) static lv_color_t lv_disp_buf1[DISP_BUF_SIZE];DISP_BUF_SIZE即 240×240 57600 个像素点在 16bit 颜色深度下占用约 115KB SRAM。lv_disp_draw_buf_init(disp_buf, lv_disp_buf1, RT_NULL, DISP_BUF_SIZE)将其注册为 LVGL 的绘制缓冲区其中第二个参数为缓冲首地址、第三个参数此处为RT_NULL为可选的第二缓冲用于双缓冲撕裂优化。刷新回调像素从 LVGL 到屏幕static void lcd_fb_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) { LCD_DisplayWindows(area-x1, area-y1, area-x2, area-y2, (uint16_t*) color_p); lv_disp_flush_ready(disp_drv); }这是整个显示链路的枢纽LVGL 每次绘制完成一个area脏矩形区域后调用lcd_fb_flush该函数将矩形坐标x1,y1,x2,y2与像素数据交给底层的 LCD_DisplayWindows由 ST7789 驱动把窗口内的像素写入屏幕随后调用lv_disp_flush_ready通知 LVGL本次刷新已完成可继续下一帧绘制。注意本移植采用整屏缓冲full-framebuffer策略DISP_BUF_SIZE覆盖整个分辨率因此area总是整屏若改用行缓冲/部分缓冲模式以节省内存则area会是不完整的矩形区域但lcd_fb_flush与LCD_DisplayWindows的对接逻辑不变。颜色深度与字节序LVGL 侧的颜色格式在 lv_conf.h 中配置#define LV_USE_PERF_MONITOR 1 #define LV_COLOR_DEPTH 16 #define LV_COLOR_16_SWAP 1 #define LV_HOR_RES_MAX 240 #define LV_VER_RES_MAX 240LV_COLOR_DEPTH 1616bit RGB565 颜色深度与 ST7789 的典型 SPI 接口色彩格式匹配LV_COLOR_16_SWAP 1启用 16bit 颜色字节交换适应 ST7789 的字节序要求常见 SPI 屏为低字节在前LV_USE_PERF_MONITOR 1开启 LVGL 内置性能监视器可在屏幕上叠加显示 FPS 与 CPU 占用便于评估渲染性能LV_HOR_RES_MAX/LV_VER_RES_MAXLVGL 侧逻辑分辨率必须与 drv_lcd.h 的屏幕尺寸保持一致否则显示内容会错位或超出屏幕输入设备接口对接按键控制对于不含触摸屏的 ST7789 扩展板本工程提供了 4 个板载按键作为 LVGL 输入设备移植代码位于 lv_port_indev.c按键与 GPIO 的映射如下LVGL 按键 ID宏定义GPIO 引脚0BUTTON0_PIN21BUTTON1_PIN182BUTTON2_PIN163BUTTON_WKUP_PIN20初始化时lv_port_indev_init()先将 4 个引脚配置为输入模式rt_pin_mode(..., PIN_MODE_INPUT)随后注册一个类型为LV_INDEV_TYPE_BUTTON的输入设备lv_indev_drv_init(indev_drv); indev_drv.type LV_INDEV_TYPE_BUTTON; indev_drv.read_cb button_read; button_indev lv_indev_drv_register(indev_drv);button_read回调通过rt_pin_read()轮询 4 个按键的电平低电平PIN_LOW视为按下将按下的按键 ID 与状态LV_INDEV_STATE_PRESSED/LV_INDEV_STATE_RELEASED写入lv_indev_data_t供 LVGL 事件系统消费。这样在无触摸屏的场景下用户即可通过按键导航 LVGL 界面。运行 LVGL Demo 示例当在 RT-Thread Settings 中同时勾选Enable LVGL for LCD与Enable LVGL demo后示例代码 demo/lv_demo.c 会被编入工程。其入口lv_user_gui_init()直接启动 LVGL 官方的音乐播放器 Demovoid lv_user_gui_init(void) { /* display demo; you may replace with your LVGL application at here */ extern void lv_demo_music(void); lv_demo_music(); }lv_demo_music由 LVGL 软件包提供受 lv_conf.h 中的PKG_USING_LV_MUSIC_DEMO条件编译控制#ifdef PKG_USING_LV_MUSIC_DEMO #define LV_USE_DEMO_RTT_MUSIC 1 #define LV_DEMO_RTT_MUSIC_AUTO_PLAY 1 #define LV_FONT_MONTSERRAT_12 1 #define LV_FONT_MONTSERRAT_16 1 #define LV_COLOR_SCREEN_TRANSP 1 #endif这些配置启用音乐 Demo 所需的字体与自动播放特性。若需要替换为自己的界面直接在lv_user_gui_init()中调用自定义的 GUI 初始化函数即可。需要说明的是LVGL 的图形刷新通常在独立线程中运行Demo 中涉及线程栈大小、优先级与lv_timer_handler()周期调度等参数均由 LVGL 软件包在 RT-Thread 侧的移植层lv_rt_thread_port.c统一管理用户一般无需手工配置只需通过上文的两个 Kconfig 开关控制启用与否。整体链路与验证从使能到显示的完整调用链可总结为Kconfig 开关BSP_USING_LVGL使能组件board/KconfigSConscript 按依赖编入移植代码applications/lvgl/SConscriptlv_port_init()→lv_init()lv_port_disp_init()完成 LVGL 核心与显示驱动初始化lv_port_disp.cLVGL 绘制 →lcd_fb_flush→LCD_DisplayWindows输出到 ST7789 →lv_disp_flush_ready通知完成lv_user_gui_init()→lv_demo_music()启动 Demodemo/lv_demo.c编译烧录后即可在 ST7789 屏幕上看到音乐播放器 Demo 的完整界面与动画效果配合板载按键可对界面进行交互导航。如需进一步了解该 BSP 的整体结构可参阅 bsp/raspberry-pico/RP2040 下的工程文件Kconfig、SConstruct、rtconfig.h等以及 raspberry-pico 仓库根目录 下的公共库与工具。赞分享操作系统嵌入式物联网嵌入式OSRTOS【免费下载链接】rt-threadRT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/项目地址https://gitcode.com/gh_mirrors/rt/rt-thread点击查看免费下载相关推荐基于 RT-Thread 的 Raspberry Pi Pico 运行 LVGL 图形界面ST7789 SPI 屏移植全指南基于 RT Thread 的 Raspberry Pi Pico 运行 LVGL 图形界面ST7789 SPI 屏移植全指南 本篇技术指南以 RT Threa操作系统嵌入式物联网嵌入式OSRTOSAtlasOS3步实现Windows性能提升60%的终极优化方案AtlasOS3步实现Windows性能提升60%的终极优化方案 AtlasOS是一款革命性的开源Windows系统优化工具通过模块化配置方案为技术爱好者提操作系统嵌入式物联网嵌入式OSRTOSEasyLogger跨平台移植实战从RT-Thread到Linux的完整指南EasyLogger跨平台移植实战从RT Thread到Linux的完整指南 想要让你的嵌入式项目拥有强大的日志功能却苦于资源受限EasyLogger超轻嵌入式物联网上一篇深度解析RAG-Anything多模态RAG系统架构设计与技术实现下一篇OpenHands实时通信应用WebSocket与WebRTC的AI辅助开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表