目錄
- 前言
- 一、基本配置
- 1、創建基本工程
- 2、配置RT-Thread Settings
- 二、驅動觸摸屏
- 1、打開軟體模擬I2C
- 2、配置I2C
- 3、添加觸摸軟體包
- 4、配置軟體包
- 5、觸摸驅動驗證
- 三、驅動顯示屏
- 1、使能LCD
- 2、使能TouchGFX
- 3、打開DMA2D和CRC使能
- 4、修改C++配置
- 5、修改螢屏尺寸
- 6、顯示驅動驗證
- 四、系結觸摸事件到TouchGFX
- 1、修改路徑
- 2、修改參考
- 3、修改后的代碼
- 4、觸摸及顯示驗證
- 五、優化顯示
- 1、當前顯示
- 2、修改顯示尺寸
- 3、顯示尺寸驗證
- 4、美化背景
- 5、最終效果
- 總結
前言
硬體平臺:RT-Thread ART-Pi STM32H750XBH6開發板 H750開發板
開發軟體:RT-Thread Studio
顯示屏:正點原子7寸RGB電容觸摸液晶屏模塊
相關組件:LCD、TouchGFX Library、I2C1、C++、ft5426,
參考博客:玩轉ART-Pi(三)
參考視頻:TouchGFX教程
官方資料:TouchGFX檔案
實驗目的:
- 為顯示單片機采集到的資料而無需連接電腦做鋪墊,
- 學習一下電容屏的圖形驅動TouchGFX,
- 整個花里胡哨的界面玩兒,

一、基本配置
?非小白直接跳過
1、創建基本工程
?請移步至《RT-Thread Studio驅動SD卡》教程,參考一、創建基本工程 ,建議重命名好區分,

2、配置RT-Thread Settings
?雙擊左側專案資源管理器下所建工程的“RT-Thread Settings”打開可視化配置,

二、驅動觸摸屏
1、打開軟體模擬I2C
?螢屏觸摸芯片是通過I2C驅動的,而RTT提供了軟體模擬I2C功能,因此需要將此配置打開,

?選中后右鍵點擊詳細配置查看具體配置,好像沒什么需要配置的,暫且先放著,

?到這I2C的配置還沒算完,要到硬體-Hardware Drivices Config-On-chip Peripheral下使能I2C并使能I2C1,具體的pin number是什么意思暫時沒想明白,
2、配置I2C

?至于為什么是I2C1而不是2或3呢?來看看原理圖就知道了,LCD顯示用的是并行24位RGB介面,而TSI_IIC就是觸摸的通信介面,用的是I2C1,

?題外話:按照原理圖里的提示,之后可以使用RTT官方推出的SPI螢屏跑柿餅UI實作雙屏,(之后有空再研究研究)

3、添加觸摸軟體包
?打開了I2C后還得添加對應的設備驅動才能正常使用設備,正點原子7寸電容屏用的是FT5246觸摸芯片,因此得把對應的軟體包加上,

?通過軟體包中心添加新的軟體包,

?搜索并點擊添加軟體包,

4、配置軟體包
?查看添加的軟體包,選中后右鍵打開詳細配置,

?把samples使能就不需要我們再去做其他配置了,觸摸屏直接能用,

5、觸摸驅動驗證
?保存配置后編譯工程并下載,使用Xshell查看串口資訊,能看到當點擊螢屏時串口會列印出觸摸點的絕對位置,

三、驅動顯示屏
1、使能LCD
?要使用LCD先要打開硬體的支持,在硬體的片上外圍設備里使能LCD,

?在使能LCD時發現SDRAM也被使能了,這是因為MCU想要快速地將影像顯示出來需要先將資料存進RAM中,

2、使能TouchGFX
?如標題所述,既然要用TouchGFX驅動顯示屏,那當然得打開庫的使能了,

?直接保存配置編譯發現有報錯,看到最近的一個錯誤顯示“DMA2D”undeclared,

3、打開DMA2D和CRC使能
?恰巧之前在參考別人博客(前言已貼出地址)的時候看到有看到CRC和DMA2D的使能,估計就是這里需要手動去打開了,

?打開了配置之后保存重新編譯,還看到有報錯,

4、修改C++配置
?這錯報的有點迷,之前有去RTT的社區查過,沒得出什么有用的資訊,后來才發現是需要對C++進行配置,在配置程序中好像沒有去打開C++但實際上卻打開了,那應該是在添加TouchGFX Library時自動添加上的,畢竟TouchGFX底層是用C++寫的,

?為了解決這個bug,先確定當前選中的工程,然后點擊左上角的“扳手”圖示(編譯右邊那個),


?必須確保先選中了當前工程,打開到如下路徑,

?把1、2、4的復選框勾上,點擊應用關閉,

5、修改螢屏尺寸
?重新編譯下載工程,查看效果,螢屏是驅動起來了,但是顯示不正常,

?打開lcd_port.h檔案,修改螢屏的尺寸,我用的螢屏尺寸是1024*600的,

6、顯示驅動驗證
?下面能看到螢屏已經能顯示出了影像,但是點擊滑動控制元件并無回應,

四、系結觸摸事件到TouchGFX
1、修改路徑
?首先進入如下目錄:libraries - touchgfx_lib - TouchGFX - target - STM32TouchController.cpp,在該檔案下可以實作對I2C1的初始化和觸摸位置資料的傳入,
之前packages - ft5246 - example_ft5246.c目錄下對觸摸屏的初始化可以去掉了,可以直接在STM32TouchController.cpp檔案內完成初始化,而最快的方法就是直接改軟體包的samples使能了,

2、修改參考
?參考example_ft5246.c對I2C1的初始化及螢屏觸摸點位置讀取的代碼,
- 初始化
struct rt_touch_config cfg;
cfg.dev_name = "i2c1";
rt_hw_ft5426_init("touch", &cfg);
touch = rt_device_find("touch");
rt_device_open(touch, RT_DEVICE_FLAG_RDONLY);
read_data = (struct rt_touch_data *)rt_calloc(1, sizeof(struct rt_touch_data));
- 讀取觸摸點
rt_device_read(touch, 0, read_data, 1);
if (read_data->event == RT_TOUCH_EVENT_DOWN)
{
rt_kprintf("down x: %03d y: %03d", read_data->x_coordinate, read_data->y_coordinate);
rt_kprintf(" t: %d\n", read_data->timestamp);
}
if (read_data->event == RT_TOUCH_EVENT_MOVE)
{
rt_kprintf("move x: %03d y: %03d", read_data->x_coordinate, read_data->y_coordinate);
rt_kprintf(" t: %d\n", read_data->timestamp);
}
if (read_data->event == RT_TOUCH_EVENT_UP)
{
rt_kprintf("up x: %03d y: %03d", read_data->x_coordinate, read_data->y_coordinate);
rt_kprintf(" t: %d\n\n", read_data->timestamp);
}
?因為STM32TouchController.cpp是C++檔案,C++對C的呼叫需要使用extern “C”對C語言的函式進行修飾,
extern "C"{
//C語言函式
}
?當使用C++編譯工程時會有一個特殊的宏“__cplusplus”被定義,因此可以結合起來使用,
#ifdef __cplusplus
extern "C"{
#endif
//C語言函式
#ifdef __cplusplus
}
#endif
3、修改后的代碼
完整代碼如下:
/**
******************************************************************************
* File Name : STM32TouchController.cpp
******************************************************************************
* @attention
*
* <h2><center>© Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
* SLA0044, the "License"; You may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* www.st.com/SLA0044
*
******************************************************************************
*/
/* USER CODE BEGIN STM32TouchController */
#include <STM32TouchController.hpp>
#include <rtthread.h>
rt_device_t touch;
struct rt_touch_data *read_data;
#ifdef __cplusplus
extern "C"{
#endif
#include "ft5426.h"
#include "touch.h"
#ifdef __cplusplus
}
#endif
void STM32TouchController::init()
{
/**
* Initialize touch controller and driver
*
*/
struct rt_touch_config cfg;
cfg.dev_name = "i2c1";
rt_hw_ft5426_init("touch", &cfg);
touch = rt_device_find("touch");
rt_device_open(touch, RT_DEVICE_FLAG_RDONLY);
read_data = (struct rt_touch_data *)rt_calloc(1, sizeof(struct rt_touch_data));
}
bool STM32TouchController::sampleTouch(int32_t& x, int32_t& y)
{
/**
* By default sampleTouch returns false,
* return true if a touch has been detected, otherwise false.
*
* Coordinates are passed to the caller by reference by x and y.
*
* This function is called by the TouchGFX framework.
* By default sampleTouch is called every tick, this can be adjusted by HAL::setTouchSampleRate(int8_t);
*
*/
rt_device_read(touch, 0, read_data, 1);
if ((read_data->event == RT_TOUCH_EVENT_DOWN)|| (read_data->event == RT_TOUCH_EVENT_MOVE))
{
rt_kprintf("down x: %03d y: %03d", read_data->x_coordinate, read_data->y_coordinate);
rt_kprintf(" t: %d\n", read_data->timestamp);
//x和y為傳回給touchGFX的位置,
y = read_data->x_coordinate;
x = read_data->y_coordinate;
return true;
}
else
{
return false;
}
}
/* USER CODE END STM32TouchController */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
4、觸摸及顯示驗證
?當滑動右側控制元件時,左側的串列會進行縮放,

五、優化顯示
1、當前顯示
?一億像素都拍不清🤣,但是很明顯顯示不全,

2、修改顯示尺寸
?首先使用TouchGFX Designer打開設計的界面,工程目錄如下:

?使用TouchGFX Designer打開后點擊Run Simulator運行看結果,顯然顯示屏黑色區域外的位置是顯示不出來的,

?使用文本檔案打開“ApplicationTemplate.touchgfx”,修改對應的長寬,

3、顯示尺寸驗證
?修改完成后在TouchGFX Designe打開重新編譯生成工程,然后在RT-Thread Studio也重新編譯下載,控制元件已經能完全顯示了,

4、美化背景
?黑不溜的背景圖受不了,從網路上先搞一張1024*600的圖片下來,然后在TouchGFX Designe點擊右上角的加號,打開后點擊Image添加背景圖,

?選中剛添加的image控制元件,在右側點擊該選項添加外部圖片,只支持PNG,

?新添加的圖片會將之前的所有圖層都擋住,選中左側新建的圖片后點擊圖層按鈕將此圖層放到最底,

?點擊模擬器運行一下,nice,

5、最終效果
?這樣看起來舒服多了,拍照技術有待提高🤣,

總結
?研究了一個星期總算搞出點小東西了,軟體包里的readme對于初學者感徑訓是有點籠統,后續研究一下開發板資料顯示到螢屏和螢屏控制元件控制開發板硬體,打算整個實用除錯工具耍耍😎,
?附上代碼下載鏈接,為什么不傳到github?個人覺得教程描述已經很詳細了,有疑問歡迎留言拒絕白嫖,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/231079.html
標籤:其他
