STM32系列-CubeIDE、CubeMX配置GT系列GT911触摸芯片教程(图文快速上手)

STM32系列-CubeIDE、CubeMX配置GT系列GT911触摸芯片教程(图文快速上手)

一、图形配置触摸芯片引脚

GT911芯片与MCU间使用IIC通讯,因此首先配置IIC。需要查看电路原理图找到相应引脚挂在哪个IIC下,然后开启对应IIC。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
按电路图配置其余两个引脚,
在这里插入图片描述
开启一个串口用于输出触摸坐标,以便观察实验现象。
在这里插入图片描述

二、添加GT911触摸芯片文件

在stm32cubeide的“Core/Inc”和“Core/Src”目录下分别添加GT911.h和GT911.c文件,然后将文章尾部的代码复制进去。
如果你的芯片不是h750vbt6,你需要修改gt911.h中的以下四句代码:
在这里插入图片描述
如果你的触摸芯片不是GT911,是GT9147,你需要修改gt911.c中的以下数组(查看其他文章以知道具体的数据内容):
在这里插入图片描述
或重新声明一个数组,然后在gt911.c中的下方所示位置进行调用:
在这里插入图片描述
向usart.c文件中添加下方代码实现printf函数的重定向

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE
{
	HAL_UART_Transmit(&huart1, (uint8_t*)&ch,1,HAL_MAX_DELAY);
    return ch;
}

三、测试

最后,在main.c的while循环中调用函数GTP911_Test(),打开串口调试助手,实验现象如下:
在这里插入图片描述
gt911.c中的函数GTP911_Test()表明,如果你想获得触摸坐标,只需要调用GTXXXX_Scanf()函数即可,获得的坐标信息会存储在User_Touch结构体中,
如果需要在其他文件中读取坐标信息,只需要包含gt911.h头文件,或者直接声明这个结构体就可以了,如下:

extern Touch_Struct	User_Touch;

四、代码附录

gt9xx.h代码

#include "main.h"
#include "i2c.h"

#ifndef INC_GT9XX_H_
#define INC_GT9XX_H_


// 触摸IC引脚和中断
#define GTP_RST_GPIO_PORT GTP_RST_GPIO_Port
#define GTP_RST_GPIO_PIN GTP_RST_Pin
#define GTP_INT_GPIO_PORT GTP_INT_GPIO_Port
#define GTP_INT_GPIO_PIN GTP_INT_Pin
//#define GTP_INT_EXTI_IRQ EXTI4_IRQn //

/*I2C句柄*/
#define		GT911_I2C			hi2c3

// 触摸IC设备地址
#define GT911_DIV_W 0x28
#define GT911_DIV_R 0x29

//GT911 部分寄存器定义
#define GT_CTRL_REG 	0X8040   	//GT911控制寄存器
#define GT_CFGS_REG 	0X8047   	//GT911配置起始地址寄存器
#define GT_CHECK_REG 	0X80FF   	//GT911校验和寄存器
#define GT_PID_REG 		0X8140   	//GT911产品ID寄存器

#define GT_GSTID_REG 	0X814E   	//GT911当前检测到的触摸情况,第7位是触摸标志位,低4位是触摸点数个数

#define GT_TPD_Sta		0X8150		//触摸点起始数据地址
#define GT_TP1_REG 		0X8150  	//第一个触摸点数据地址
#define GT_TP2_REG 		0X8158		//第二个触摸点数据地址
#define GT_TP3_REG 		0X8160		//第三个触摸点数据地址
#define GT_TP4_REG 		0X8168		//第四个触摸点数据地址
#define GT_TP5_REG 		0X8170		//第五个触摸点数据地址


#define GT_TOUCH_MAX	5			//对于gt911,最多同时获取5个触摸点的数据

typedef enum
{
	X_L = 0,
	X_H = 1,
	Y_L = 2,
	Y_H = 3,
	S_L	= 4,
	S_H = 5
}Data_XYS_P;	//数据X、Y、触摸大小数据偏移量

typedef enum
{
	TOUCH__NO		= 0x00,	//没有触摸
	TOUCH_ING		= 0x80	//被触摸
}TOUCH_STATE_enum;	//触摸状态

typedef struct
{
	uint16_t	X_Point;	//X坐标
	uint16_t	Y_Point;	//Y坐标
	uint16_t	S_Point;	//触摸点大小
}XY_Coordinate;	//触摸点坐标


/*触摸结构体*/
typedef struct
{
	uint8_t Touch_State				;	//触摸状态
	uint8_t Touch_Number			;	//触摸数量
	XY_Coordinate Touch_XY[GT_TOUCH_MAX]	;	//触摸的x坐标,对于gt911最多5个点的坐标
}Touch_Struct;	//触摸信息结构体

/*外部变量区*/
extern Touch_Struct	User_Touch;



/*外部函数区*/
void GTP_Init(void);
void GTXXXX_Scanf(void);
void GTP911_Test(void);



#endif /* INC_GT9XX_H_ */

gt911.c代码

/*
 * gt9xx.c
 *
 *  Created on: Mar 20, 2024
 *      Author: ZuoenDeng
 */
#include "gt911.h"
#include <stdio.h>

/*创建触摸结构体*/
Touch_Struct	User_Touch;

// GT911驱动配置,默认使用第一份配置文件,如果屏幕异常,可尝试使用第二份
#if  1
const uint8_t CTP_CFG_GT911[] =  {
0x41,0x20,0x03,0xE0,0x01,0x05,0x3D,0x00,0x01,0x08,
0x1E,0x05,0x3C,0x3C,0x03,0x05,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x1A,0x1C,0x1E,0x14,0x8A,0x2A,0x0C,
0x2A,0x28,0xEB,0x04,0x00,0x00,0x01,0x61,0x03,0x2C,
0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x14,0x3C,0x94,0xC5,0x02,0x08,0x00,0x00,0x04,
0xB7,0x16,0x00,0x9F,0x1B,0x00,0x8B,0x22,0x00,0x7B,
0x2B,0x00,0x70,0x36,0x00,0x70,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x16,0x14,0x12,0x10,0x0E,0x0C,0x0A,
0x08,0x06,0x04,0x02,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x24,0x22,0x21,0x20,0x1F,0x1E,0x1D,0x1C,
0x18,0x16,0x13,0x12,0x10,0x0F,0x0A,0x08,0x06,0x04,
0x02,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x0A,0x00
};
#else
const uint8_t CTP_CFG_GT911[] =  {
  0x00,0x20,0x03,0xE0,0x01,0x05,0x0D,0x00,0x01,0x08,
  0x28,0x0F,0x50,0x32,0x03,0x05,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8A,0x2A,0x0C,
  0x45,0x47,0x0C,0x08,0x00,0x00,0x00,0x02,0x02,0x2D,
  0x00,0x00,0x00,0x00,0x00,0x03,0x64,0x32,0x00,0x00,
  0x00,0x28,0x64,0x94,0xC5,0x02,0x07,0x00,0x00,0x04,
  0x9C,0x2C,0x00,0x8F,0x34,0x00,0x84,0x3F,0x00,0x7C,
  0x4C,0x00,0x77,0x5B,0x00,0x77,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x18,0x16,0x14,0x12,0x10,0x0E,0x0C,0x0A,
  0x08,0x06,0x04,0x02,0xFF,0xFF,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x16,0x18,0x1C,0x1D,0x1E,0x1F,0x20,0x21,
  0x22,0x24,0x13,0x12,0x10,0x0F,0x0A,0x08,0x06,0x04,
  0x02,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x24,0x01
};
#endif

void GTXXXX_WriteReg(uint16_t _usRegAddr, uint8_t *_pRegBuf, uint8_t _ucLen)
{
	HAL_I2C_Mem_Write(&GT911_I2C, GT911_DIV_W, _usRegAddr, I2C_MEMADD_SIZE_16BIT, _pRegBuf, _ucLen, 0xff);
}

void GTXXXX_ReadReg(uint16_t _usRegAddr, uint8_t *_pRegBuf, uint8_t _ucLen)
{
	HAL_I2C_Mem_Read(&GT911_I2C, GT911_DIV_R, _usRegAddr, I2C_MEMADD_SIZE_16BIT, _pRegBuf, _ucLen, 0xff);
}

void GTP_Init(void)
{
   /*初始化gt9157的设备地址为0x28/0x29*/

   HAL_GPIO_WritePin (GTP_INT_GPIO_PORT,GTP_INT_GPIO_PIN,GPIO_PIN_RESET);
   HAL_GPIO_WritePin (GTP_RST_GPIO_PORT,GTP_RST_GPIO_PIN,GPIO_PIN_RESET);
   HAL_Delay(100);
   /*复位为低电平,为初始化做准备*/
   HAL_GPIO_WritePin (GTP_INT_GPIO_PORT,GTP_INT_GPIO_PIN,GPIO_PIN_SET);
   HAL_Delay(10);

   /*拉高一段时间,进行初始化*/
   HAL_GPIO_WritePin (GTP_RST_GPIO_PORT,GTP_RST_GPIO_PIN,GPIO_PIN_SET);
   HAL_Delay(10);

   /*把INT引脚设置为浮空输入模式,以便接收触摸中断信号*/
   GPIO_InitTypeDef GPIO_InitStructure;
   GPIO_InitStructure.Pin = GTP_INT_GPIO_PIN;
   GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
   GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
   GPIO_InitStructure.Pull  = GPIO_NOPULL;
   HAL_GPIO_Init(GTP_INT_GPIO_PORT, &GPIO_InitStructure);
//   HAL_NVIC_SetPriority(GTP_INT_EXTI_IRQ, 1, 1);/* 配置中断优先级 */
//   HAL_NVIC_EnableIRQ(GTP_INT_EXTI_IRQ);/* 使能中断 */

   // 读取ID
   HAL_Delay(100);
   uint8_t GTP_ID[4];
   GTXXXX_ReadReg(GT_PID_REG,GTP_ID,4);
   printf("GTP_ID:%s\n",GTP_ID);

   // 写入配置表
   GTXXXX_WriteReg(GT_CFGS_REG, (uint8_t *)CTP_CFG_GT911, sizeof(CTP_CFG_GT911));
   HAL_Delay(100);

   // 转换为软复位模式
   uint8_t _temp=2;	//中间变量
   GTXXXX_WriteReg(GT_CTRL_REG, &_temp, 1);
   HAL_Delay(100);

   // 转换为读取坐标模式
   _temp=0;	//中间变量
   GTXXXX_WriteReg(GT_CTRL_REG, &_temp, 1);

}

/*
	功能:gt911触摸扫描,判断当前是否被触摸
	参数1:
*/
void GTXXXX_Scanf(void)
{
	uint8_t _temp;	//中间变量

	GTXXXX_ReadReg(GT_GSTID_REG, &_temp, 1);//读取状态寄存器

	// 记录触摸状态
	User_Touch.Touch_State = _temp;
	User_Touch.Touch_Number = (User_Touch.Touch_State & 0x0f);	//获取触摸点数
	User_Touch.Touch_State = (User_Touch.Touch_State & 0x80);	//触摸状态

	//判断是否有触摸数据
	switch(User_Touch.Touch_State)
	{
		case TOUCH__NO:		//没有数据
			break;
		case TOUCH_ING:		//触摸中~后,有数据,并读出数据
			for(uint8_t i=0; i<User_Touch.Touch_Number; i++)
			{
				GTXXXX_ReadReg((GT_TPD_Sta + i*8 + X_L), &_temp, 1);	//读出触摸x坐标的低8位
				User_Touch.Touch_XY[i].X_Point  = _temp;
				GTXXXX_ReadReg((GT_TPD_Sta + i*8 + X_H), &_temp, 1);	//读出触摸x坐标的高8位
				User_Touch.Touch_XY[i].X_Point |= (_temp<<8);

				GTXXXX_ReadReg((GT_TPD_Sta + i*8 + Y_L), &_temp, 1);	//读出触摸y坐标的低8位
				User_Touch.Touch_XY[i].Y_Point  = _temp;
				GTXXXX_ReadReg((GT_TPD_Sta + i*8 + Y_H), &_temp, 1);	//读出触摸y坐标的高8位
				User_Touch.Touch_XY[i].Y_Point |= (_temp<<8);

				GTXXXX_ReadReg((GT_TPD_Sta + i*8 + S_L), &_temp, 1);	//读出触摸大小数据的低8位
				User_Touch.Touch_XY[i].S_Point  = _temp;
				GTXXXX_ReadReg((GT_TPD_Sta + i*8 + S_H), &_temp, 1);	//读出触摸大小数据的高8位
				User_Touch.Touch_XY[i].S_Point |= (_temp<<8);
			}

			_temp=0;
			GTXXXX_WriteReg(GT_GSTID_REG, &_temp, 1);	//清除数据标志位
		break;
	}
}

void GTP911_Test(void)
{
	GTXXXX_Scanf();		//不断扫描
	if(User_Touch.Touch_State == 0x80)
	{
		for(uint8_t i=0; i<User_Touch.Touch_Number; i++)
		{
			printf("X : %d  ", User_Touch.Touch_XY[i].X_Point);
			printf("Y : %d  ", User_Touch.Touch_XY[i].Y_Point);
			printf("S : %d\r\n\r\n", User_Touch.Touch_XY[i].S_Point);
		}
		User_Touch.Touch_State  = 0;
		User_Touch.Touch_Number = 0;
	}
}


  • 14
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值