stm32h750移植lvgl
之前沒做過ui,只用過lcd畫幾條線寫點字,如果按鍵、菜單什麼的全用線畫也太麻煩了,所以需要一個ui庫。
聽說lvgl用的人很多,就打算裸機移植一下用用。本文移植的lvgl版本是lvgl6.2,也移植過8.2,但是flash佔用陡增佔了快300k,我用到了外置flash,涉及到bootloader+app,有機會下篇文章細說。
使用的單片機是stm32h750vbt6,內置的flash極小只有128k,ram倒是很大1M夠用了,符合lvgl6.2的最低要求,當然具體用多少和屏幕大小有關,顯存容量必須算進去。
lvgl源碼下載地址//github.com/lvgl/lvgl
lvgl具體使用直接在官網可以找到
下載完可見到這樣的目錄結構,我們只要使用到這幾個文件夾的內容。

README.md里其實就有移植步驟,我這裡走個流程。
為了方便直接把lvgl-release-v6文件夾複製到你自己的工程目錄里,改名為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的結構,後續有機會細說。