目錄
一:TFT-LCD屏觸摸
二:STM32CubeMX配置
三:FT5206觸摸芯片驅(qū)動代碼移植
四:LVGL 移植
4.1 源碼下載
4.2?代碼移植
?4.3 添加源碼至工程
4.4?指定頭文件路徑
4.5 設(shè)置編譯參數(shù)
?4.6?修改LVGL源文件
??4.7 修改顯示驅(qū)動接口
???4.8?修改輸入設(shè)備驅(qū)動接口
?五:下載驗(yàn)證
?六:工程代碼
·?廢話不多說,有關(guān)電容屏的觸摸原理,此文不作解釋,自己去看
· 確定自己的觸摸屏的驅(qū)動IC是什么型號的,找供應(yīng)商要驅(qū)動源代碼
·?我使用的是正點(diǎn)原子ALIENTEK 7’ TFTLCD 電容觸摸屏,驅(qū)動IC為FT5206
一:TFT-LCD屏觸摸
·?廢話不多說,有關(guān)電容屏的觸摸原理,此文不作解釋,自己去看
· 確定自己的觸摸屏的驅(qū)動IC是什么型號的,找供應(yīng)商要驅(qū)動源代碼
·?我使用的是正點(diǎn)原子ALIENTEK 7’ TFTLCD 電容觸摸屏,驅(qū)動IC為FT5206
原理圖
·?從圖中可以看出, T_MOSI、T_MISO、T_SCK、T_CS 和 T_PEN 分別連接在
STM32F1 的:PF9、PB2、PB1、PF11 和 PF10 上,電容式觸摸屏沒有用到
T_MISO,而是用到四根線,分別是: T_PEN(CT_INT)、 T_CS(CT_RST)、
T_CLK(CT_SCL) 和T_MOSI(CT_SDA)。
·?其中:CT_INT、CT_RST、CT_SCL 和 CT_SDA 分別是 FT5206的:中斷輸出
信號、復(fù)位信號,IIC 的 SCL 和 SDA 信號(PS:為了節(jié)省CPU開支,可以
使用外部中斷的方式判斷屏幕是否被觸摸,具體設(shè)置方式,此文不作介紹)
二:STM32CubeMX配置
· 打開我們上節(jié)配置的CubeMx工程
· 軟件模擬IIC
· 配置以下4個(gè)引腳
?· 檢查引腳無誤后,生成代碼,編譯后無問題,開始移植觸摸芯片代碼
三:FT5206觸摸芯片驅(qū)動代碼移植
· 我使用的正點(diǎn)原子的屏幕,所以我直接移植正點(diǎn)原子編寫的FT5206驅(qū)動代碼
· 如果你們用的是其它廠商的代碼,直接問他們要觸摸芯片的驅(qū)動代碼就行了
· 以下移植步驟局限于正點(diǎn)原子的屏幕
· 將此文件夾,復(fù)制至自己的工程文件下
· 添加 .c和 .h文件
. 我的觸摸芯片是FT5206,所以加入這幾個(gè)源文件即可
. 把所有.c 文件中的printf函數(shù)屏蔽掉,因?yàn)槲覀冞@里是沒有開啟串口,會導(dǎo)致程序卡死!!!!!!!!!!
· 把正點(diǎn)原子觸摸屏實(shí)驗(yàn)下的sys文件拷貝至自己的工程文件,并添加.c 和 .h文件
· 打開lcd.h 頭文件,屏蔽#include "stm32f103xe.h",添加sys.h
· 打開sys.h 頭文件,添加stm32f103xe.h頭文件
?· 打開ctiic.c,屏蔽CT_IIC_Init()函數(shù)里的內(nèi)容,并屏蔽delay.h,添加tim.h
· 打開ft5206.c,增加tim.h,屏蔽usart.h,delay.h
· 屏蔽FT5206_Init(void)函數(shù)以下內(nèi)容
· 打開touch.c文件,把電阻屏用到的相關(guān)接口屏蔽掉
?
?
?
·?TP_Init(void)函數(shù),只留下以下部分,其余屏蔽掉
?·?打開main.c,添加touch.h頭文件
?· 在main函數(shù)添加以下三個(gè)函數(shù)的全部內(nèi)容
· 移植完成后、編譯、燒錄
· 觸摸效果展示
四:LVGL 移植
4.1 源碼下載
- Github倉庫:http:/github.com/lvgl/lvgl
4.2?代碼移植
· 在自己的工程文件下新建兩個(gè)文件夾 GUI 和 GUI_APP
?
在GUI目錄下新建兩個(gè)文件夾 lvgl 和lvgl_port
· 將LVGL源碼目錄下的src文件夾以及 lvgl.h 頭文件拷貝至工程文件GUI/lvgl目錄下
· 把lvgl源碼根目錄下的lv_conf_template.h 拷貝至工程文件下GUI根目錄下,
并且去掉_template
?4.3 添加源碼至工程
在MDK里面新建以下這兩個(gè)文件
? ? ? ??
?在GUI/lvgl組中添加以下文件夾中所有的.c文件:
GUI/lvgl/src/lv_core
GUI/lvgl/src/lv_draw
GUI/lvgl/src/lv_extra(除了lib外,除非你用到了相關(guān)功能)
GUI/lvgl/src/lv_font
GUI/lvgl/src/lv_hal
GUI/lvgl/src/lv_misc
GUI/lvgl/src/lv_themes
GUI/lvgl/src/lv_widgets
//注意不要添加 GUI/lvgl/src/lv_gpu 中的文件,除非你用到了相關(guān)功能
在GUI/lvgl_port組中添加以下.c文件:
GUI/lvgl_port/lv_port_disp.c
GUI/lvgl_port/lv_port_indev.c
//注意不要添加 GUI/lvgl_port/lv_port_fs.c 中的文件,除非你用到了相關(guān)功能
4.4?指定頭文件路徑
LVGL 的源碼已經(jīng)添加到開發(fā)環(huán)境的組文件夾下面,編譯的時(shí)候需要為這些源文件指定頭文件的路徑,不然編譯會報(bào)錯(cuò)。只需要將?GUI
、GUI/lvgl
、GUI/lvgl_port
?的路徑在開發(fā)環(huán)境里面指定即可。
4.5 設(shè)置編譯參數(shù)
LVGL要求 C99 或更新的編譯器,否則編譯是會報(bào)錯(cuò)的。
?4.6?修改LVGL源文件
· 打開lv_conf.h 頭文件,將第15行改為1
· 第27行是顏色設(shè)置,如果是單色屏的話就改為1
?· 內(nèi)存設(shè)置
給LVGL分配動態(tài)內(nèi)存RAM的大小,至少需要2k,資源允許的情況下可以稍微設(shè)大些,這個(gè)設(shè)置過小的話,在跑一些稍微復(fù)雜的demo時(shí)界面就會刷不出來。
?· 底層設(shè)置
· 第88行,如果LV_TICK_CUSTOM == 0,可以用lv_tick_inc()提供時(shí)鐘節(jié)拍,也就是將
lv_tick_inc(1)放在我們上節(jié)開啟的定時(shí)器6中斷里調(diào)用即可
· 如果LV_TICK_CUSTOM == 1,就無須在應(yīng)用程序中主動調(diào)用 lv_tick_inc(x) 函數(shù),而是需要定義一個(gè) 獲取當(dāng)前系統(tǒng)已運(yùn)行時(shí)間的函數(shù)(例如HAL_GetTick())
· 第90行就是提供時(shí)鐘節(jié)拍函數(shù)所在的頭文件
· 第91行就是提供時(shí)鐘節(jié)拍的函數(shù)
· 我這里直接使用sys_tick為LVGL提供時(shí)鐘節(jié)拍
· 第96行用來調(diào)節(jié)界面縮放比例的,此值越大,控件分布的就越散,控件自身的間隔也會
變大。可根據(jù)實(shí)際情況進(jìn)行更改,例如128x128分辨率1.44英寸的屏幕,那么 DPI = ((√128*128) / 1.44) ≈ 89
??4.7 修改顯示驅(qū)動接口
? ? ? ? 打開lv_port_disp.c
· 將第7行修為1
· 第12行去掉_template
· 第19 20行定義屏幕像素高度
· 第54行,可以將屏幕的顯示驅(qū)動初始化接口放進(jìn)disp_init()函數(shù),該函數(shù)在下方定義
我這里是沒有放進(jìn)去,直接在main函數(shù)哪里初始化了,看個(gè)人需求,我比較懶!
· 顯示緩沖區(qū)初始化有三種方式,這里使用的是方式1,方式1消耗的硬件資源最小,但運(yùn)行效果也是最差的,三種方式如下
· 第一種只創(chuàng)建一個(gè)緩存區(qū),長度是橫軸像素長度的 10 倍
· 第二種創(chuàng)建兩個(gè)緩存區(qū),長度都是橫軸的 10 倍,可以結(jié)合 DMA 加快寫入速度
· 第三種則是創(chuàng)建兩個(gè),大小是橫軸乘以縱軸,相當(dāng)于整個(gè)屏幕大小
· 第108、109行修改為上方屏幕分辨率的宏定義
·?修改?disp_flush()
?函數(shù),將自己顯示屏對應(yīng)的填充顏色塊函數(shù)放到這里,這個(gè)函數(shù)是用來刷新顯示區(qū)域的,速度越快越好
紅色標(biāo)注部分的函數(shù)也就是以單個(gè)像素點(diǎn)填充屏幕的函數(shù)
???4.8?修改輸入設(shè)備驅(qū)動接口
? ? ? ? 打開lv_port_disp.c
· 第7行修改為1
· 第12行去掉_template
· 第14行增加touch.h頭文件
· 找到lv_port_indev_init(void)函數(shù)
· 將屏幕觸摸驅(qū)動接口初始化放進(jìn)touchpad_init();
· touchpad_init();在下方有定義,我這里就不放了,因?yàn)樵趍ain函數(shù)已經(jīng)初始化了,我比較懶
·? 注冊一個(gè)輸入設(shè)備,輸入設(shè)備可以是觸摸屏、鼠標(biāo)、鍵盤、編碼器、按鍵,這里我們只使用觸摸屏,第99行往后的代碼全部注釋。
?· 修改touchpad_read函數(shù)
· 以下代碼局限于正點(diǎn)原子的板子,具體寫法參考你所用的板子
static uint16_t last_x = 0;
static uint16_t last_y = 0;
if(tp_dev.sta&TP_PRES_DOWN)//觸摸按下了
{
last_x = tp_dev.x[0];
last_y = tp_dev.y[0];
data->point.x = last_x;
data->point.y = last_y;
data->state = LV_INDEV_STATE_PR;
}
else
{//觸摸松開了
data->point.x = last_x;
data->point.y = last_y;
data->state = LV_INDEV_STATE_REL;
}
?· 打開lv_port_indev.h
? ?使能文件及聲明函數(shù)
??· 打開main.c
#include "lv_port_disp.h"
#include "lv_port_indev.h"
#include "lvgl.h"
lv_port_disp_init();
lv_port_indev_init();
lvgl_first_demo_start();
tp_dev.scan(0);
lv_timer_handler();
· 第272行是屏幕觸摸掃描函數(shù)
?五:下載驗(yàn)證
video(11)文章來源:http://www.zghlxwxcb.cn/news/detail-776157.html
?六:工程代碼
鏈接:https://pan.baidu.com/s/1HjQSt3Lb4xQe9VRjZbPcSQ?
提取碼:h1xu文章來源地址http://www.zghlxwxcb.cn/news/detail-776157.html
到了這里,關(guān)于LVGL學(xué)習(xí)筆記(二):從0到1移植LVGL8.1到STM32平臺上(完結(jié)篇)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!