基于CUBEMX的STM32F4 Hal库,配置LVGL(无操作系统版)
阅读原文时间:2023年08月09日阅读:1
本篇文章移植思路适用于所有嵌入式MCU,包括Arm,STM32,NXP,乐鑫,Nuvoton,Arduino,RT-Thread,Zephyr,NuttX,Adafruit等等。

为什么要写这一篇移植教程?

也许你会说各种开源论坛上面上,已经有很多移植教程了,为什么还要再重新写一篇?

因为很简单我按照前辈们的思路和移植步骤,到最后没有一个成功的,这就不得不得需要再重新研究下官网的移植教程了> https://docs.lvgl.io/master/porting/project.html

按照官网的移植教程,我顺利的将最新版的LVGL移植到STM32F4主控板上并且点亮显示屏

由于项目的需要,后续会慢慢的加入操作系统(FreeRTOS),SD卡读取,内存管理,实体键盘等外设或功能。

现在开始移植吧!(LVGL——Vser 8.3)

1.下载路径①

https://github.com/lvgl/lvgl

通过git clone或者直接下载都行

下载完文件内容是这样的

Tips:文件里面的内容在这一篇文章,不作分析,本篇文章只对移植是否成功进行探究。

需要裁剪的有4个文件,分别是2个文件夹和2个单独文件,如下图所示

将裁剪出来的文件,复制并且粘贴到自己的工程目录下,至于你想粘贴到哪里随你的便,我不关心,只需要在往MDK中添加时,能够找到相应的路径就行。

1.1 创建的分组应该为这样

里面的conf.h文件是我自己方便配置的时候找到文件,故意添加到分组里面的,我的意思:你可以不添加,随你的便。

1.2 往分组里面添加.c文件

再添加前需要将这个文件重新命名下:(就是将名称里template删除)

将..\lvgl\src文件夹下面的所有.c文件添加LVGL_Core分组里面

特别注意是:所有!!!

将..\lvgl\examples\porting文件夹的文件按需添加到LVGL_Port里面

各接口代码含义:

lv_port_disp_template -------显示屏接口代码

lv_port_fs_template --------文件管理接口代码

lv_port_indev_template-------输入接口代码

添加后,如下图所示

1修改lv_port_disp_template.h文件

第7行改为#if 0 改为#if 1

第22行改为#include "lvgl.h"

2修改lv_port_disp_template.c文件

第7行改为#if 0 改为#if 1

第13行改为添加LCD显示屏驱动文件

屏蔽下图部分

disp_flush修改画点函数

将disp_flush函数中,源代码屏蔽或者删除掉,添加自己的显示屏填充函数。

1.空间不够

解决方法将lvgl_conf.h文件中 #define LV_MEM_SIZE (32 * 1024U) /*[bytes]*/ 数值适当缩小,官方默认是512*1024U也就是512k,数值太大你的小小单片机肯定空间不够!

/*************************************************************************************************************************/

至此移植工作已经全部结束,编译,如果再有问题,必须解决后才能往下操作!

点击查看代码

void lv_ex_label(void)
{
        char* github_addr = "lvgl_test";
        lv_obj_t * label = lv_label_create(lv_scr_act());
    lv_label_set_recolor(label, true);
    lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR); /*Circular scroll*/
    lv_obj_set_width(label, 120);
    lv_label_set_text_fmt(label, "test", github_addr);
    lv_obj_align(label, LV_ALIGN_CENTER, 0, 10);

    lv_obj_t * label2 = lv_label_create(lv_scr_act());
    lv_label_set_recolor(label2, true);
    lv_label_set_long_mode(label2, LV_LABEL_LONG_SCROLL_CIRCULAR); /*Circular scroll*/
    lv_obj_set_width(label2, 120);
    lv_label_set_text_fmt(label2, "123");
    lv_obj_align(label2, LV_ALIGN_CENTER, 0, -10);
}

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
  LCD_Init();
  lv_init();
  lv_port_disp_init();

  system_init();
  lv_ex_label();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
//      LCD_Fill(0,0,480,320,RED);
        lv_task_handler();
        HAL_Delay(10);

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
} 
目前就写到这里吧,后面再遇到什么问题再补充。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章