基于CUBEMX的STM32F4 Hal库,配置LVGL(无操作系统版)
本篇文章移植思路适用于所有嵌入式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)
Step.1LVGL官网下载
1.下载路径①
https://github.com/lvgl/lvgl
通过git clone或者直接下载都行
下载完文件内容是这样的
Tips:文件里面的内容在这一篇文章,不作分析,本篇文章只对移植是否成功进行探究。
Step.2LVGL文件裁剪
需要裁剪的有4个文件,分别是2个文件夹和2个单独文件,如下图所示
Step.3LVGL文件复制
将裁剪出来的文件,复制并且粘贴到自己的工程目录下,至于你想粘贴到哪里随你的便,我不关心,只需要在往MDK中添加时,能够找到相应的路径就行。
Step.4MDK文件分组与.c添加
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-------输入接口代码
Step.5MDK头文件添加
添加后,如下图所示
Step.6MDK中修改已经移植好的LVGL文件
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函数中,源代码屏蔽或者删除掉,添加自己的显示屏填充函数。
Step.7MDK移植LVGL可能出现的问题
1.空间不够
解决方法将lvgl_conf.h文件中 #define LV_MEM_SIZE (32 * 1024U) /*[bytes]*/
数值适当缩小,官方默认是512*1024U也就是512k,数值太大你的小小单片机肯定空间不够!
/*************************************************************************************************************************/
至此移植工作已经全部结束,编译,如果再有问题,必须解决后才能往下操作!
Step.8让LVGL跑起来吧!
点击查看代码
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 */
}