一、移植的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);
}
到现在为止没有移植触摸,可以将上述主函数中的触摸部分代码移除,如果能运行成功再移植触摸,附上运行成功效果图(这个例子为横向显示,切换显示方向为横向):

(13)触摸移植不是很了解,后面再说,上面给的网址有移植教程
七、踩坑补充
(1)如果屏幕分辨率过大,可能会使RAM不够用。
在后面移植STM32F103ZET6时就出现了这个问题,它的RAM只有64KB,所以如果要支持大分辨率的屏幕需要单片机的RAM足够大,可以通过打印信息来查看RAM是否超出。我之前800*420的分辨率下面第二张图加起来接近70000,远超实际的可用RAM,导致调试直接进入硬件错误。后面改为320*240就只有59000+


(2)一般调试进入硬件错误都是栈堆内存等不够。
注意MSP、PSP、LR和查找memory。
参考网址:
[LVGL]移植记录:v8.3 运行demo跑飞进入HardFault_Handler 学习记录_1_lvgl hardfault-CSDN博客
https://blog.csdn.net/weixin_51275883/article/details/128546836Keil 编译内存信息:Program size: Code, RO-data , RW-data, ZI-data 学习_program size: code=2696 ro-data=860 rw-data=228 zi-CSDN博客
https://blog.csdn.net/qq_37858386/article/details/79541451
在Keil中调试STM32硬件错误的方法 | MCU加油站 (eetrend.com)
https://mcu.eetrend.com/content/2024/100580994.html#:~:text=%E5%9C%A8Keil%E8%8F%9C%E5%8D%95%E6%A0%8F%E7%82%B9%E5%87%BBView%E2%80%94%E2%80%94Registers%20Window%EF%BC%8C%E5%9C%A8%E5%AF%84%E5%AD%98%E5%99%A8%E6%9F%A5%E7%9C%8B%E7%AA%97%E5%8F%A3%E6%9F%A5%E6%89%BER14%20%28LR%29%E7%9A%84%E5%80%BC%E3%80%82%20%E5%A6%82%E6%9E%9CR14%20%28LR%29%20%3D%200xFFFFFFE9%EF%BC%8C%E7%BB%A7%E7%BB%AD%E6%9F%A5%E7%9C%8BMSP%EF%BC%88%E4%B8%BB%E5%A0%86%E6%A0%88%E6%8C%87%E9%92%88%EF%BC%89%E7%9A%84%E5%80%BC%EF%BC%9B%E5%A6%82%E6%9E%9CR14%20%28LR%29,0xFFFFFFF9%EF%BC%8C%E6%8E%A5%E4%B8%8B%E6%9D%A5%E4%BB%A5%E6%AD%A4%E4%B8%BA%E4%BE%8B%E3%80%82%20%E5%9C%A8Keil%E8%8F%9C%E5%8D%95%E6%A0%8F%E7%82%B9%E5%87%BB%E2%80%9CView%E2%80%9D%E2%80%94%E2%80%94%E2%80%9CMemory%20Windows%E2%80%9D%E2%80%94%E2%80%94%E2%80%9CMemory1%E2%80%9D%EF%BC%9B%20%E5%9C%A8%E2%80%9CAddress%E2%80%9D%E5%9C%B0%E5%9D%80%E6%A0%8F%E4%B8%AD%E8%BE%93%E5%85%A5MSP%E7%9A%84%E5%80%BC%EF%BC%9A0x20001288%EF%BC%8C%E7%84%B6%E5%90%8E%E5%9C%A8%E5%AF%B9%E5%BA%94%E7%9A%84%E8%A1%8C%E9%87%8C%E6%89%BE%E5%88%B0%E5%9C%B0%E5%9D%80%E3%80%82%20%E5%9C%B0%E5%9D%80%E4%B8%80%E8%88%AC%E4%BB%A5%200x08%20%E5%BC%80%E5%A4%B4%E7%9A%8432%E4%BD%8D%E6%95%B0%E3%80%82%20%E6%9C%AC%E4%BE%8B%E4%B8%AD%EF%BC%8C%E5%9C%B0%E5%9D%80%E4%B8%BA0x08003CB9%E3%80%82
(3)可以理解为Code+Ro为所占用的flash,RW+ZI为所占用的RAM
八、SRC精简移植
之前移植时是直接把SRC全部内容加入,这样编译之后RAM会消耗很多,将近59000字节
现在想要使其小一点,参考普中科技重新移植,如果RAM够大可以不管这一步。现在的移植基于前面的基础。(经过再次移植发现消耗的RAM没有变化,所以没有用)应该是消耗RAM大小应该是取决于LVGL的版本,可以下载更低版本的LVGL。后面又看了下发现版本和普中科技是一样的?为什么其编译出来只有近40000字节?
(1)删除原来的LVGL_SRC文件
(2)加入新的文件(为src文件夹下面的子文件夹名字)

(3)往这些文件夹里面加入文件
1.core文件夹
加入src/core里面全部的c文件
2.draw文件夹
加入src/draw/sw里面的c文件和src/draw里面的c文件

3.extra文件夹
加入src/extra下面,除了src/extra/libs以外的全部c文件(注意子文件里面的也要加入)

4.font文件夹
加入src/font文件夹里面的所有c文件
5.gpu文件夹
加入src/draw文件夹里面的sdl和stm32_dma2d文件夹中的所有c文件

6.hal文件夹
加入src/hal里面的所有c文件
7.misc文件夹
加入src/misc里面的所有c文件
8. widgets文件夹
加入src/widgets里面的所有c文件

3396

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



