关于LVGL在Clion中的移植使用

Clion是良好的编译器而LVGL是良好的图形化库,二者的有机结合可以实现更好的实现效果和编辑效果。
首先移植我们相应的LVGL源代码这个过程就是上github拉代码的过程,非常简单我们就按下不表了。
在拉取代码之后就是对于代码的一些不必要的部分,这部分也与网上的那些MDK的移植相同。
然后后面就是进行LVGL的移植,将文件直接引入之后进行Cmake的编写。文件结构如下图1。

然后就是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的相关配置的问题:

时钟心跳的配置:引入定时器中断作为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