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

使用GUI Guider工具開(kāi)發(fā)嵌入式GUI應(yīng)用(3)

圖形界面開(kāi)發(fā)工具GUI Guider的使用教程

基于ARM-Linux的嵌入式系統(tǒng)GUI開(kāi)發(fā)研究
基于Linux的嵌入式GUI設(shè)計(jì)研究
嵌入式圖形系統(tǒng)μc/GUI的移植和開(kāi)發(fā)

Linux GUI嵌入式開(kāi)發(fā)有什么新的研究方向

免費(fèi)的GUI Guider又出新版本!看看它為嵌入式圖形開(kāi)發(fā),帶來(lái)哪些新玩法~
GUI-Guider生成工程移植MCU
GUI Guider v1.5.0正式發(fā)布!它為嵌入式圖形開(kāi)發(fā)又帶來(lái)哪些新功能,一起來(lái)探索吧~
GUI Guider v1.6.0正式發(fā)布:更多嵌入式HMI開(kāi)發(fā)新功能,等你來(lái)探索!
免費(fèi)又簡(jiǎn)單!新版本GUI Guider發(fā)布,速來(lái)體驗(yàn)不一樣的嵌入式HMI開(kāi)發(fā)

『嵌入式GUI特訓(xùn)營(yíng)』開(kāi)營(yíng)啦!是學(xué)霸就有獎(jiǎng)拿,快來(lái)挑戰(zhàn)一下!
GUI Guider新版本發(fā)布,嵌入式GUI開(kāi)發(fā)體驗(yàn)升級(jí)

評(píng)論