在STM32F4上移植LVGL8.2

一、为什么选择LVGL8.2版本

因为想使用NXP的GUI Guider进行开发,而目前他的版本支持只有7.10.1和8.2.0两个。
在STM32F4上移植LVGL8.2_第1张图片

二,获取LVGL并移植

到下列地址下载:
LVGL的GITHUB仓库
选择8.2版本
在STM32F4上移植LVGL8.2_第2张图片

三、新建工程

1.要求
有一个显示屏(分辨率大于100*100,后续GUI Guider要求),单片机能正常驱动。并有一个填充点函数,类似于LCD_Fill(uint16_t x,uint16_t y,uint16_t color);
最好编写一个色块填充函数,有利于提高速度。
2.复制LVGL驱动
2.1 单片机工程文件夹下面建立lvgl文件夹,用来存放驱动;
在STM32F4上移植LVGL8.2_第3张图片

2.2将下载的8.2版本LVGL解压后,复制下列文件到单片机工程文件
在STM32F4上移植LVGL8.2_第4张图片
2.3复制完成后,文件列表如下,注意删除文件名的“_template”后缀,porting文件夹里面的也要删除这个后缀:
在STM32F4上移植LVGL8.2_第5张图片
2.4在单片机工程管理里面,建立管理目录:
在STM32F4上移植LVGL8.2_第6张图片
其中GUI/LVGL,添加lvgl->src下的所有C文件。这个比较考验耐心,很多文件。
GUI/Porting,添加lvgl->porting文件夹里面的C文件。
GUI/APP,添加lv_config.h和lvgl.h头文件,添加完效果如下:
在STM32F4上移植LVGL8.2_第7张图片
其中GUI/Generated先不管。
2.5修改lv_port_disp.c文件内容:
在STM32F4上移植LVGL8.2_第8张图片
在STM32F4上移植LVGL8.2_第9张图片
在STM32F4上移植LVGL8.2_第10张图片
同时更新此文件包含的刷屏函数

/*Flush the content of the internal buffer the specific area on the display
 *You can use DMA or any hardware acceleration to do this operation in the background but
 *'lv_disp_flush_ready()' has to be called when finished.*/
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
    /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/
	
//    int32_t x;
//    int32_t y;
//    for(y = area->y1; y <= area->y2; y++) {
//        for(x = area->x1; x <= area->x2; x++) {
//            /*Put a pixel to the display. For example:*/
//            /*put_px(x, y, *color_p)*/
//						ILI9163B_draw_dot(x,y,color_p->full);
//            color_p++;
//        }
//    }

		ILI9163B_FillColor(area->x1,area->y1,area->x2,area->y2,(uint16_t *)color_p);

    /*IMPORTANT!!!
     *Inform the graphics library that you are ready with the flushing*/
    lv_disp_flush_ready(disp_drv);
}

其中被注释的是默认描点函数,比较慢,可以考虑自己编写色块填充函数来提高速度。
2.6.修改lv_port_indev.c文件
在STM32F4上移植LVGL8.2_第11张图片
2.7修改lv_config.h文件
此文件除了按照2.5里面修改分辨率之外,还可以启用CPU占用率观察,这样就可以不加入demo文件,直接观察lvgl是否正常启动了。
在STM32F4上移植LVGL8.2_第12张图片
2.8,初始化main程序
首先包含所需头文件
在STM32F4上移植LVGL8.2_第13张图片
初始化。
在STM32F4上移植LVGL8.2_第14张图片
2.9启动lvgl
在freertos里面开设一个任务,周期刷新即可,记得freertos包含lvgl的头文件。

/* USER CODE END Header_StartLvglTask */
void StartLvglTask(void const * argument)
{
  /* USER CODE BEGIN StartLvglTask */
  /* Infinite loop */
  for(;;)
  {
		osDelay(5);
		lv_task_handler();
  }
  /* USER CODE END StartLvglTask */
}

至此,lvgl即可驱动,里面会有比较多的警告,可以忽略。

注意

1、lvgl的头文件包含如果报错,可以在keil里面设置简易包含:
在STM32F4上移植LVGL8.2_第15张图片
2色块填充函数
在lv_port_disp.c文件里面,推荐使用色块填充函数;

static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{

	ILI9163B_FillColor(area->x1,area->y1,area->x2,area->y2,(uint16_t *)color_p);

lv_disp_flush_ready(disp_drv);

}

注意这个函数的color_p是一个指向某一区块(设置缓存一般是1/10屏幕高度)颜色的指针。

看一下实际效果吧:

忽略上面的3个控件,那是用gui guider生成的。
下面的cpu占用率和fps是此次项目生成的。

你可能感兴趣的:(液晶屏,外设,stm32,单片机,arm)