只涉及如何移植显示驱动,项目的配置和生成不涉及,参考此篇移植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,应该还能再优化。
:)