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的結構,後續有機會細說。

 

 

Tags: