欢迎光临散文网 会员登陆 & 注册

关于LVGL在Clion中的移植使用

2023-07-08 15:41 作者:从小就叫小天才  | 我要投稿


   Clion是良好的编译器而LVGL是良好的图形化库,二者的有机结合可以实现更好的实现效果和编辑效果。

  首先移植我们相应的LVGL源代码这个过程就是上github拉代码的过程,非常简单我们就按下不表了。

  在拉取代码之后就是对于代码的一些不必要的部分,这部分也与网上的那些MDK的移植相同。

  然后后面就是进行LVGL的移植,将文件直接引入之后进行Cmake的编写。文件结构如下图1。

图1.LVGL的文件结构

  然后就是Cmake.txt的编写。主要就是:include_directories和file里面的文件改写。


include_directories(Core/Inc Drivers/STM32L4xx_HAL_Driver/Inc Drivers/STM32L4xx_HAL_Driver/Inc/Legacy Drivers/CMSIS/Device/ST/STM32L4xx/Include Drivers/CMSIS/Include lvgl TIMER myGui LCD KEY generated custom generated LED AHT10 MYIIC ADC)

add_definitions(-DUSE_HAL_DRIVER -DSTM32L475xx)

file(GLOB_RECURSE SOURCES "startup/*.*" "Drivers/*.*" "Core/*.*" "lvgl/*.*" "LCD/*.*" "TIMER/*.*" "KEY/*.*" "myGui/*.*" "generated/*.*" "custom/*.*" "LED/*.*" "AHT10/*.*" "MYIIC/*.*" "ADC/*.*")

然后重启Cmake应该就能编译通过。

编译通过之后的操作

  编译通过之后就是进行LVGL的相关配置的问题:

  1. 时钟心跳的配置:引入定时器中断作为LVGL的时钟心跳(因为定时器中断的速度更快,避免占用CPU的资源),在定时器中断函数中将LVGL的时钟心跳函数放入其中并且设置每ms进行采样。

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{
   if(htim == (&TIM3_Handler))
   {
     //  LED_B_TogglePin;        //LED_B翻转
     lv_tick_inc(1);
   }
}


2.进行LVGL的显示设置:在lvgl中有一个文件lv_port_disp.c在该文件中进行下面的操作在 disp_flush函数中进行相关填充函数的配置。

首先在其头部引入头文件

#include"lcd.h"

在disp_init函数中写入LCD_Init();进行相关的初始化。

LCD_ColorFill(area->x1,area->y1,area->x2+1,area->y2+1,(uint16_t*)color_p);

因为正点原子官方历程有一点问题这个函数就是自己重写的函数

void LCD_ColorFill(uint16_t xsta, uint16_t ysta, uint16_t xend, uint16_t yend, const uint16_t* color)
{
   uint16_t i, j;
   LCD_Address_Set(xsta, ysta, xend - 1, yend - 1); // 设置显示范围
   for (i = ysta; i < yend; i++)
   {
       for (j = xsta; j < xend; j++)
       {
           LCD_Write_HalfWord(*color++);
       }
   }
}

这就进行了函数的的显示。(但是刷新速度很慢建议还是使用DMA提速)


3.进行输入设备的配置:lv_port_indev.c中进行相关的配置。

LVGL给你提供了多种的输入模式。有鼠标,按键,触摸屏,键盘,还有ecode。

我们此处就是用按键代替矩阵键盘作为相关的输入设备。

首先是在文件头部引入头文件keypad_init中进行按键的初始化KEY_Init();

然后在keypad_get_key函数中返回相应的值LVGL是使用相应的值进行判断的

return KEY_Scan(1);//此处是返回按键的值

然后在keypad_read函数中进行相应的值的判断并且与LVGL的值相绑定。

       switch(act_key) {
           case KEY0_PRES:
               act_key = LV_KEY_NEXT; /*专注于下一个对象*/
               break;
           case KEY1_PRES:
               act_key = LV_KEY_PREV;/*专注于上一个对象*/
               break;
           case KEY2_PRES :
               act_key = LV_KEY_ENTER;/*确认*/
               break;
       }

       last_key = act_key;
   }
   else {
       data->state = LV_INDEV_STATE_REL;
   }

   data->key = last_key;
}

完成了这些你就可以在主函数中尝试使用。

我们在静态区域将它们的初始化进行封装

static void lvgl_init( void )
{


   lv_init();
   lv_port_disp_init();
   lv_port_indev_init();
   mygui();

   // lv_port_fs_init();

}

然后在main函数中进行调用

lvgl_init();

在while(1)中还要进行相应的lv_task_handler();

最后就能实现相应的效果剩下的就是你进行相应的LVGL的相关效果描写了然后就需要你自己进行相应的LVGL函数的学习。

可以参考的我的文件:https://github.com/hzhhistory/LVGL_stm32.git

关于LVGL在Clion中的移植使用的评论 (共 条)

分享到微博请遵守国家法律