只涉及如何移植显示驱动,项目的配置和生成不涉及,参考此篇移植LVGL之前确保屏幕驱动是可用的。
项目配置
MCU:STM32F411CEU6
屏幕:1.69寸 ST7789 240*280 LCD
LVGL:8.3.11
开发环境:MacOS + STM32CubeMX + Clion + OpenOCD
LVGL 8.3
下载LVGL 8.3源码
LVGL 8.3 开源地址:https://github.com/lvgl/lvgl/tree/release/v8.3
下载 ZIP 包

Github访问不上的可以这个链接下载:https://doufu520.lanzouu.com/iLnj32uyrjwf 密码:3g41
裁剪LVGL 8.3
解压后的目录结构如下

源代码里很多不相关的东西,要进行裁剪。对LVGL进行裁剪,只需要保留demos examples src lv_conf_template.h lvgl.h

其余文件删除,删除后目录结构应如下

再进一步裁剪,examples 文件夹里只需要 porting,最终裁剪目录结构如下

移植
SPI 配置参考
项目中需要用到 DMA,需要给 SPI 接口的 TX 配置 DMA 通道。




添加到 STM32 项目
在STM32项目下创建 LVGL 文件夹,将刚才裁剪好的源代码拷贝进工程中。

配置 LVGL
重命名文件
这步可以省略,重命名只为好看。
将LVGL的文件重命名,重命名完应如下。

修改 LVGL 代码
lv_conf.h 修改
启用该头文件。

lv_port_disp.h 修改
启用该头文件。

lv_port_disp_init 函数修改
该函数位于 lv_port_disp.c 中。
MY_DISP_HOR_RES和MY_DISP_VER_RES改成自己的屏幕尺寸。

将 lv_port_disp_init 函数中的变量 static lv_disp_drv_t disp_drv; 声明为全局变量,为配合 HAL_SPI_TxCpltCallback 回调函数使用。

使用单缓冲,也可以配置双缓冲,实际测试没很大提升,应该是没配置对吧。

disp_flush 函数修改
该函数位于 lv_port_disp.c 中。
这段代码是 LVGL 显示驱动移植中的核心部分,负责将 LVGL 渲染好的像素数据发送到屏幕上显示。
使用 STM32 的 SPI 接口和 DMA 功能,disp_flush 函数由 LVGL 调用,数据通过 DMA 传输完成后,HAL_SPI_TxCpltCallback 回调函数中调用的 lv_disp_flush_ready 通知 LVGL 刷新已经完成。

部分代码
初始化代码
ST7789_Init();
lv_init();
lv_port_disp_init();
LVGL 心跳
使用TIM定时器设定1ms中断,调用 lv_tick_inc(1)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
// LVGL,pcs 100 ,arr 1000 ,100000,100 000 000 / 100000,1000Hz,1ms
if (htim->Instance == TIM11) {
lv_tick_inc(1);
}
LVGL 事务处理
在while中调用 lv_timer_handler()
while (1)
{
lv_timer_handler();
HAL_Delay(5);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
最终效果
启用Demo

调用的代码
ST7789_Init();
lv_init();
lv_port_disp_init();
lv_demo_benchmark();
效果
能跑到30多FPS,应该还能再优化。
:)


3643

被折叠的 条评论
为什么被折叠?



