C++ 怎么在单片机上移植 LVGL 图形库并完成 C++ 显示与触摸驱动绑定

雨伟酱_1038

雨伟酱_1038

2026-11-01

185人浏览

原创

LVGL 可用 C++ 编译但需 extern "C" 包裹头文件;单片机上必须手写 display/indev 驱动,正确实现 flush_cb、read_cb 和 lv_tick_inc;C++ 封装应避免虚函数、异常及阻塞调用。

c++ 怎么在单片机上移植 lvgl 图形库并完成 c++ 显示与触摸驱动绑定

LVGL 能否直接用 C++ 编译

Lvgl 本身是纯 C 实现,头文件默认不带 extern "C" 包裹,直接在 C++ 源文件里 #include "lvgl.h" 会链接失败——函数符号被 C++ 名字修饰(mangled),而 LVGL 的 .c 文件编译出来的是 C 风格符号。最简解法是在包含前加封装:

extern "C" {
#include "lvgl.h"
#include "lv_drivers/display/fbdev.h"  // 示例驱动头
#include "lv_drivers/indev/evdev.h"
}

注意:所有 LVGL 官方头文件、以及你写的驱动适配层(如 my_display_driver.cpp)都需遵守此规则;否则 lv_disp_drv_register 等函数调用会报 undefined reference。

单片机上必须重写 display 和 indev 驱动

LVGL 不直接操作硬件,它只通过两个抽象结构体回调:显示刷新(lv_disp_drv_t)和输入事件(lv_indev_drv_t)。你在单片机上不能用 Linux 下的 fbdev 或 evdev,必须手写裸机版本:

  • flush_cb:把 LVGL 渲染好的帧缓冲(lv_color_t *)拷贝到 LCD 控制器的显存或通过 SPI/I2C 发送——注意字节序(RGB565 多为大端,但 STM32 FSMC 常需小端对齐)
  • read_cb(indev):从触摸 IC(如 XPT2046、GT911)读取原始坐标,再经校准映射到屏幕坐标;别忘了加防抖逻辑,否则 lv_indev_get_point 返回跳变值
  • 务必在 lv_tick_inc 中更新毫秒计时——LVGL 动画、定时器全靠它,常见错误是忘记调用或频率不准(如误用 SysTick 中断周期为 10ms 却传 1)

C++ 类封装驱动时避免虚函数和异常开销

你可能想把显示驱动封装成 class LcdDriver,但单片机 RAM 紧张,且 LVGL 回调函数签名固定(全是 C 函数指针),无法直接传 this。可行做法是:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 用静态成员函数作回调入口,内部通过全局或 static 指针访问实例:static void flush_cb(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_p)
  • 禁止在驱动类中使用 std::string、std::vector、异常、RTTI;构造函数里只做寄存器初始化,不分配堆内存
  • 若用 CMSIS-RTOS,flush_cb 中不要调用 osDelay 等阻塞 API——LVGL 要求该回调尽快返回,SPI 发送应走 DMA + 中断完成通知

触摸坐标绑定到 LVGL 对象的关键检查点

即使 lv_indev_drv_register 成功,点击无响应,大概率卡在这几处:

  • 触摸 IC 初始化后是否真正进入工作模式?XPT2046 需拉低 PENIRQ 并等待中断,而非轮询;GT911 需确认 I2C 写入 0x804E 寄存器值为 0x00(激活)
  • indev_drv->types.pointer = 1 必须设为真,否则 LVGL 不处理坐标事件
  • 坐标未归一化:LVGL 默认期望 x ∈ [0, scr_w), y ∈ [0, scr_h),但某些触摸芯片返回的是 0~4095 原始值,必须在 read_cb 里手动缩放:data->point.x = raw_x * LV_HOR_RES_MAX / 4096
  • 触摸校准未生效:lv_disp_drv_t 的 rotated 字段与 lv_indev_drv_t 的 rotated 必须一致,否则旋转后坐标系错位

真实项目里,80% 的“触摸不动”问题出在坐标缩放或中断未触发,而不是 LVGL 绑定逻辑本身。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

驱动精灵
驱动精灵

驱动精灵基于驱动之家十余年的专业数据积累,驱动支持度高,已经为数亿用户解决了各种电脑驱动问题、系统故障,是目前有效的驱动软件,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2288

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

1039

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

447

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

347

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

426

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

600

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1429

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1237

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习