最近發現這個開源的GUI特別有意思,網上的資料還比較少,在這里記錄一下我的整個開發過程
首先使用的IC是f103vet6
屏幕是淘寶的1.14寸LCD,分辨率135*240
第一步先去lvgl的github上面下載它的源碼還有例程源碼
我這里使用的版本是lvgl的7.6.0,剛剛上去看居然發現一個小時前更新了v7.6.1,啊這
lvgl源碼:https://github.com/lvgl/lvgl
lvgl演示例程源碼:https://github.com/lvgl/lv_examples

下載好了我們先放起來,等會移植的時候要用的上
第二步我們現在需要一個顯示LCD的例程,這里我直接用淘寶賣家提供的顯示代碼了
還挺多的啊,這里我就選中的的STM32F103ZET6_Software_SPI的了
因為我用的是vet6,這款的FLASH好像是相同大小的,直接在keil里面改芯片都省的移植了
那么我們現在有這些東西了,把第一個工程的名字改成stm32_test吧,現在這名字也太長了
我們打開stm32_test的工程先看一下,就是一個測試LCD功能的代碼,測試了一下GUI.c的畫點畫圓啥的
LCD的接線方法最頂上的注釋也給出來了,省的我們找LCD的IO口去一個個翻了,好評!
下面那個觸摸屏接線的注釋我們直接忽略吧,1.14寸的LCD不配擁有觸摸
編譯測試可以正常使用,這里就不貼測試圖了直接進入下一步
我們在stm32_test工程的里面新建兩個文件夾,LittleVGL和
LittleVGL用來放lvgl從github上面下載來的源碼吧,LittleVGL_APP用來放一下我們自己寫的GUI界面
現在這兩個文件夾是空的,下面來說說在里面放啥東西
我們先解壓一下剛剛在github下載的lvgl的源碼
我們得到了一個這個
點進來看看里面有啥東西
看不懂不管了,繼續下一步操作
那我們就把這個解壓出來的lvgl-master復制放在我們工程剛剛新建的LittleVGL里面
給它改一下名字吧,就叫lvgl簡單一點
放好了就從它里面拿出點東西來用,我們進入lvgl中找到lv_conf_template.h
喲,剛進來就看到你了,把它復制帶出去,把名字改成lv_conf.h,這里面代碼等下再說,就先放在和lvgl同級吧
我們在這個目錄下在新建一個文件夾吧,就叫lvgl_driver
這個lvgl_driver肚子里面空空的,我們在lvgl里面再復制點東西出來放進去
第一步先進去lvgl
再進去里面的examples里面
喲,這里居然還有一個arduino的代碼,無視他我們繼續進去porting
找到了我們需要的代碼
這里面說一下,我紅框框起來的兩個是lvgl的顯示代碼,下面那個lv_port_indev_template.c和.h是觸摸的代碼
因為我們這里比較卑微沒有觸摸,我就只復制了我框起來的兩個,中間那個fs啥的不知道,也沒有時間去看
帶走!!!
把這兩放在lvgl_driver里面吧,讓他們重新做.c和.h文件,重新做文件首先第一步把名字改了先
名字改好了
上面全部工作准備好了,我們開始干正事了,准備移植手術!!!!!!
再keil5工程里面把他們的頭文件先包含進來先
就是上面圖里面的三個路徑,我看lvgl源碼里面找頭文件好多都是通過這里去找的
keil工程里面也加入幾個文件夾吧,整理起來好看一點
那么我們現在也加入一下.c文件進來
LittleVGL_Driver就拉一個就行了
接下來LittleVGL拉的才多
需要把lvgl / src /路徑里面全部文件夾里面的.c文件導入進去
出了一個lv_GPU文件里面的不用,其他都導入進去
還挺多東西的,最后都點OK確認吧
這個LittleVGL_APP就不放東西了吧,這個是放我們自己寫的界面,現在也沒有東西放
別急着編譯,現在編譯肯定幾千個錯誤,我們先選型一個芯片再寫BUG
對了,這個C99 Mode的鈎一定要打上,lvgl用到了
好了,那么現在就編譯看看吧,不忍直視
才區區2000多個錯誤,看不起誰呢
好了,我們找到lv_conf.h來修改一些參數,就是我們從lvgl搬出來那個
下面直接說改那行不做太多解釋了
好了,下面沒啥東西需要修改了
下面我們修改一下lvgl顯示的代碼
我們走到141的函數disp_flush,一路下來錯誤還挺多的
這個代碼里面我們添加一個畫點函數,再我們的GUI.c里面有,看英文也能明白它缺少一個畫點的顯示
當然也可以把他們全部替換成畫矩形的代碼,但是下面那個lv_disp_flush_ready的那個代碼不要動它
再這代碼里還有一個問題,我們選擇一種緩存的方式,測試的話那就選最簡單的吧
把另外兩個注釋掉
我們再打開"lv_port_disp.h"里面修改一些東西
"lv_port_disp.h"里面聲明一下lv_port_disp_init函數
那么現在再編譯一次
居然還有30個錯誤,看這些錯誤都是同一個問題,我去看看怎么回事
嗷就是沒有定義u16,可以把u16換成uint16_t,不過為了省事這里直接添加一個sys.h
再次編譯一下,成功通過
不過還沒結束
我們這里要使用lvgl還需要給它提供一個1ms的心跳節拍
可以使用Systick或者定時器來提供
我看這里的工程樣式好像是正點原子的,那么我們直接從正點原子的定時器例程里面弄一個TIM過來
這里就不寫啥移植TIM過程了,直接拉過來就是用
再代碼中加入.c,在魔術棒里面加入它的頭文件路徑
還要在這里加入
躲在tim.c的TIM3中斷里面添加一個lv_tick_inc(1);這里中斷在主函數配置成了1ms等會在看看
現在我們先編譯一下
還要5個警告啊,我們不用管他了,隨便它警告吧繼續下一步
在主函數中添加一些代碼
首先加入頭文件
main中添加初始化
剛剛發現一個有意思的情況:
我在main並沒有配置TIM3為1ms,也沒有調用TIM的頭文件,難道其實不用心跳節拍也能用?
這個之后我研究研究,可能是我配置了沒有看到?
在下面的while循環里面加一個lvgl的句柄
我們在while循環之前就可以放入我們的界面了,先測試一個手寫的顯示按鍵吧
編譯通過寫入stm32里面試試
寫入的過程是比一般的例程時間久一些
我們看看屏幕顯示效果

我裂開了,屏幕白光太亮了,拍照不清晰,之后調整PWM調整背光我在重新拍一下
不知道小伙伴能不能看清中間有個藍色的BUTTON
好了過程就寫到這里,之后抽時間把代碼鏈接放出來
下一個隨筆也是接這篇lvgl的內容,主要是說明一下如何使用lvgl提供的demo例程
就到這里吧