一、移植的LVGL版本8.2
下载地址:(网页下个加速脚本)GitHub - lvgl/lvgl: Embedded graphics library to create beautiful UIs for any MCU, MPU and display type.https://github.com/lvgl/lvgl
二、硬件设备
天空星STM32F407VET6
ILI9341 2.4寸 SPI驱动 320*240分辨率
沿用上次的OV7670的拓展板(LCD接线按如图接就行,不用管按键和OV7670)
三、要求
(1)对flash等有一定要求,最低64kb flash,具体自行百度。
(2)要有定时器和LCD驱动的程序模板,在此基础上进行移植,需要配置一个定时器为LVGL提供心跳,触摸不是必要的,如果需要移植触摸那么就必须要有触摸源码,我这里放置一个天空星标准库的触摸源码:
F407VET6天空星/天空星STM32F407-2.8寸与3.2寸ILI9341彩屏移植成功案例.zip · lovefoolnotme/单片机 - 码云 - 开源中国 (gitee.com)https://gitee.com/lovefoolnotme/singlechip/blob/master/F407VET6%E5%A4%A9%E7%A9%BA%E6%98%9F/%E5%A4%A9%E7%A9%BA%E6%98%9FSTM32F407-2.8%E5%AF%B8%E4%B8%8E3.2%E5%AF%B8ILI9341%E5%BD%A9%E5%B1%8F%E7%A7%BB%E6%A4%8D%E6%88%90%E5%8A%9F%E6%A1%88%E4%BE%8B.zip(3)其实也就是内存大点,有个驱动LCD的画点或者填充函数就可以移植,只需要再开一个定时器来做心跳
四、参考网址:
快速入门LVGL(基于STM32,LVGL 8.2.0)-CSDN博客https://blog.csdn.net/mucherry/article/details/126685909STM32移植LVGL8.0.2超详细的保姆级教程附移植好的工程文件_stm32 lvgl教程-CSDN博客
https://blog.csdn.net/weixin_42111891/article/details/124989266STM32移植LVGL踩坑集锦_lvgl内存不足-CSDN博客
https://blog.csdn.net/qq_53000374/article/details/127946043移植时主要跟第一个网址,遇到问题时再查看其他网址。
五、移植成功的模板(刷新慢,慎用)
demo:keypad_encoder
我用夸克网盘分享了「移植成功的LVGL.rar」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。
链接:https://pan.quark.cn/s/313608107a23
六、移植过程简记(不适宜初次移植)
(1)在工程新建一个lvgl文件夹,里面包括这几个文件
(2)keil设置C99
(3)加入路径
(4)创建四个文件夹
*SRC中加入所有的.c文件,注意多级文件夹,小心移植(100多个)
*POR中加入下列文件
disp涉及显示部分代码,indev涉及输入设备代码
*DEMO中加入要运行的例子
*APP暂时不管,后面放置自己加入的文件
(5)由于改过文件名字,需要在keil中修改头文件名字。
先编译,查看报错的头文件,使用ctrl+f作用整个过程快速替换头文件名字。
(6)打开显示、输入、配置文件宏
在这几个文件的最开头把0切换为1启用显示,输入,配置。
(7)添加分辨率
下面的颜色深度也是需要注意的点
这里只是宏定义,需要把它输入到实际代码处:注释EXAMPLE2和3,将自己定义的分辨率添加
(8)添加接口函数
此处用的画点的方式比较慢,后面想办法改成图中注释的方法会更快(填充),使用这个函数记得添加头文件
(9)打开DEMO的宏
(10)串口函数的 _sys_exit函数前需要有void(有这个函数的情况下)
(11)堆栈可以改大一点
(12)按下图主函数测试
定时器生成1ms的中断用于给LVGL提供心跳
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:https://oshwhub.com/forum
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*
Change Logs:
* Date Author Notes
* 2024-03-15 LCKFB-LP first version
*/
#include "board.h"
#include "bsp_uart.h"
#include <stdio.h>
#include "lcd.h"
#include "gui.h"
#include "test.h"
#include "touch.h"
#include "lvgl.h"
#include "lv_port_disp.h"
#include "lv_port_indev.h"
#include "lv_demo_keypad_encoder.h"
void Led_Init(void);
void TIM_Init(void);
int main(void)
{
board_init();
uart1_init(115200U);
Led_Init();
LCD_Init(); //液晶屏初始化
TIM_Init();
tp_dev.init();
lv_init();
lv_port_disp_init(); // lvgl显示接口初始化,放在lv_init()的后面
lv_port_indev_init(); // lvgl输入接口初始化,放在lv_init()的后面
lv_demo_keypad_encoder();
while(1)
{
// main_test(); //测试主界面
// Test_Color(); //简单刷屏填充测试
// Test_FillRec(); //GUI矩形绘图测试
// Test_Circle(); //GUI画圆测试
// Test_Triangle(); //GUI三角形绘图测试
// English_Font_test();//英文字体示例测试
// Chinese_Font_test();//中文字体示例测试
// Pic_test(); //图片显示示例测试
// Rotate_Test(); //旋转显示测试
/* 如果不带触摸,或者不需要触摸功能,请注释掉下面触摸屏测试项 */
// Touch_Test(); //触摸屏手写测试
lv_task_handler(); // lvgl的事务处理
GPIO_SetBits(GPIOB,GPIO_Pin_2);
delay_ms(500);
GPIO_ResetBits(GPIOB,GPIO_Pin_2);
delay_ms(500);
}
}
void TIM_Init(void)
{
//2.初始化TIMER
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//3.打开定时器时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_TimeBaseStructure.TIM_ClockDivision=0x00; //不分频
TIM_TimeBaseStructure.TIM_Prescaler=84-1; //84分频 84MHZ/84=1MHZ
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数
TIM_TimeBaseStructure.TIM_RepetitionCounter=0; //不重复计数
TIM_TimeBaseStructure.TIM_Period=1000-1; //周期为1000,T=1000*(1/f)=1000*(1/1M)=1ms
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
//4.允许定时器中断
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
//5.配置中断
NVIC_InitTypeDef NVIC_InitStucture;
NVIC_InitStucture.NVIC_IRQChannel=TIM3_IRQn;
NVIC_InitStucture.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStucture.NVIC_IRQChannelPreemptionPriority=0x01;
NVIC_InitStucture.NVIC_IRQChannelSubPriority=0x01;
NVIC_Init(&NVIC_InitStucture);
//6.开启定时器
TIM_Cmd(TIM3,ENABLE);
}
//7.中断服务函数
void TIM3_IRQHandler(void)
{
//8.判断定时器3是否中断
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
{
//9.清除定时器3的中断标志位
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
lv_tick_inc(1);//lvgl的1ms中断
}
}
void Led_Init(void)
{
//1.定义结构体
GPIO_InitTypeDef GPIO_InitStructure;
//2.打开时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
//3.配置结构体五项参数
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
//4.对于配置初始化
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
到现在为止没有移植触摸,可以将上述主函数中的触摸部分代码移除,如果能运行成功再移植触摸,附上运行成功效果图(这个例子为横向显示,切换显示方向为横向):