TouchGFX学习笔记QSPI(一)

配置请参考链接:TouchGFX超低配置移植教程-CSDN博客

裸机

一,显示配置

1.适当增加堆栈大小:

2.适当增大缓冲大小:

二,硬件配置

1.开启I2C1用于连接触摸芯片,(PB6,PB7):

2.开启SPI1(Transmit Only Master)用于LCD 串行数据传输,(PB3,PB5),开启DMA

开启SPI中断用于屏幕刷新完成时调用函数:

3.开启QSPI 4线模式用于读写W25Q64:

4.开启tim6 定时器为TouchGFX提供时钟源,开启中断:

5.不生成QSPI初始化函数:

三,C/C++ 基础示例

1.在cpp文件中的c函数外部函数声明:

extern "C" int touchgfxDisplayDriverTransmitActive();

2.在c文件中的cpp函数外部函数声明:

extern void touchgfxTickHandler(void);//也可以省略extern

3.使cpp文件中的函数兼容c文件使用:

extern "C"
void DisplayDriver_TransferCompleteCallback()
{
    PartialFrameBufferManager::tryTransmitBlockFromIRQ();
}

        在其它C文件中使用在 TouchGFXGeneratedHAL.cpp 中定义的DisplayDriver_TransferCompleteCallback 函数,你需要确保以下几点:声明函数原型:在需要使用该函数的 C 文件中声明该函数的原型。 确保链接:确保在编译和链接时包含 TouchGFXGeneratedHAL.cpp 文件,以便链接器能够找到该函数的定义。

        由于DisplayDriver_TransferCompleteCallback 函数被声明为 extern "C",它具有 C 链接约定,因此可以在 C 文件中直接使用。在需要使用 DisplayDriver_TransferCompleteCallback 函数的 C 文件中声明该函数的原型。你可以通过创建一个头文件来包含这个声明,或者直接在 C 文件中声明。

4.extern外部声明:

        无论是函数还是全局变量,在一个文件中定义了,在另一个文件中如果要使用只需要extern外部声明一下就行了,其中函数可以省略extern,在.h文件中声明只是为了方便管理而已。

四,显示移植

1.st7789

点击TouchGFXGeneratedHAL.cpp,其位于Application/User/TouchGFX/target/generated一栏中,在该点cpp文件的开头就可以看到四个函数声明,前三个都是需要用户自己提供。

//st7789.c
volatile uint8_t IsTransmittingBlock_=0;
/**
 * Check if a Frame Buffer Block is beeing transmitted.
 * TouchGFX获取当前屏幕刷新状态的函数,返回值1表示屏幕正在刷新,返回值0标志屏幕已刷新完成。
 */
int touchgfxDisplayDriverTransmitActive(void)
{
	return IsTransmittingBlock_;
}
/**
 * Check if a Frame Buffer Block ending at bottom may be sent.
 * TouchGFX获取当前屏幕刷新状态的函数,返回值1表示屏幕正在刷新,返回值0标志屏幕已刷新完成。
 */
int touchgfxDisplayDriverShouldTransferBlock(uint16_t bottom)
{
	return 1;
}
/**
 * Transmit a Frame Buffer Block.
 * 屏幕刷新的接口函数,用户需要在此函数中调用自己屏幕的刷屏函数。
 */
void touchgfxDisplayDriverTransmitBlock(const uint8_t* pixels, uint16_t x, uint16_t y, uint16_t w, uint16_t h)
{
	IsTransmittingBlock_=1;
	ST7789_DrawImage(x,y,w,h,(uint16_t*)pixels);
}

2.spi_it

除了上述三个函数,还需要注意一个函数DisplayDriver_TransferCompleteCallback,用户需要在屏幕刷新完成时调用该函数。

//spi.c
extern volatile uint8_t IsTransmittingBlock_;
extern void DisplayDriver_TransferCompleteCallback(void);
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
{
	if (hspi->Instance == SPI1) {
		IsTransmittingBlock_ = 0;
		DisplayDriver_TransferCompleteCallback();
	}
}

3.time_it

TouchGFX正常工作的前提条件是需要一个外部的时钟源,由于本例程使用的屏为SPI屏,STM32CubeMX中配置的时钟源选项默认为Custom,即需要用户自己为TouchGFX提供时钟源

//tim.c
extern void touchgfxTickHandler(void);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  static int counter=0;
	
  if (htim->Instance == TIM6)
	{
    touchgfxTickHandler();
		if(++counter%200==0)
				HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
  }
}

4.TouchGFXHAL

#include <touchgfx/hal/OSWrappers.hpp>
#include "norflash.h"
#include <touchgfx/hal/PartialFrameBufferManager.hpp>
#include <touchgfx/bitmap.hpp>
using namespace touchgfx;

extern "C" {
	uint8_t isInited = 0;
	
}
extern uint8_t isInited;
isInited = 1;
//TouchGFXHAL.cpp
extern "C" 
void touchgfxTickHandler()
{
	static uint8_t ms = 0;
	static uint8_t isHigh = 0;
	
	if(isInited)
	{
		ms++;
		if(ms==20)
		{
			ms = 0;
			isHigh = !isHigh;
			if(isHigh)
			{
				OSWrappers::signalVSync();
			}else
			{
				HAL::getInstance()->frontPorchEntered();
			}	
		}
	}
}

五,触控移植

#include "ns2009.h"

unsigned int pos[2]={0};
		bsp_ns2009_getPos(pos);
		if(pos[0]||pos[1])
		{
			x=pos[0];
			y=pos[1];
			pos[0]=0;
			pos[1]=0;
			return true;
		}
		else
			return false;

六,MDK初始化

1.不勾选MicroLIB,不对printff重定向。确保MX_QUADSPI_Init,屏幕初始化,触摸芯片初始化等中不使用printf()。

2.main.c初始化。

#include "quadspi.h"

七,分散加载

1.编译。

*.o (ExtFlashSection)

2.先单独下载内部flash(不要勾选复位)。

3.后下载外部flash。

注:编译与下载算法无关,可以只用内部flash算法调试。

八,修改显示方向

注:方向不正确会出现控件花屏。

RTOS

FMC和SPI显示接口 | TouchGFX Documentation

实时操作系统 | TouchGFX Documentation

一,RTOSV1

1.FreeRTOS配置

2.仍使用tim6为TGFX时钟源

  static int counter=0;
	
  if (htim->Instance == TIM6)
	{
    touchgfxTickHandler();
		if(++counter%200==0)
				toggle_led();
  }

二,RTOSV2

1.FreeRTOS配置

2.软件定时器为TGFX时钟源

### TouchGFX框架介绍 TouchGFX个专为嵌入式图形用户界面(GUI)设计的开发框架,主要用于 ARM Cortex-M 系列微控制器。该框架提供了种高效且直观的方式来创建复杂的 GUI 序列动画和交互界面[^1]。它支持多种显示技术,并通过优化的图形渲染引擎来减少对硬件资源的需求。 #### 核心特性 - **高效的图形渲染**:TouchGFX 使用 DMA 控制器进行图像传输,从而降低 CPU 的负载。 - **丰富的 UI 组件**:内置了大量可复用的 UI 元素,如按钮、滑块、进度条等[^2]。 - **动画支持**:提供了强大的动画引擎,能够实现流畅的过渡效果和动态更新。 - **多语言支持**:允许开发者轻松切换不同语言的文本内容。 - **集成开发环境(IDE)支持**:TouchGFX Designer 是个可视化的工具,用于设计和预览用户界面[^3]。 --- ### TouchGFX使用指南 #### 1. 开发环境搭建 在开始使用 TouchGFX 前,需要安装以下工具: - **STM32CubeMX**:用于生成初始化代码。 - **TouchGFX Designer**:用于设计图形界面。 - **Keil 或 IAR**:用于编译和调试项目。 安装完成后,可以通过 STM32CubeMX 配置目标 MCU,并选择 TouchGFX 作为中间件集成到项目中[^4]。 #### 2. 创建用户界面 使用 TouchGFX Designer 创建界面布局。设计师可以拖放控件到画布上,并设置其属性。所有更改会自动同步到项目的源代码中。 ```cpp // 示例:设置按钮的点击事件 void Application::touch(int x, int y, bool pressed) { if (pressed && button.isInside(x, y)) { // 触发按钮点击逻辑 buttonClicked(); } } ``` #### 3. 图形渲染与优化 TouchGFX 提供了两种渲染模式:单缓冲和双缓冲。双缓冲模式可以避免屏幕撕裂现象,适合需要频繁更新的场景[^5]。 #### 4. 动画实现 动画可以通过 XML 文件定义,也可以在代码中动态生成。例如,以下代码展示了如何通过代码实现个简单的淡入效果: ```cpp void Application::fadeAnimation() { PictureWidget picture; Animation animation(&picture, &PictureWidget::setAlpha, 0, 255, 1000); animation.start(); } ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值