自学内容网 自学内容网

天空星LVGL移植记录

一、移植的LVGL版本8.2

下载地址:(网页下个加速脚本)GitHub - lvgl/lvgl: Embedded graphics library to create beautiful UIs for any MCU, MPU and display type.icon-default.png?t=N7T8https://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)icon-default.png?t=N7T8https://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博客icon-default.png?t=N7T8https://blog.csdn.net/mucherry/article/details/126685909STM32移植LVGL8.0.2超详细的保姆级教程附移植好的工程文件_stm32 lvgl教程-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_42111891/article/details/124989266STM32移植LVGL踩坑集锦_lvgl内存不足-CSDN博客icon-default.png?t=N7T8https://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)触摸移植不是很了解,后面再说,上面给的网址有移植教程


原文地址:https://blog.csdn.net/byhyf83862547/article/details/140573068

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!