引言
GUI Guider本質(zhì)上是一個方便嵌入式開發(fā)者基于LVGL開發(fā)GUI應(yīng)用的源碼生成器工具,其作用是幫助開發(fā)者生成LVGL的應(yīng)用源碼,GUI Guider最終生成的源碼將要被部署到具體的嵌入式硬件平臺上才能發(fā)揮作用。因此,包含了GUI Guider生成源碼的嵌入式工程的源碼,大體分成兩部分:
- 支撐LVGL源碼的基本MCU工程框架,其中包含MCU芯片的驅(qū)動程序,液晶屏顯示模塊的驅(qū)動程序,LVGL組件的源碼,以及對LVGL組件基于液晶屏顯示模塊的移植源碼
- LVGL應(yīng)用部分的源碼,這主要就是GUI Guider生成的源碼了。
本節(jié)將分別介紹如何獲取和使用這兩部分源碼,最終創(chuàng)建一個可以聯(lián)動GUI Guider軟件將LVGL應(yīng)用部署到MCU平臺上的工程。
創(chuàng)建LVGL基本MCU工程
獲取移植LVGL的源碼工程
當開發(fā)者準備開發(fā)GUI應(yīng)用時,可以從各種渠道獲取手頭上正在使用的開發(fā)板上的移植了LVGL
的源碼工程。通常微控制器芯片原廠會的SDK軟件庫中會提供這樣的樣例工程,當然,有時也會需要開發(fā)者對直接拿到的源碼工程進行微調(diào),比如根據(jù)手頭板子的實際電路,改改時鐘,調(diào)整引腳等等。靈動官方的MindSDK中,為PLUS-F5270
開發(fā)板創(chuàng)建了適配了LVGL
的源碼工程,軟件和硬件都兼容BIRD-F5
開發(fā)板,可以直接拿來用。
如果開發(fā)者實在沒找到適用于自己手頭上開發(fā)板上現(xiàn)成的移植好LVGL的工程,需要自行適配,大體的思路是:
- 適配顯示屏模塊驅(qū)動
- 將顯示屏模塊填充到LVGL的軟件框架中,完成對LVGL的適配
實際上,在lvgl-gui-guider-dev
項目中,還包含了一個使用SPI接口對接1.8寸小顯示屏模塊的工程lvgl_v8_basic_spi
,就是基于原本使用FSMC接口接顯示屏模塊的工程,換用SPI接口的顯示屏模塊驅(qū)動改出來的。
通過bootloader使用外擴qspiflash存儲大尺寸固件程序
在實際編譯包含LVGL的工程時,最終生成的固件文件可能會比較大,例如本例中使用的微控制器芯片MM32F5270
片內(nèi)的256KB Flash堪堪能用,再稍微增加一些頁面元素,F(xiàn)lash存儲空間就不夠用了。例如,在一個僅僅在屏幕上顯示“Hello World”的工程,在不開優(yōu)化的情況下,對Flash的占用就已經(jīng)達到了370KB,這已是不可能寫入到片內(nèi)Flash。
直接的解法,可以通過啟用編譯器優(yōu)化,壓縮代碼大小,如圖x所示。
圖x 調(diào)整LVGL工程的編譯選項
啟用-Oz
編譯選項后,可以將代碼大小壓縮至210KB左右。
但如果以后需要使用更多的組件,例如添加一張圖片等等,仍會碰到片內(nèi)Flash容量不夠的限制。為此,結(jié)合MM32F5270微控制器具有QSPI和XIP的特性,一個更有效的解法,是將程序放在外擴的spiflash存儲器上執(zhí)行。具體做法,是實現(xiàn)一個bootloader,引導(dǎo)程序到外擴的qspiflash存儲設(shè)備中并運行。例如,基于MM32F5270的合封的qspiflash存儲芯片的MM32F5280芯片,就額外擴展了2MB的容量,這對于一些小型的嵌入式GUI應(yīng)用已經(jīng)足夠用了。
lvgl-gui-guider-dev
項目中,包含了一個bootloader_qspi_qpi_mode
的工程,實現(xiàn)了微控制器芯片上電啟動后,先進入片內(nèi)Flash執(zhí)行的bootloader程序,包括初始化QSPI接口并配置qspiflash存儲芯片的工作模式,使用QPI模式(運行程序的速度快些,但不能使用默認的下載算法文件成功下載)或者是普通4線模式(可以在默認使用默認的下載算法文件正常下載,但運行程序的速度慢些)。
關(guān)于qspiflash存儲芯片的QPI模式,這里做一些補充說明。qspiflash存儲芯片每次上電啟動,默認進入1/2/4線模式,每次都需要主機發(fā)送特殊的QPI命令,才能激活qspiflash存儲芯片的QPI模式。當通過“解鎖”操作(在外擴spiflash存儲芯片上啟用4線模式)將外擴的qspiflash芯片配置為4線模式后,MCU可以通過普通的4線模式和QPI模式訪問qspiflash存儲芯片中的數(shù)據(jù),但通過普通4線模式訪問qspiflash芯片時,需要48個時鐘(8個時鐘送指令,24個時鐘送地址,8個時鐘空等待,8個時鐘送數(shù)據(jù))才能傳送4個字節(jié)的數(shù)據(jù),使用QPI模式訪問qspiflash存儲芯片時,僅需要18個時鐘(2個時鐘送指令,6個時鐘送地址,2個時鐘空等待,8個時鐘傳數(shù)據(jù))就能傳4個數(shù)據(jù)。
如果想讓存放在qspiflash存儲芯片中的程序運行得快一些,就需要在bootloader中啟用QPI模式,但使用Keil下載程序到qspiflash存芯片時需要確保停用QPI模式,僅能在普通4線模式下下載程序,這意味著在qspiflash存儲芯片復(fù)位后不能運行bootloader。
spiflash存儲芯片的4線模式是非易失的,但QPI模式的配置不是非易失的,需要每次在bootloader啟用qspiflash程序之前發(fā)送相應(yīng)的命令激活spiflash以啟用QPI模式。復(fù)位微控制器芯片后,spiflash芯片本身不復(fù)位,會繼續(xù)保持在QPI模式。因此,為了讓Keil的下載算法在bootloader之前接管對未啟用QPI模式的qspiflash存儲芯片的訪問權(quán),需要在整塊板子的上電復(fù)位時,讓微控制器芯片進入到內(nèi)部bootrom中的程序(按住boot0按鍵),此時,spiflash芯片上電復(fù)位到常規(guī)4線模式,因MCU被拐到內(nèi)部的bootrom中,未被bootloader中啟動QPI模式,此時,是可以通過Keil的下載算法向spiflash芯片下載程序的。
本例設(shè)計的bootloader,可以通過一個指定的按鍵(PA0),選擇啟動至普通4線模式或者QPI模式:
- 默認情況下,不按按鍵,啟動到QPI模式。不可以通過Keil下載程序到qspiflash芯片(下載失?。?。
- 按鍵線下,啟動到普通4線模式??梢酝ㄟ^Keil下載算法將程序下載到qspiflash存儲芯片。
關(guān)于下載算法和QPI模式的沖突,還可以通過調(diào)整下載算法的實現(xiàn)解決:在下載算法中執(zhí)行下載操作之前,先通過QSPI外設(shè)模塊暫時停用QPI模式,切換到普通4線模式(只有進入QSPI接口的“間接模式”才能發(fā)送寫數(shù)據(jù)的命令,“直接模式”是純粹的讀數(shù)模式),然后才能逐個數(shù)據(jù)包地向qspiflash擦除數(shù)據(jù)、寫數(shù)據(jù)。當寫完了全部可執(zhí)行程序文件的數(shù)據(jù)后,再配置QSPI外設(shè)為直接模式,恢復(fù)對使用地址映射的方式訪問qspiflash設(shè)備。最后,切換程序指針PC,跳轉(zhuǎn)到qspiflash的存儲空間執(zhí)行程序。
相對于bootloader工程,開發(fā)者編寫包含液晶驅(qū)動程序和LVGL組件的應(yīng)用工程中,就需要調(diào)整linker文件,將編譯生成的指令語句和對象實體,安置在qspiflash映射的地址空間中。
OK,無論如何,此時通過外擴qspiflash,解決了Flash存儲空間不夠的問題。
創(chuàng)建LVGL應(yīng)用源碼
在GUI Guider中創(chuàng)建新項目
GUI Guider可以將圖形開發(fā)界面中創(chuàng)建的UI素材,自動生成對應(yīng)的LVGL函數(shù)調(diào)用序列源碼,并存放成C語言文件,可被應(yīng)用工程直接編譯。
啟動GUI Guider軟件后,選擇“創(chuàng)建新項目”,選擇使用LVGL v8。如圖x所示。
圖x 在GUI Guider中為新建項目選擇LVGL v8
下一步,可以選擇GUI Guider已經(jīng)適配的開發(fā)板,這里能看到的都是NXP的板子,包括IMXRT、LPC、MCX系列微控制器的開發(fā)板。本例中使用的是清單之外的板子,可以用“Simulator”虛擬的一塊板子。如上圖x所示。
下一步,可以選擇一個應(yīng)用的模板,例如,可以選擇帶按鈕和計數(shù)器的“ButtonCounter”,或者一個儀表盤的樣子,這里包含了很多可以直接使用的樣例工程,供開發(fā)者選擇合適的模板,微調(diào)后用于自己的項目中。本例選擇使用一個空的工程模板“EmptyUI”,先搭建一個最簡單的工程框架。如上圖x所示。
下一步,可以配置工程的屬性。這里指定新項目的名稱為“gui”,這個名字將用于新項目新建源文件目錄的目錄名;然后配置新項目存放的路徑為應(yīng)用工程路徑下,以方便加入到應(yīng)用工程中;配置色彩模式為16位,這個是LVGL緩存數(shù)據(jù)的格式;配置屏幕尺寸,這個同在具體開發(fā)板上適配的屏幕尺寸有關(guān),對應(yīng)在GUI Guider項目中創(chuàng)建相同尺寸的畫板。如上圖x所示。
最后創(chuàng)建工程,即可在GUI Guider中看到新建項目的編輯界面。如圖x所示。
圖x GUI Guider新建項目的編輯界面
切記,要關(guān)閉“是否顯示鍵盤”選項,如果不需要這個功能,關(guān)掉它可以顯著節(jié)約大量Flash存儲占用。然后,點擊生成源碼的圖標,就可以生成當前編輯界面下顯示內(nèi)容對應(yīng)的LVGL代碼源文件了。如圖x所示。
圖x 在GUI Guider中生成LVGL源碼
將GUI Guider生成的源碼添加到MCU的源碼工程
GUI Guider生成的項目目錄位于MCU的源碼工程目錄下,其中生成的與GUI Guider編輯界面對應(yīng)的C語言源碼可以直接加入到MCU源碼工程中參與編譯。如圖x所示。
figure-gui-guider-source-files-1
圖x 在MCU工程目錄下包含GUI Guider生成的源碼
其中,generated
和custom
目錄下的源文件都可以被加入到Keil工程中,generated
目錄下存放的文件在GUI Guider中每次生成代碼更新的源文件,custom
目錄下是用戶自定義的、但與UI界面相關(guān)的代碼。將這些源文件加入到Keil工程中。如圖x所示。
在Keil工程中加入GUI Guider生成的源文件
不要忘記,還要添加這些源文件的引用路徑。如圖x所示。
圖x 在Keil工程中加入GUI Guider生成源文件的引用路徑
最后,試著調(diào)通Keil工程,清理掉編譯錯誤。
從編譯輸出的消息來看,當前這次編譯產(chǎn)生的代碼已經(jīng)為381732字節(jié)(Code + RO Data + RW Data),已經(jīng)遠遠超出了MM32F5270片內(nèi)Flash的256KB限制。此時,如果仍想使用片內(nèi)Flash存放程序,可以試著調(diào)整Keil工程的編譯選項。如前文所述,或者可使用本文中設(shè)計的Bootloader開發(fā)方式,調(diào)整Linker文件,將程序文件的內(nèi)容映射到片外擴展的qspiflash上。在本例后續(xù)展示的開發(fā)用例,為了避免編譯生成代碼大小的限制,均使用使用Bootloader開發(fā)方式。
將程序下載到開發(fā)板上,可以看到連接到開發(fā)板上的TFT顯示屏上已經(jīng)顯示了GUI Guider上繪制出的同款“Hello World”了。
-
微控制器
+關(guān)注
關(guān)注
48文章
7552瀏覽量
151417 -
嵌入式系統(tǒng)
+關(guān)注
關(guān)注
41文章
3593瀏覽量
129466 -
Flash存儲器
+關(guān)注
關(guān)注
3文章
104瀏覽量
25762 -
GUI
+關(guān)注
關(guān)注
3文章
660瀏覽量
39673 -
MCU芯片
+關(guān)注
關(guān)注
3文章
252瀏覽量
11452
發(fā)布評論請先 登錄
相關(guān)推薦
評論