STM32系列-CubeIDE、CubeMX配置GT系列GT911触摸芯片教程(图文快速上手)
一、图形配置触摸芯片引脚
GT911芯片与MCU间使用IIC通讯,因此首先配置IIC。需要查看电路原理图找到相应引脚挂在哪个IIC下,然后开启对应IIC。
二、添加GT911触摸芯片文件
#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_
#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 GT911_I2C hi2c3
#define GT911_DIV_W 0x28
#define GT911_DIV_R 0x29
#define GT_CTRL_REG 0X8040
#define GT_CFGS_REG 0X8047
#define GT_CHECK_REG 0X80FF
#define GT_PID_REG 0X8140
#define GT_GSTID_REG 0X814E
#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
typedef enum
{
X_L = 0,
X_H = 1,
Y_L = 2,
Y_H = 3,
S_L = 4,
S_H = 5
}Data_XYS_P;
typedef enum
{
TOUCH__NO = 0x00,
TOUCH_ING = 0x80
}TOUCH_STATE_enum;
typedef struct
{
uint16_t X_Point;
uint16_t Y_Point;
uint16_t S_Point;
}XY_Coordinate;
typedef struct
{
uint8_t Touch_State ;
uint8_t Touch_Number ;
XY_Coordinate Touch_XY[GT_TOUCH_MAX] ;
}Touch_Struct;
extern Touch_Struct User_Touch;
void GTP_Init(void);
void GTXXXX_Scanf(void);
void GTP911_Test(void);
#endif
gt911.c代码
#include "gt911.h"
#include <stdio.h>
Touch_Struct User_Touch;
#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,0x,0x32,0x00,0x00,
0x00,0x28,0x,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)
{
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);
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_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);
}
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);
User_Touch.Touch_XY[i].X_Point = _temp;
GTXXXX_ReadReg((GT_TPD_Sta + i*8 + X_H), &_temp, 1);
User_Touch.Touch_XY[i].X_Point |= (_temp<<8);
GTXXXX_ReadReg((GT_TPD_Sta + i*8 + Y_L), &_temp, 1);
User_Touch.Touch_XY[i].Y_Point = _temp;
GTXXXX_ReadReg((GT_TPD_Sta + i*8 + Y_H), &_temp, 1);
User_Touch.Touch_XY[i].Y_Point |= (_temp<<8);
GTXXXX_ReadReg((GT_TPD_Sta + i*8 + S_L), &_temp, 1);
User_Touch.Touch_XY[i].S_Point = _temp;
GTXXXX_ReadReg((GT_TPD_Sta + i*8 + S_H), &_temp, 1);
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;
}
}