在我的ST7789屏上适配的是GT911的触摸屏。
【硬件接口】
SDA——I2C1_SDA接PB7
SCL——I2C1_SCL接PB7
INT——普通GPIO接PC6
RST——普通GPIO接PB10
【stm32cubeMX适配】
1、打开i2c1,并配置IO为上拉。


2、生成工程。
【代码移植】
生成keil工程后,添加gt911.c/h
修改代码如下:
/***************************************** I2C Functions *****************************************/
static void GTXXXX_WriteReg(uint16_t addr, uint8_t *buf, uint8_t len)
{
/* Use Mem_Write - handles register address + data write */
HAL_I2C_Mem_Write(&hi2c1, GT911_DIV_W, addr, 2, buf, len, HAL_MAX_DELAY);
}
static void GTXXXX_ReadReg(uint16_t addr, uint8_t *buf, uint8_t len)
{
/* Use Mem_Read - handles register address + data read with proper STOP/START */
HAL_I2C_Mem_Read(&hi2c1, GT911_DIV_W, addr, 2, buf, len, HAL_MAX_DELAY);
}
/***************************************** Reset *****************************************/
void GT911_Reset(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* Set INT (PC6) as output, low */
GPIO_InitStruct.Pin = GT911_INIT_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GT911_INIT_GPIO_Port, &GPIO_InitStruct);
HAL_GPIO_WritePin(GT911_INIT_GPIO_Port, GT911_INIT_Pin, GPIO_PIN_RESET);
/* Set RST (PB10) as output, low */
GPIO_InitStruct.Pin = GT911_RST_Pin;
HAL_GPIO_Init(GT911_RST_GPIO_Port, &GPIO_InitStruct);
HAL_GPIO_WritePin(GT911_RST_GPIO_Port, GT911_RST_Pin, GPIO_PIN_RESET);
/* Set INT high first */
HAL_GPIO_WritePin(GT911_INIT_GPIO_Port, GT911_INIT_Pin, GPIO_PIN_SET);
HAL_Delay(5);
/* Release RST */
HAL_GPIO_WritePin(GT911_RST_GPIO_Port, GT911_RST_Pin, GPIO_PIN_SET);
HAL_Delay(10);
/* Set INT low */
HAL_GPIO_WritePin(GT911_INIT_GPIO_Port, GT911_INIT_Pin, GPIO_PIN_RESET);
HAL_Delay(50);
/* Set INT as input (now acts as INT pin) */
GPIO_InitStruct.Pin = GT911_INIT_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GT911_INIT_GPIO_Port, &GPIO_InitStruct);
}
注意的是需要对修改i2c的发送与接收为HAL_I2C_Mem_Write,HAL_I2C_Mem_Read,要不会造成发送后与GT911匹配不上,出现发送数据后出现NAK的错造成通信不上。
还有就是RST的时序问题,需要根据逻辑分析仪的反馈调整从而实现0x28的地址。
【适配lvgl】
在keil的lvgl中添加input选项。
2、修改触摸函数如下:
static void touchpad_read(lv_indev_t * indev_drv, lv_indev_data_t * data)
{
static int32_t last_x = 0;
static int32_t last_y = 0;
GT911_Scan();
if(User_Touch.Touch_Number > 0)
{
uint16_t raw_x = User_Touch.Touch_XY[0].X_Point;
uint16_t raw_y = User_Touch.Touch_XY[0].Y_Point;
data->point.x = ((raw_y) * 240) / 320;
data->point.y = ((raw_x) * 320) / 240;
char buf[64];
int len = sprintf(buf, "X:%d Y:%d\r\n", data->point.x, data->point.y);
HAL_UART_Transmit(&hcom_uart[COM1], (uint8_t *)buf, len, 100);
data->state = LV_INDEV_STATE_PRESSED;
}
else
{
data->state = LV_INDEV_STATE_RELEASED;
}
}
这里我们需要根据四个角点的反馈来进行换算。
【实验效果】
触摸屏后,如期打印出坐标:
