littlevGL:移植到STM32

2023-10-18 05:40
文章标签 stm32 移植 littlevgl

本文主要是介绍littlevGL:移植到STM32,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.简介

LittlevGL 是一个使用C编写的开源免费的GUI,应用在嵌入式设备。

源码:https://github.com/littlevgl/lvgl

2.移植准备

首先需要一个可以正常使用的工程,有LCD驱动,触摸驱动。假设此工程的文件夹名为lvgldemo。

本文使用的IDE为KEIL MDK。

下载:https://github.com/littlevgl/lvgl 和 https://github.com/littlevgl/lv_examples

前者为源码所在;后者是使用例程,其中包含移植参考。

不同的版本可能会有不同的移植操作,不过基本相差不大,最重要的是要参考源码作者提供的移植例程与说明。

3.移植

1.新建一个文件夹命名为lvgl,解压https://github.com/littlevgl/lvgl下载的压缩包至lvgl文件夹,然后将此文件夹整个移动到事先准备好的工程文件夹。

2.复制lvgl文件夹下的lv_conf_templ.h文件到文件夹lvgldemo下面,并重命名为lv_conf.h。

3.修改lv_conf.h里的几个参数。最基本的3个:LCD的长和宽,像素位深。其他参数暂时不管。

/* Horizontal and vertical resolution of the library.*/
#define LV_HOR_RES          (800)
#define LV_VER_RES          (480)
/*Color settings*/
#define LV_COLOR_DEPTH     16                     /*Color depth: 1/8/16/32*/

还需要将文件开头的#if 0 改为 #if 1;

4.打开工程文件,Options for target...对话框--> C/C++子项 -->include paths,添加路径“..\lvgl”和“..”。

5.使用manage project items 对话框为工程建立lvgl组,往组里面添加lvgl文件夹下的全部C文件。

6.编译一下,可能会发现很多错误。由于KEIL 默认不支持匿名联合体,而littlevGL中使用了,所以需要在相应文件添加上

#pragma anon_unions

再次编译可以通过了。在这里,不同的版本可能会出现不同的编译错误。例如低版本中使用了二进制形式0bXXXX,这是KEIL不支持的,对应地修改为常规方法即可。

7.实现3个显示函数(.disp_fill,.disp_map,.disp_flush);一个输入设备读取函数(.read)。这个4个函数比较简单,就是显示屏的矩形填充函数,以及触摸屏(或者按钮,鼠标)的读取函数,记得要参考lv_tutorial_porting.c的格式,并且这几个函数是以注册方式使用的。(所谓注册就是赋值,函数名本身也是一种指针变量)

 

4.使用

在lv_examples-master\lv_tutorial\0_porting\lv_tutorial_porting.c中,有详细的使用的方法。

/************************ Initialize LittlevGL***********************/lv_init();/************************ Tick interface***********************//* Initialize a Timer for 1 ms period and* in its interrupt call* lv_tick_inc(1); *//************************ Display interface***********************/your_display_init();                       /*Initialize your display*/lv_disp_drv_t disp_drv;                         /*Descriptor of a display driver*/lv_disp_drv_init(&disp_drv);                    /*Basic initialization*//*Set up the functions to access to your display*/disp_drv.disp_flush = ex_disp_flush;            /*Used in buffered mode (LV_VDB_SIZE != 0  in lv_conf.h)*/disp_drv.disp_fill = ex_disp_fill;              /*Used in unbuffered mode (LV_VDB_SIZE == 0  in lv_conf.h)*/disp_drv.disp_map = ex_disp_map;                /*Used in unbuffered mode (LV_VDB_SIZE == 0  in lv_conf.h)*/#if USE_LV_GPU/*Optionally add functions to access the GPU. (Only in buffered mode, LV_VDB_SIZE != 0)*/disp_drv.mem_blend = ex_mem_blend;              /*Blend two color array using opacity*/disp_drv.mem_fill = ex_mem_fill;                /*Fill a memory array with a color*/
#endif/*Finally register the driver*/lv_disp_drv_register(&disp_drv);/************************** Input device interface*************************//*Add a touchpad in the example*//*touchpad_init();*/                            /*Initialize your touchpad*/lv_indev_drv_t indev_drv;                       /*Descriptor of an input device driver*/lv_indev_drv_init(&indev_drv);                  /*Basic initialization*/indev_drv.type = LV_INDEV_TYPE_POINTER;         /*The touchpad is pointer type device*/indev_drv.read = ex_tp_read;                 /*Library ready your touchpad via this function*/lv_indev_drv_register(&indev_drv);              /*Finally register the driver*//************************************** Run the task handler of LittlevGL*************************************/while(1) {/* Periodically call this function.* The timing is not critical but should be between 1..10 ms */lv_task_handler();delay_ms(5)}

不要忘了需要在1MS定时中断里调用lv_tick_inc(1) ;

测试了例程的几个,效果还行。比EMWIN好看一些。EMWIN风格类似window XP ,littlevGL风格类似android ;

如果想换主题(THEME),可以在lv_conf.h里面使能

/*================*  THEME USAGE*================*/
#define LV_THEME_LIVE_UPDATE    0       /*1: Allow theme switching at run time. Uses 8..10 kB of RAM*/#define USE_LV_THEME_TEMPL      0       /*Just for test*/
#define USE_LV_THEME_DEFAULT    0       /*Built mainly from the built-in styles. Consumes very few RAM*/
#define USE_LV_THEME_ALIEN      0       /*Dark futuristic theme*/
#define USE_LV_THEME_NIGHT      0       /*Dark elegant theme*/
#define USE_LV_THEME_MONO       0       /*Mono color theme for monochrome displays*/
#define USE_LV_THEME_MATERIAL   0       /*Flat theme with bold colors and light shadows*/
#define USE_LV_THEME_ZEN        0       /*Peaceful, mainly light theme */
#define USE_LV_THEME_NEMO       0       /*Water-like theme based on the movie "Finding Nemo"*/

然后这样使用

//hue 是主题前景色绿色分量 0-255
void my_lv_set_themes( uint16_t hue )
{/*Initialize the alien theme* hue: a green HUE value* NULL: use the default font (LV_FONT_DEFAULT)*/lv_theme_t * th = lv_theme_material_init(hue, NULL);/*Set the surent system theme*/lv_theme_set_current(th);}

5.总结

可以看到,littlevGL的移植真的很简单。只需要修改一个文件,以及实现四个函数即可;而且四个函数里有两个其实基本一样。

就拿常用的emwin来说,移植需区分有无操作系统,何种操作系统,何种IDE,需要实现的函数修改的文件也很多;不过移植成功后,使用起来比较方便,还有各种软件工具辅助,相比起来,littlevGL使用稍微复杂,也没有什么辅助软件。

两者都有二十几个控件(widget/objects),littlevGL相对美观些,但灵活性相对差一点。

正是:鱼和熊掌不可兼得。

这篇关于littlevGL:移植到STM32的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/230539

相关文章

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品

STM32的使用方法一

注:我采用的是STM32F103RC芯片、相应的电路图和STM32CubeIDE软件这是在STM32CubeIDE软件定义芯片后,所给的必要的代码逻辑,加上了注释 #include "main.h"/* Private variables ---------------------------------------------------------*//* Private function

STM32 HAL CAN通讯 实操

1、简介 相比于串口通讯,对于刚接触CAN通讯的小白来说,CAN通讯相对复杂,看各种视频、帖子理论,总是一知半解。本次通过傻瓜式操作,先实现CAN通讯的交互,以提高小白的信心,也便于自己复习观看。本次以STM32CubeMX进行初始化配置,通过Keil 5软件进行软件设计,通过CAN盒实现进行数据的交互。该流程实际以STM32F0、F1、F3、F4、F7实测好用(理论上都适用),这三种型号单片机

我在高职教STM32——准备HAL库工程模板(1)

新学期开学在即,又要给学生上 STM32 嵌入式课程了。这课上了多年了,一直用的都是标准库来开发,已经驾轻就熟了。人就是这样,有了自己熟悉的舒适圈,就很难做出改变,老师上课也是如此,排斥新课和不熟悉的内容。显然,STM32 的开发,HAL 库已是主流,自己其实也在使用,只不过更换库就意味着教学内容有很大变化,自己也就迟迟没有迈出调整这一步。现在,是时候做出变化了,笔者计划保持教学项