stm32h750移植lvgl

2022-10-30 15:00:37

之前沒做過ui,只用過lcd畫幾條線寫點字,如果按鍵、選單什麼的全用線畫也太麻煩了,所以需要一個ui庫。

聽說lvgl用的人很多,就打算裸機移植一下用用。本文移植的lvgl版本是lvgl6.2,也移植過8.2,但是flash佔用陡增佔了快300k,我用到了外接flash,涉及到bootloader+app,有機會下篇文章細說。

使用的微控制器是stm32h750vbt6,內建的flash極小只有128k,ram倒是很大1M夠用了,符合lvgl6.2的最低要求,當然具體用多少和螢幕大小有關,視訊記憶體容量必須算進去。

lvgl原始碼下載地址https://github.com/lvgl/lvgl

lvgl具體使用直接在官網可以找到

下載完可見到這樣的目錄結構,我們只要使用到這幾個資料夾的內容。

幾個資料夾、檔案介紹:

src裡是原始碼,把.c檔案全部加入工程,什麼都不用改。

porting裡是提供的介面模板xxxtemplate,需要新增修改內容,是本地lcd、輸入裝置、檔案系統和lvgl的橋樑(比如你有刀,但不會砍樹,把刀遞給lvgl它才能砍樹)。

lv_conf_template.h顧名思義是組態檔的模板,需要修改。

 

具體移植流程:

lv_conf_template.h改名為lv_conf.h放到和lvgl資料夾同級的位置,否則會造成後續標頭檔案找不到的問題。

porting內的檔案同樣把_template字尾都刪了重新命名。

 

最後新增進工程的檔案如圖所示:

 

把這幾個檔案的#if 0全部改成1使能這幾個檔案,並且把3個lv_port_xxx.c檔案的include也刪掉字尾_template和你自己的對應。

 

lv_port_disp.c 負責顯示部分;

lv_port_fs.c 負責檔案系統部分(file system);

lv_port_indev.c 負責輸入裝置部分(input device);

本次我只用到了顯示部分,所以我只改了lv_port_disp.c和lv_conf.h

1、lv_conf.h修改此處,為你的螢幕畫素大小,我的是160*90:

 

2、lv_port_disp.c ,找到void lv_port_disp_init(void)函數修改其內容如圖,lvgl6.2提供三種範例,disp_buf_123對應ui處理速度慢中快可自己選擇,我這裡選擇的2:

lv_port_disp.c ,繼續新增你自己lcd的1初始化函數、2畫點函數如圖:

3、最後再自己配個1-10ms的中斷,加入lv_tick_inc(x)函數給lvgl心跳計時用。x為你中斷週期,我這裡為1ms所以寫1。

4、當然記得加標頭檔案路徑,用到多少加多少,我的如下:

5、開始編譯,不報錯基本就移植成功了:

可能報錯的原因:

flash超出或者ram超出報memory錯誤這個沒本法,可以用外接ram、flash。

標頭檔案原始檔找不到等錯誤可能是設定步驟沒做對仔細檢查。

使用lvgl範例:

然後在main函數內加入如下內容,進行測試:

 

意思是在lv_acr_act()圖層上畫一個方塊,加一個label標籤顯示字號為15的「Hello, world」。

最後在主迴圈內加入lvgl的重新整理函數,迴圈執行:

重新編譯下載效果如下:

移植成功。

ui就是很吃儲存空間的,lvgl高版本吃更多的記憶體但也代表著更豐富的功能,我後來移植的8.2版本對flash要求更高遠超了128k,用到了外接qspi的flash,用到bootloader+app的結構,後續有機會細說。