使用 LVGL 创建嵌入式 GUI 时,必须初始化正在使用的显示,并且必须将 LVGL 配置为与显示配合使用。这种初始化和配置通过 LVGL 全局函数 lv_port_disp_init 完成。此函数分为三个部分:
- 显示初始化
- LVGL 包含一个全局函数 disp_init。此函数在 lv_port_disp_init 中调用,可用于触发所使用显示屏的初始化序列。
- 颜色缓冲区分配和刷新模式选择
- LVGL 使用颜色缓冲区来存储渲染图像的像素数据。该缓冲区 lv_disp_draw_buf_t 在 lv_port_disp_init 中分配。有两种典型的缓冲配置:
- 单路缓冲区:一个缓冲区被分配并传递给 lv_disp_draw_buf_init。该缓冲区的大小通常是水平结果的十倍(10 行像素)。该缓冲区仅填充渲染图像的像素数据,CPU 负责将颜色缓冲区的像素信息传输到用于与显示屏通信的通信接口。
- 具有 DMA 的双缓冲区:两个缓冲区分配了相同大小的内存,并传递到 lv_disp_draw_buf_init。两个缓冲区的大小通常为 10 行像素。LVGL 使用重建图像的部分像素数据填充一个缓冲区,然后使 DMA 可以使用这些数据开始将数据传输到通信接口。
- 还有两种模式可以用于配置 LVGL 执行图像刷新的方式:
- 部分刷新:在部分刷新中,只有正在更新的渲染图像部分被写入颜色缓冲区。默认情况下启用此项。该模式支持更快的刷新和更小的颜色缓冲区,然而,如果显示部分撕裂或条纹,则可能会导致残留的显示伪影。
- 完全刷新:在完全刷新时,整个渲染的图像将被写入颜色缓冲区。这可通过设置 lv_disp_drv_t 显示驱动程序中的 full_refresh 字段来启用。此模式可消除残留显示伪影的问题,但速度要慢得多,并且需要一个与屏幕分辨率相等的颜色缓冲区。
- 显示驱动程序配置
- LVGL 提供了必须配置的显示驱动程序结构,以便 LVGL 正确呈现显示。第一步是通过使用驱动程序的新实例 lv_disp_drv_t 调用 lv_disp_drv_init,来初始化显示驱动程序
- 初始化显示驱动程序后,必须配置的主要值包括:
- 水平和垂直分辨率:水平和垂直分辨率 hor_res 和 ver_res 是显示驱动程序的成员,可以使用之前定义的 MY_DISP_HOR_RES and MY_DISP_VER_RES 进行设置
- 刷新回调:必须使用刷新回调 flush_cb 的位置来配置显示驱动程序。刷新回调是在 LVGL 刷新已填充渲染图像像素数据的颜色缓冲区时调用的方法。此回调方法将在本应用手册中进一步讨论
- 绘制缓冲区:显示驱动程序必须配置先前初始化的颜色缓冲区即 draw_buf 的位置
- 刷新模式:如果使用完全刷新模式,则必须将显示驱动程序配置为 full_refresh 设置为 1
- 最后,必须通过调用 lv_disp_drv_register 向 LVGL 注册显示驱动程序
LVGL 支持多种类型的输入器件,包括触控板、鼠标、键盘、编码器、或按钮。所有这些输入器件都必须初始化并配置 LVGL。这是在 LVGL 全局函数 lv_port_indev_init 中执行的,它分为两部分:
- 输入器件初始化
- LVGL 包含几个可用于初始化输入器件的全局函数。例如,当使用具有电阻式或电容式触控的显示屏时,可以调用全局函数 touchpad_init 来执行触控板初始化。
- 输入器件驱动程序配置
- LVGL 提供了必须配置的输入器件驱动程序结构,以便 LVGL 正确处理输入。第一步是初始化输入器件驱动程序,方法是使用驱动程序的新实例 lv_indev_drv_t 调用 lv_indev_drv_init
- 初始化输入器件驱动程序后,必须配置的主要值为:
- 输入器件类型:所使用的输入器件类型:指针(触控板或鼠标)、键盘、按钮和编码器
- 输入读回调:输入器件驱动程序必须配置输入读回调 read_cb 的位置。输入读取回调是 LVGL 为输入器件的任何输入进行读取时调用的方法。此回调方法将在本应用手册中进一步讨论
- 最后,必须通过调用 lv_indev_drv_register,使用 LVGL 注册输入器件驱动程序