可以应用于嵌入式的GUI有很多,除了上一篇文章介绍的emWin,还有周立功的AWTK、Microsoft的GUIX以及TouchGFX等,本篇文章将介绍一种轻量级的GUI:LittleVGL

硬件环境:STM32F429IGT6

软件环境:STM32CubeMX v5.5.0

HAL库版本:STM32CubeF4 Firmware Package V1.24.0

LittleVGL版本:v7.9.0

01

LittleVGL简介

LittlevGL简称LVGL, 是一个使用C编写的开源免费的GUI,可以应用在嵌入式设备中。用户可以从官网或者Github上下载。

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

其特点如下:

  1. 强大的模块化编程能力,能够创建包括按键,图标,列表,滑块,图片在内的功能

  2. 先进的图形界面,包含动画,抗撕裂,可调明暗度,柔和缩放等功能。

  3. 支持不同的输入设备包括键盘,鼠标,触摸屏,编码器等。

  4. UTF-8编码多语言支持。

  5. 多显示器支持,可以同时使用多个TFT或单色显示。

  6. 完整的可自定义图形元素。

  7. 不限制芯片类型,硬件可无限制地在各种芯片上使用LVGL。

  8. 可自定义内存调用。

  9. 支持但不强制使用操作系统,外部存储或GPU。

  10. 使用单一框架缓存支持复杂的图形界面。

  11. 整个库用C编写最大程度地提高兼容性。

对硬件的要求:

  1. 16,32或64位微处理器或芯片

  2. 建议使用大于16MHz的时钟速度

  3. 闪存/ROM:对于重要部件要求大于64KB(建议大于180KB)

  4. RAM:

  • 静态RAM使用:根据不同功能与对象2KB以内不等。

  • 栈:大于2KB(建议大于8KB)。

  • 堆:大于2KB(如果使用多个对象建议大于16KB)用lv_conf.h库中的LV_MEM_SIZE来设置。

  • 显示缓存:大于“水平分辨率”像素值(建议大于10*“水平分辨率”像素值)。

02

移植前准备

    1.底层驱动

首先完成硬件的底层驱动,包括LCD显示,触摸屏等。本例以STM32F429驱动7寸RGB接口屏为例,底层程序可参考之前的文章《STM32CubeMX之LTDC接口》

    2.源码下载

下载源码和例程。

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

例程:https://github.com/littlevgl/lv_examples

将下载并解压后的两个文件夹复制到工程目录,如下:

03

移植

1.添加文件到工程

首先在工程目录新建三个组:

其中lvgl为源码文件,lvgl/example为演示例程,lvgl/port为接口文件。需要用户完成的只有lvgl/port下的两个文件。

首先将lvgl/src目录及其子目录下的全部文件添加进去。(文件较多就不展开了)

将演示例程中的其中一个添加到工程中,这里选择了lv_demo_widgets。

将lvgl/example/porting目录下的两组.c和.h文件添加到lvgl/port下(这里重命名了一下)。

2.接口程序编写

lv_port_disp为显示接口文件,lv_port_indev为输入接口(这里是触摸屏)文件。

lv_port_disp文件中需要修改两个函数,lv_port_disp_init和disp_flush。这两个函数的主要功能是完成显示缓冲初始化,以及将显示缓存中的内容显示到LCD上。需要用户根据显示屏接口的不同自己完成相关程序。

//显示接口初始化void lv_port_disp_init(void){  static lv_disp_buf_t disp_buf;    //显示缓冲区初始化,因为使用了SDRAM,所以可以设置为双缓冲区  lv_disp_buf_init(&disp_buf, color_buf, color_buf2, COLOR_BUF_SIZE); lv_disp_drv_t disp_drv;                           lv_disp_drv_init(&disp_drv);                    //屏幕分辨率  disp_drv.hor_res = 800;  disp_drv.ver_res = 480;  //注册显示驱动回调  disp_drv.flush_cb = disp_flush;  //注册显示缓冲区  disp_drv.buffer = &disp_buf;
#if LV_USE_GPUdisp_drv.gpu_blend = gpu_blend;disp_drv.gpu_fill = gpu_fill;#endif  //注册显示驱动  lv_disp_drv_register(&disp_drv);}//把指定区域的显示缓冲区内容写入到屏幕上,使用DMA2D完成这个操作static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p){  //把指定区域的显示缓冲区内容写入到屏幕  LTDC_Color_Fill(area->x1,area->y1,area->x2,area->y2,(uint16_t*)color_p);  lv_disp_flush_ready(disp_drv);}

lv_port_indev文件中包含了触摸屏、鼠标、键盘等多种输入设备,本例中使用了触摸屏,因此其它程序可以屏蔽掉。需要修改的两个函数为初始化和读取触摸坐标的函数touchpad_init和touchpad_read:

/*Initialize your touchpad*/static void touchpad_init(void){    /*Your code comes here*/  TOUCH_Init();}
/* Will be called by the library to read the touchpad */static bool touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data){    static lv_coord_t last_x = 0;    static lv_coord_t last_y = 0;/*Save the pressed coordinates and the state*///    if(touchpad_is_pressed()) {//        touchpad_get_xy(&last_x, &last_y);//        data->state = LV_INDEV_STATE_PR;//    } else {//        data->state = LV_INDEV_STATE_REL;//    }
//    /*Set the last pressed coordinates*///    data->point.x = last_x;//    data->point.y = last_y;      if(TOUCH_ReadXY(&last_x, &last_y))    {      data->state = LV_INDEV_STATE_PR;    }    else    {      data->state = LV_INDEV_STATE_REL;    }    data->point.x = last_x;    data->point.y = last_y;    /*Return `false` because we are not buffering and no more data to read*/    return false;}

3.头文件配置

接下来将源码目录下的lv_conf_template.h文件包含到工程中,这里重命名为lv_conf.h。

该文件中包含了一些lvgl的基本配置,包括分辨率以及颜色模式等。

将演示例程目录下的lv_ex_conf_template.h包含到工程中,这里重命名为lv_ex_conf.h。该文件主要是选择使能哪一个演示例程。

 4.其它

滴答定时器中断中添加lvgl的时基函数:lv_tick_inc(1)

接下来在主函数中初始化以及demo调用的程序,lvgl初始化前需要完成触摸屏和SDRAM等的初始化。需要注意的是lv_task_handler();函数需要循环调用,以便lvgl完成自身任务的调用。

另外移植过程中需要注意一些头文件的包含路径,以及一些文件开头的#if 0改为#if 1等细节问题。

到此程序移植完成,编译后运行查看效果:

04

总结

可以看到,移植过程并不复杂,而且LVGL的控件丰富,相比于emWin接近于windows XP的默认主题,LVGL更接近于Android,界面美观。但各种辅助工具不如emWin多,使用起来稍显复杂。

欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。

LittleVGL移植到STM32相关推荐

  1. harmonyos能否移植到MCU,HarmonyOS(LiteOs_m) 官方例程移植到STM32初体验

    HarmonyOS(LiteOs_m) 官方例程移植到STM32初体验 硬件平台 基于正点原子战舰V3开发板 MCU:STM32F103ZET6 片上SRAM大小:64KBytes 片上FLASH大小 ...

  2. Basic脚本解释器移植到STM32

    上次讲了LUA移植到STM32,这次讲讲Basic脚本解释器移植到STM32.在STM32上跑Basic脚本,同样可以跟穿戴设备结合,也可以作为初学者学习MCU的入门工具,当然前提是有人做好Basic ...

  3. 基于Linux的kfifo移植到STM32(支持os的互斥访问)

    基于Linux的kfifo移植到STM32(支持os的互斥访问) 声明:本文为杰杰原创,转载请说明出处 https://blog.csdn.net/jiejiemcu/article/details/ ...

  4. 12864移植到STM32平台

    利用串口方式将原本51单片机上的串口程序移植到STM32上,调试了两天终于可以显示了 1. 排查IO的初始化是否有问题,在STM32平台上需要对IO口时钟使能,IO口模式配置,一些特殊的管脚还需要做特 ...

  5. U8G2库移植到STM32平台上

    U8G2库简介 U8g2是嵌入式设备的单色图形库,一句话简单明了.主要应用于嵌入式设备,包括我们常见的单片机: 建议先看这篇博客的介绍,写的比较好u8g2库的使用 这篇博客介绍了对于u8g2的使用,但 ...

  6. ucos移植到stm32上的中断小小改进

    uCosII移植到stm32上的文章和demo已经很多了,细节上建议大家可以看官方的移植文档( 当然是E文的).网上流传的各种移植版本基本都是基于官方的移植版本做了小改进.这些改进基本都限制在更适合自 ...

  7. stm32 移植java_把Lua移植到stm32上,效果不错! (amoBBS 阿莫电子论坛)

    因为我们产品的需要满足不同行业需求,所以一直在寻找一个脚本语言,以便灵活配置. 前段时间还自己花时间去实现一个C语言解释器,看了一堆编译原理的东西,以及虚拟机等,头都搞大了,把基本功能实现了,但总是不 ...

  8. GUI Guider设计UI界面移植到STM32

    GUI Guider设计UI界面移植到STM32 一.什么是GUI Guider 什么是 GUI-Guider? GUI Guider 是恩智浦为 LVGL 开发了一个上位机GUI 设计工具,可以通过 ...

  9. stm32f103各个型号芯片之间程序移植(stm32的兼容问题)

    stm32f103各个型号芯片之间程序移植(stm32的兼容问题) 1.stm32f103系列的各个型号的芯片差别一般不大,都是一些flash大小不一样,一般是向下兼容(大容量芯片兼容中容量芯片)还有 ...

  10. 触摸控制芯片MPR121驱动移植(STM32)

    本文记录将arduino下的mpr121触摸板驱动程序移植到stam32f1 1.触摸板简介 之前买了块mpr121做主控的触摸控制板(如下图),卖家给的驱动是arduino的,最近做项目需要移植到s ...

最新文章

  1. HTTP代理如何正确处理Cookie
  2. linux shell用户交互,鱼 - 一个明智的和用户友好的交互式shell为Linux
  3. python读取日志错误信息_关于修复 Bug 这件“小事”|利用Python 日志查找错误也可行...
  4. Java面试高频题:Spring Boot+JVM+Nacos高并发+高可用已撸完​
  5. centos7镜像加速_docker 镜像加速CentOS7详细介绍
  6. Spring的beans标签下可以有其他标签
  7. dns重定向_怎样理解DNS缓存投毒?
  8. Java 程序读取properties文件
  9. 黑客帝国角色 之 尼奥解读
  10. VS下更新Qt语言家ts文件没反应
  11. 详解apply的用处
  12. 五大车载操作(VOS)系统
  13. locust性能测试工具
  14. 2110449-02-8,2110449-02-8巯基反应性PEG
  15. dell inspiron 只有一个飞行模式 没有wifi_教你电脑连不上wifi的解决方法
  16. 常见的网站攻击与防御,道高一尺,魔高一丈
  17. JeecgBoot 低代码平台 2.4.5 版本发布,钉钉与企业微信集成版本
  18. JQuery - 反向选择器
  19. 使用Arduino和HCSR04超声波传感器进行简单的超声波悬浮
  20. 一文了解人工智能神经网络的原理

热门文章

  1. 科研写作——常见句式(九)
  2. 挖金矿问题(c++求解)
  3. 一个EXCEL数组公式的解析
  4. oracle 11g RAC 修改scan port 一例
  5. Texture ASTC转换ETC
  6. 如何判断手机是否支持ASTC格式的贴图
  7. SMTP和POP协议
  8. Comma Separated Values Format
  9. 计算机兴趣小组活动总结,兴趣小组活动总结优秀范文
  10. RestFul资源架构设计详解