使用RTThread和TouchGFX實現DIY數字儀表(一)——使用STM32CUBMX5.6移植touchGFX4.13

目錄:

1.使用RTThread和TouchGFX實現DIY數字儀表(一)——使用STM32CUBMX5.6移植touchGFX4.13
2.使用RTThread和TouchGFX實現DIY數字儀表(二)——把TouchGFX移植到RTThread系統
3.使用RTThread和TouchGFX實現DIY數字儀表(三)——獲取溫溼度傳感器數據
4.使用RTThread和TouchGFX實現DIY數字儀表(四)——同步網絡時間
5.使用RTThread和TouchGFX實現DIY數字儀表(五)——同步天氣信息
6.使用RTThread和TouchGFX實現DIY數字儀表(六)——鏈接阿里雲物聯網平臺
7.使用RTThread和TouchGFX實現DIY數字儀表(七)——使用MQTT.fx模擬手機設備進行M2M設備間通信
8.使用RTThread和TouchGFX實現DIY數字儀表(八)——開發微信小程序
9.使用RTThread和TouchGFX實現DIY數字儀表(九)——TouchGFX控件使用教程

實驗平臺:

硬件: 野火挑戰者STM32F767 V1開發版
軟件: TouchGFXDesigner v4.13和 STM32CubeMX v5.6.0,開發環境MDK v5.29

實驗前準備工作:

1.準備一套 野火挑戰者STM32F767 開發版或其他核心板
2.下載 TouchGFXDesigner v4.13
壓縮包下載完後,解壓如下:
在這裏插入圖片描述
Projects目錄下有STM32H7B3I-DK的工程,可以用來參考。touchGFX Designer的PC端安裝包在Utilities目錄下,找到後安裝。
3.下載 STM32CubeMX v5.6.0
安裝完STM32CubeMX v5.6.0版本後,還需要安裝X_CUBE_TOUCHGFX軟件包,安裝路徑如下:
在這裏插入圖片描述
4.下載 MDK v5.27以上版本

下載:

代碼持續更新中:github代碼下載地址https://gitee.com/Aladdin-Wang/hellotouchGFX.git

聯繫作者:

關注公衆號,加入技術交流羣共同學習
在這裏插入圖片描述

通過STM32CubeMX從零驅動STM32F767,並創建一個TouchGFX工程:

步驟

![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20191213084029191.png

組件

在這裏插入圖片描述
在這裏插入圖片描述
1.使能CRC校驗,ST使用TouchGFX必須使能CRC
2.配置RCC時鐘
像素時鐘大小:866 * 525 * 60/1024/1024=26M,像素時鐘最大值爲26M,防止花屏,設置爲25M。
在這裏插入圖片描述
3.配置FMC(SDRAM)
在這裏插入圖片描述
在這裏插入圖片描述
4.配置DMA2D,打開DMA2D中斷
在這裏插入圖片描述
5.配置LTDC,打開LTDC中斷
在這裏插入圖片描述
在這裏插入圖片描述
更改LTDC的複用IO口,使符合野火的開發板
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20190723095546649.png
6.配置其餘GPIO口
在這裏插入圖片描述
7.配置freeRTOS
在這裏插入圖片描述
在這裏插入圖片描述
8.配置QSPI
在這裏插入圖片描述
9.配置touchgfx
打開touchgfx軟件包:
在這裏插入圖片描述
配置touchgfx:
在這裏插入圖片描述
10.配置串口,用於調試
在這裏插入圖片描述
10.生成工程
在這裏插入圖片描述
11.執行TouchGFX Designer
生成工程後,打卡src文件夾,打開ApplicationTemplate.touchgfx.part,即可開始配置:
官方說明如下:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
我做的DEMO如下:
1.添加屏幕1
在這裏插入圖片描述
2.添加屏幕2
在這裏插入圖片描述
在這裏插入圖片描述
3.添加屏幕1按鍵,
在工程目錄的…\Src\assets\images下添加兩張按鍵圖片,矢量圖可以到阿里巴巴矢量圖標庫自行下載,下載地址https://www.iconfont.cn
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
4.添加屏幕2按鍵
同樣方法添加屏幕2的按鍵,使按下按鍵切換到屏幕1
5.點擊Generate Code生成代碼
生成代碼後,再打開src文件夾,會多出”xxxx.touchgfx“的文件,以後可以直接打開這個文件配置。
在這裏插入圖片描述

更改代碼,添加添加SDRAM的配置代碼

SDRAM的初始化程序需要移植以前的工程代碼,到main.c裏。手動添加的代碼需要放在/* USER CODE BEGIN 0 /和/ USER CODE END 0 */之間,防止重新生成工程被覆蓋。
在這裏插入圖片描述
在這裏插入圖片描述
把MX_SDRAM_InitEx();初始化函數放在static void MX_FMC_Init(void)裏:
在這裏插入圖片描述

更改代碼,添加觸摸驅動

新建Drivers\Touch_Driver文件夾,從野火源代碼《21-電容觸摸屏—觸摸畫板》裏複製touch觸摸驅動文件到這個文件夾下:
在這裏插入圖片描述
添加到工程裏:
在這裏插入圖片描述
更改代碼:
使用軟件I2C
在這裏插入圖片描述
在gt9xx.c裏添加freertos頭文件:
在這裏插入圖片描述
添加中斷處理函數:
在這裏插入圖片描述
屏蔽部分代碼:
在這裏插入圖片描述
在這裏插入圖片描述
更改部分代碼:
在這裏插入圖片描述
在STM32TouchController.cpp裏添加觸摸代碼
在這裏插入圖片描述
在這裏插入圖片描述

更改代碼,添加QSPI燒寫算法,將圖片文字等數據放到W25Q128

1.添加QSPI下載算法文件
下載算法的模版在keil安裝目錄\ARM\Flash下的_Template文件夾,把此文件夾複製出來,進行修改。也可以自行修改此工程名。
在這裏插入圖片描述
打開此工程,選擇自己的芯片類型:
在這裏插入圖片描述
添加W25QXX的驅動代碼:
去正點原子的論壇下載STM32F767的寄存器工程《實驗28 QSPI實驗》拷貝出HARDWARE文件夾下的QSPI和W25QXX驅動,和SYSTEM文件夾。
在這裏插入圖片描述
對工程進行相應的修改:
我根據網上的例程,修改後的工程鏈接如下,可以看代碼自行理解。https://download.csdn.net/download/sinat_31039061/12249290
注意:W25Q256需要開啓4字節地址,W25Q256以下容量的是3字節地址,我在工程裏已經做了適配,對於不同的容量只需要更改FlashDev.c裏邊的大小配置即可。
編譯後將STM32F767_W25QXX.FLM拷貝到keil安裝目錄\ARM\Flash下
2.工程添加STM32F767_W25QXX.FLM,關閉Verify,增加RAM的大小
在這裏插入圖片描述
3.更改分散加載文件
通過下面Edit按鈕打開KEIL自己生成的sct文件,將該文件複製下來,並重命名爲flash.sct,然後添加以下代碼,並保存
在這裏插入圖片描述
在這裏插入圖片描述
編譯生成的map文件:
在這裏插入圖片描述

更改代碼,添加qspi flash驅動

還是拷貝正點原子的qspi HAL庫驅動,只是要將QSPI 配置爲memory-mapped mode,這樣我們纔可以像訪問內存一樣訪問QSPI FLASH空間。
在這裏插入圖片描述

void W25QXX_MemoryMappedMode(void)
{
  QSPI_CommandTypeDef s_command;
  QSPI_MemoryMappedTypeDef s_mem_mapped_cfg;
 
  /* Configure the command for the read instruction */
  s_command.InstructionMode = QSPI_INSTRUCTION_4_LINES;
  s_command.Instruction = W25X_FastReadData;
  s_command.AddressMode = QSPI_ADDRESS_4_LINES;
  s_command.AddressSize = QSPI_ADDRESS_24_BITS;
  s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  s_command.DataMode = QSPI_DATA_4_LINES;
  s_command.DummyCycles = 8;
  s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
  s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
  s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
 
  /* Configure the memory mapped mode */
  s_mem_mapped_cfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;
  s_mem_mapped_cfg.TimeOutPeriod = 0; //1;
 
  if (HAL_QSPI_MemoryMapped(&hqspi, &s_command, &s_mem_mapped_cfg) != HAL_OK)
  {
    Error_Handler();
  }
}

編譯運行:

代碼地址:hellotouchGFX/ 3_STM32F767_RTThread_TouchGFX/1_freertos_TouchGFX_transplant
在這裏插入圖片描述

移植touchgfx的demo

touchgfx的應用和底層驅動是分開的,如果上一步移植成功了,可以跑跑touchgfx的demo例程。
1.導入touchgfx的GUI
在這裏插入圖片描述
2.選擇一個demo 導入。
在這裏插入圖片描述
3.生成代碼
在這裏插入圖片描述
4.編譯下載看效果
代碼地址:hellotouchGFX/ 3_STM32F767_RTThread_TouchGFX/2_freertos_Start_game
在這裏插入圖片描述

一些經驗:

0. touchGFX4.13版本介紹
TouchGFX 4.13 版本是繼 TouchGFX 4.12 之後的又一重要版本。4.13版具備了將動畫推到60FPS的功能,還增加了可緩存容器、不完全幀緩衝區以及新的L8壓縮格式等性能,這表明了 ToughGFX 不斷追求優化性能和持續迭代的匠心。4.13版本還解決了另一個問題:嵌入式系統開發人員的用戶界面可訪問性。通過將TouchGFX Generator集成到 STM32CubeMX 中,經驗較少的工程師在使用 TouchGFX 4.13 時,可以通過 STM32CubeMX 這個廣爲流行的 ST 實用軟件程序快速啓動項目。這樣做的目的在於降低開發者入門門檻,讓專業人士和愛好者都能受益於這個交互式的高效解決方案。
TouchGFX 4.13 還附帶了大量的錯誤修復和優化。在這個版本里,TouchGFX 4.13 Engine 得到重大更新引擎:優化的紋理映射。當處理具有固化內存或功耗限制的智能手錶或嵌入式系統時,新的紋理映射功能可顯著提升性能,達到 60 FPS。例如,當指南針顯示有移動時,系統會調整操作以更快地渲染幀。開發者可以通過TouchGFX Designer 中的紋理映射小裝置來實現,並減少60%的渲染時間。與拍攝幀快照並從緩存中檢索幀的可緩存容器不同,新的紋理映射功能更適合較大的移動場景,同時仍優化性能,在某些情況下啓用 30 FPS 甚至 60 FPS。
官方資料下載:
舊版本快速開發指南:https://download.csdn.net/download/sinat_31039061/12236944

1. 使用Visual Stdudio開發界面
touchgfx的代碼與系統的耦合度不是很高,MDK或者IAR的編譯和代碼提示也過於不人性化,建議使用touchGFX Designer配合Visual Stdudio來開發界面,與硬件解耦。界面調試完,再打開MDK,燒到板子上驗證,加速開發,工具用的6,可以事半功倍。前提是使用Visual Stdudio不能調用HAL庫的代碼,要不然VS會報錯。代碼中可以使用宏來規避,或者通過中間件來解耦合。
例如通過宏:

#ifdef SIMULATOR
/*使用VS仿真的代碼*/
#else
/*使用HAL庫的代碼*/
#endif

在這裏插入圖片描述
2. C語言和C++如何互相調用:
c方式編譯和c++方式編譯,其差異就在於符號表標識符。同一個函數名,在c方式編譯的其函數名跟編譯前的函數一致,c++方式編譯的則是以函數名結合參數作爲編譯後的函數名。cpp編譯器是兼容c語言的編譯方式的,所以在編譯cpp文件的時候,調用到.c文件的函數的地方時,需要用extern “C”指定用c語言的方式去編譯它,extern “C”是c++方式編譯才認識的關鍵字,在c++編譯的方式會定義__cplusplus宏,c語言編譯器沒有__cplusplus宏和extern “C”關鍵字。
C++語言調用C:
在編譯cpp文件的時候,調用到.c文件的函數的地方時,需要用extern “C”指定用c語言的方式去編譯它

extern "C"
{
	uint32_t LCD_GetXSize();
	uint32_t LCD_GetYSize();
}

C的頭文件要使用宏定義包含函數接口。

#ifdef __cplusplus
 extern "C" {
#endif
.
.
.
#ifdef __cplusplus
}
#endif

C語言調用C++文件中的函數:
對於C++文件中的普通函數,可以直接用extern “C” 對函數進行修飾,對於c++的重載函數或成員函數,需要進行二次封裝後,再使用extern "C"對函數修飾,函數內部的代碼依然是使用c++的編譯器編譯。
例如在xx.cpp中對函數進行聲明,在xx.c中進行調用:
xx.cpp

extern "C" void touchgfx_init();
extern "C" void touchgfx_taskEntry();
void touchgfx_init()
{

}
void touchgfx_taskEntry()
{

}

xx.c

void touchgfx_init(void);
void touchgfx_taskEntry(void);

void MX_TouchGFX_Init(void)
{

  touchgfx_init();
}

void MX_TouchGFX_Process(void)
{
  touchgfx_taskEntry();
}

3. 學習touchgfx,官方網站是最權威的方式。
touchgfx官網爲https://support.touchgfx.com/docs/introduction/welcome/
在這裏插入圖片描述
touchgfx官方論壇爲https://community.st.com/s/topic/0TO0X0000003iw6WAA/touchgfx
在這裏插入圖片描述
ST官方針對GUI的網址:https://www.st.com/content/st_com/en/stm32-graphic-user-interface.html
在這裏插入圖片描述
TouchGFX中文網址:https://www.touchgfx.com.cn/i.php
在這裏插入圖片描述
ST MCU培訓資料合集:http://www.stmcu.org.cn/module/forum/thread-622729-1-1.html
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章