当前位置:   article > 正文

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

stm32 gt911

// 触摸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代码



  • 1
  • 2
  • 3
  • 4
  • 5

/*
* 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(>911_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(>911_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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数嵌入式工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

img

img

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以+V:Vip1104z获取!!! (备注:嵌入式)

img

最后

资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!

更新**

如果你觉得这些内容对你有帮助,可以+V:Vip1104z获取!!! (备注:嵌入式)

img

最后

资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!

更多资料点击此处获qu!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/516987
推荐阅读
相关标签
  

闽ICP备14008679号