【前言】
前面驱动了LCD屏以及移植了TouchGFX,那莫为了更好的体验TouchGFX就需要实现触摸交互,这里我选用了ST7789+GT911的触摸屏,分辨率为240*320。下面就如何驱动GT911来逐一分享。
【硬件】
触摸屏有四根有关GT911的引线,分别为SDA、SCL、INT、RST。他们分别为i2c的数据与时钟线,INT为触摸后产生的中断引脚,RST为复位引脚。
根据开发板的原理图,我这里选用接线如下所示:
SDA--PB13
SCL--PB14
INT--PC8
RST--PB5
【工程配置】
打开stm32cubMX打开I2C2,分配引脚为PB13\PB14,配置PC8为中断输入。配置PB5为输出模式。
【注】I2C需要配置为上拉模式,要不I2C不能产时序。

配置好后,生成工程。
【代码移植】
复制一份原来在stm32f769上的gt911的代码到工程中:
修改初始化代码如下:
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(5);
/*拉高一段时间,进行初始化*/
HAL_GPIO_WritePin(GTP_RST_GPIO_PORT, GTP_RST_GPIO_PIN, GPIO_PIN_SET);
HAL_Delay(10);
HAL_GPIO_WritePin(GTP_INT_GPIO_PORT, GTP_INT_GPIO_PIN, GPIO_PIN_RESET);
HAL_Delay(50);
/*把INT引脚设置为浮空输入模式,以便接收触摸中断信号*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Pin = GTP_INT_GPIO_PIN;
GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStructure.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GTP_INT_GPIO_PORT, &GPIO_InitStructure);
HAL_NVIC_SetPriority(EXTI8_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI8_IRQn);
// 读取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);
// 写入分辨率
// config_data[0] = (uint8_t)240>>8 & 0xFF;
// config_data[1] = (uint8_t)240 & 0xFF;
// config_data[2] = (uint8_t)320>>8 & 0xFF;
// config_data[3] = (uint8_t)320 & 0xFF;
// 转换为软复位模式
uint8_t _temp = 2; // 中间变量
GTXXXX_WriteReg(GT_CTRL_REG, &_temp, 1);
HAL_Delay(100);
// GTXXXX_WriteReg(GT_TP1_REG, config_data, 4); // 设置分��率
// 转换为读取坐标模式
_temp = 0; // 中间变量
GTXXXX_WriteReg(GT_CTRL_REG, &_temp, 1);
}
【代码测试】
在main中引用初始化,在触摸中断中读取坐标:


验证触摸坐标正确。 |