這里寫目錄標題
- 前言
- 一、本次實驗準備
- 1、硬件
- 2、軟件
- 二、移植LVGL代碼
- 1、獲取LVGL官方源碼
- 2、整理一下,下載后的源碼文件
- 3、開始移植
- 三、移植顯示驅動
- 1、enable LVGL
- 2、修改報錯部分
- 3、修改lv_config
- 4、修改lv_port_disp.c文件
- 到此步遇到的問題 Undefined symbol __aeabi_assert (referred from mbrtu.o).
- 解決方法
- 5.顯示測試
- c.配置定時器,在定時器中斷中給lvgl 設置“心跳“ 或者直接用 滴答定時器作為心臟也行
- 法一
- 法二
- 好,上一步結束,繼續配置
- main里最終是這樣的
- 還沒寫完,有問題 排查中。。。。
前言
記錄一下我的移植過程,方便以后回頭翻看
一、本次實驗準備
1、硬件
一塊野火的STM32F429IGT6開發板和7寸的觸摸屏;
2、軟件
-
官方的源碼 hal庫的,點擊進入野火官網 下載源碼
-
把定時器中斷實驗的代碼移植到觸摸屏實驗那里,用于后續給lvgl提供心跳時間 (如果移植后遇到Error: L6218E:在文件中添加stm32f10x_tim.c即可)
我發現例程里已經有了,可以直接include頭文件。
-
將程序下載進開發板,觸摸顯示正常即可
這款板子如果要觸摸正常,則要把代碼中的宏修改一下
具體操作:
把#define LCD_TOUCH_IC_GT1151QM
注釋掉。這樣觸摸屏才能有效果。
就可以畫出
二、移植LVGL代碼
1、獲取LVGL官方源碼
點擊此處,進入github 下載源碼
此處以8.2.0為例
2、整理一下,下載后的源碼文件
a. 我們暫時只需要,這5個文件,復制到新的文件夾中
b. 為減少內存的消耗,我們再細一點,把需要的文件單拎出來
examples文件夾中的,porting文件夾
demos文件夾中的,keypad_encoder文件夾、 lv_demos.h文件、lv_demos.mk 文件
c.規范化一下,把文件重名,把_template去掉
3、開始移植
a.在野火觸摸屏歷程中新建一個文件夾,存放lvgl的源碼
b.keil工程中,點開魔術棒,勾選C99;然后把Lvgl中的文件夾都加到頭文件路徑中(基本操作)
c.點開工程目錄管理器,添加所需的文件夾
LVGL_SRC (用來存放lvgl源碼)
LVGL_POR(用來配置lvgl接口文件)
LVGL_DEMO(用來配置lvgl官方例程)
LVGL_APP(用來存放用戶自己的lvgl代碼)
d.對號入座,往各個文件夾里添加所需的文件
提示:src文件有點多。。。多到離譜。要一個個文件夾點開,把.c文件都加進來,src中extra文件里面有許多子文件!!!全都要進來
文件夾src 加入到 LVGL_SRC
文件夾porting加入到LVGL_PORT,包括lvgl文件夾中的 lvgl.h lv_conf.h 和 lv_demos.h
文件夾keypad_encoder添加到LVGL_DEMO
三、移植顯示驅動
1、enable LVGL
將 lv_port_disp.c 、 lv_port_disp.h 、 lv_port_indev.c 、 lv_port_indev.h、 lv_conf.h 中的if 0改成 if 1
lv_port_fs.c暫時用不到,先不修改
2、修改報錯部分
a.編譯一下,有很多個error,沒事,我們一個個改
(1)我們之前規范化把文件名字修改了,所以把頭文件中的_template都去掉
(2)將…/…/去掉
直接 ctrl+F
全局替換一下
3、修改lv_config
我們自己添加 屏幕分辨率。
#define MY_DISP_HOR_RES 800
#define MY_DISP_VER_RES 480
4、修改lv_port_disp.c文件
往下拉修改分辨率,把剛剛定義的宏 替換過去
disp_drv.hor_res = MY_DISP_HOR_RES;
disp_drv.ver_res = MY_DISP_VER_RES;
到此步遇到的問題 Undefined symbol __aeabi_assert (referred from mbrtu.o).
AirPressure\AirPressure.axf: Error: L6218E: Undefined symbol __aeabi_assert (referred from mbrtu.o).
解決方法
5.顯示測試
a.修改主函數,留下必要的初始化函數
b.打開使能demo的宏,在lv_conf里
c.配置定時器,在定時器中斷中給lvgl 設置“心跳“ 或者直接用 滴答定時器作為心臟也行
法一
法二
配置定時器,在定時器中斷中給lvgl 設置“心跳“
參考這個鏈接!!野火官網的教程
在定時器中斷函數中添加lvgl心跳(#include “lvgl.h”)
/*** @brief 定時器中斷服務函數* @param 無* @retval 無*/void BASIC_TIM_IRQHandler (void){HAL_TIM_IRQHandler(&TIM_TimeBaseStructure);}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){if (htim==(&TIM_TimeBaseStructure)) {lv_tick_inc(1);//lvgl的1ms中斷LED1_TOGGLE; //紅燈周期閃爍}}
好,上一步結束,繼續配置
d.在主函數中添加lvgl相關頭文件
#include "lvgl.h"
#include "lv_port_disp.h"
#include "lv_port_indev.h"
#include "lv_demo_keypad_encoder.h"
e.在while循環中,調用lvgl事務處理函數
lv_task_handler(); // lvgl的事務處理
f.在main中添必要函數
lv_init();
lv_port_disp_init();//lvgl顯示接口初始化,放在lvgl_init()的后面
lv_port_indev_init();//lvgl輸入接口初始化,放在lvgl_init()的后面
lv_demo_keypad_encoder();
g.將堆棧改大一點