開源LittleVGL移植到stm32f103vet6中在st7789的1.14寸屏幕上顯示例程開發過程,無觸摸


最近發現這個開源的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例程

 

就到這里吧

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM