优化基于FT6336驱动芯片的触摸屏响应速度(STM32F4)

目录

概述

1 触摸屏功能实现

1.1 扫描监测方式

1.2 中断监测方式

2  ST7796-LCD

2.1 引脚定义

2.1.1  ST7796-LCD

2.1.2 MCU IO与LCD PIN对应关系

2.1.3  MCU IO与Touch PIN对应关系

2.2 FT6336的寄存器

2.2.1 FT6336寄存器列表

2.2.2 寄存器功能介绍 

3 STM32Cube控制配置FT6336驱动

3.1 引脚配置

3.2 STM32Cube生成软件架构

4 程序实现

4.1 FT6336驱动程序

4.2 触摸屏功能

5 源代码

 5.1 FT6336驱动程序

5.2 触摸屏功能程序


概述

本文主要介绍使用FT6336的INT引脚的中断功能优化触摸屏功能的性能。将FT6336的INT与MCU的IO连接起来,且使能该IO的外部输入中断功能。笔者详细介绍了代码的实现过程,并重写了触摸屏的功能。

1 触摸屏功能实现

1.1 扫描监测方式

笔者使用的LCD上的触摸屏功能是基于FT6336芯片实现,该芯片与MCU之间I2C接口通信。MCU可通过实时读取FT6336的寄存器的值得到,当前的坐标点位。

采用如下架构设计程序:MCU需要实时读取FT6336采集到的点坐标,即使屏幕没有被触摸,读取数据的操作,依然被执行。

存在的问题:

1)MCU需要周期性的读取FT6336寄存器的值,即使没有触碰操作,该过程依然持续

2)在没有触碰屏幕的情况下也读取FT6336寄存器的值,而该值是没有任何意义的,这极大浪费MCU的时间

1.2 中断监测方式

FT6336控制芯片提供了一个INT中断引脚,当屏幕有触动发生时,INT引脚会发出一个低电平信号。MCU可以通过外部中断的方式监测该信号的状态。当中断发生时,说明屏幕被触动,此时,MCU需要读取FT6336寄存器中的点坐标值。

 

2  ST7796-LCD

2.1 引脚定义

2.1.1  ST7796-LCD

LCD的PIN引脚功能介绍

序号模块引脚引脚说明
1VCC屏电源正
2GND屏电源地
3LCD_CS液晶屏片选控制信号,低电平有效
4LCD_RST液晶屏复位控制信号,低电平复位
5LCD_RS液晶屏命令/数据选择控制信号

高电平:数据,低电平:命令

6SDI(MOSI)SPI总线写数据信号(SD卡和液晶屏共用)
7SCKSPI总线时钟信号(SD卡和液晶屏共用)
8LED液晶屏背光控制信号(如需要控制,请接引脚,如不需要控制,可以不接)
9SDO(MISO)SPI总线读数据信号(SD卡和液晶屏共用)
10CTP_SCL电容触摸屏IIC总线时钟信号(无触摸屏的模块不需连接)
11CTP_RST电容触摸屏复位控制信号,低电平复位(无触摸屏的模块不需连接)
12CTP_SDA电容触摸屏IIC总线数据信号(无触摸屏的模块不需连接)
13CTP_INT电容触摸屏IIC总线触摸中断信号,产生触摸时,输入低电平到主控(无触摸屏的模块不需连接)
14SD_CSSD卡片选控制信号,低电平有效(不使用SD卡功能,可不接)

实体LCD Port对应关系如下图所示

2.1.2 MCU IO与LCD PIN对应关系

STM32 PIN引脚LCD PIN引脚
PB5-MOSIMOSI
PB4-MISOMISO
PB3-SCKSCK
PB6CS
PB9RST
PB8RS

2.1.3  MCU IO与Touch PIN对应关系

STM32 PIN引脚touch PIN引脚
PH4I2C-SCK
PH5I2C-SDA
PH10INIT
PH9RST

2.2 FT6336的寄存器

2.2.1 FT6336寄存器列表

2.2.2 寄存器功能介绍 

1)设备模式配置

 2)姿势ID寄存器

 3)TD状态寄存器

4) Pn_XH寄存器

 5) Pn_XL寄存器

 6) Pn_YH寄存器

 7) Pn_YL寄存器

 8) Pn_WEIGHT寄存器 

  9) Pn_MISC寄存器 

3 STM32Cube控制配置FT6336驱动

3.1 引脚配置

1) i2c 引脚配置

其用于实现I2C驱动,实时读取FT6336寄存器的中

2) 中断和复位引脚配置

3) 中断函数使能

3.2 STM32Cube生成软件架构

1) 创建ft6336.c文件,编写ft6336的驱动程序

2) 创建usr_touch.c文件,实现触摸屏功能程序

4 程序实现

4.1 FT6336驱动程序

代码47~54:  复位FT6336

代码55~65:  写寄存器函数

代码67~77:  读寄存器函数

代码84行: 初始化IO

代码85行: 复位芯片

代码87行:读取芯片的ID

代码88行:比较ID

4.2  触摸点监测功能

代码95~100行:  外部中断的回调函数,检测中断是否发生

代码102~105行:清除触摸屏按下的标志

代码107~110行:清除触摸屏按下的标志

4.2 触摸屏功能

代码25~29行: 调用芯片初始化函数

代码39行:读取当前触摸屏状态

代码47行:读取触摸点

 代码110: 清除当前触摸状态

5 源代码

 5.1 FT6336驱动程序

创建FT6336.c,编写如下文件:

/* USER CODE BEGIN Header */
/**
******************************************************************************
* File Name            : ft6336.c
* Description          : I2C drive based on STM32F4
* STM32 HAL library ver: STM32Cube_FW_F4_V1.27.1
* 
******************************************************************************
* @attention
*
* Copyright (c) 2024~2029 mingfei.tang
* All rights reserved.
*
*************************************************************************
*/
/* USER CODE END Header */
#include "ft6336.h"

static int isPressed = 0;


static void touch_delay_us(uint32_t us)
{
    uint32_t i=0;
    
    while(us--){
        for(i=0;i<1000;i++);
    }
}

static void ft6336_TouchIO_Init( void )
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    /* GPIO Ports Clock Enable */
    RCC_TOUCH_CLK_ENABLE();
    /*Configure GPIO pin Output Level */
    HAL_GPIO_WritePin(GPIO_PORT_TOUCH, FT_RST_PIN,GPIO_PIN_RESET);

    /*Configure GPIO pin : RST */
    GPIO_InitStruct.Pin = FT_RST_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIO_PORT_TOUCH, &GPIO_InitStruct);
}

static void  ft6336_rest( void )
{
    FT_RST_L;
    touch_delay_us( 10 );
    FT_RST_H;
    touch_delay_us( 50000 );
}

uint8_t ft6336_WeReg( uint16_t regAdd, uint8_t *pData, uint16_t Size )
{
    HAL_StatusTypeDef status;
    
    status = HAL_I2C_Mem_Write( &hi2c2, FT6336_ADDR, regAdd, 
                                I2C_MEMADD_SIZE_8BIT, pData, Size, 1000);
    if( status == HAL_OK)
        return FT6336_OK;
    else
        return FT6336_ERROR; 
}

uint8_t ft6336_RdReg( uint16_t regAdd, uint8_t *pData, uint16_t Size )
{
    HAL_StatusTypeDef status;
    
    status = HAL_I2C_Mem_Read( &hi2c2, FT6336_ADDR, regAdd, 
                               I2C_MEMADD_SIZE_8BIT, pData, Size, 1000);
    if( status == HAL_OK)
        return FT6336_OK;
    else
        return FT6336_ERROR; 
}


int ft6336_Init( void )
{
    uint8_t id;
   
    ft6336_TouchIO_Init();
    ft6336_rest();
    // read chip id 
    ft6336_RdReg(FT_ID_G_FOCALTECH_ID,&id, 1);
    if(id != PANNEL_ID)
    {
        return FT_FALSE;
    }
    return FT_TRUE;
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if( GPIO_Pin == ft6336_irq_Pin){
        isPressed = 1;
    }
}

void  ft6336_clearPressed( void )
{
   isPressed = 0;
}

int ft6336_getPressed( void )
{
   return isPressed;
}

/* End of this file */

5.2 触摸屏功能程序

创建usr_touch.c,编写如下文件:

/**
  ******************************************************************************
  *                              (c) Copyright 2024, tangmingfei2013@126.com
  *                                      All Rights Reserved
  * @file    usr_touch.c
  * @author  mingfei tang
  * @version V1.0.0
  * @date    2018/03/25
  * @description:
    This source code and any compilation or derivative thereof is the proprietary
    information of mingfei.tang and is confidential in nature.
    Under no circumstances is this software to be combined with any
    Open Source Software in any way or placed under an Open Source License
    of any type without the express written permission of mingfei.tang
  ******************************************************************************
**/
/* Includes ------------------------------------------------------------------*/
#include "usr_touch.h"
#include "lcd_drv.h"

extern _lcd_dev lcddev;
const uint16_t touch_press_reg[2]={FT_TP1_REG,FT_TP2_REG};
static int touch_isOK;

void usr_touchInit( void )
{
   touch_isOK = ft6336_Init();
}

uint8_t usr_ScanTouchProcess( stru_pos *pPos)
{
    uint8_t buf[4];
    uint8_t i = 0;
    uint8_t set = FT_FALSE;;
    uint8_t pointNub = 0;
    static uint8_t cnt = 0;
    int isPressed;
    
    isPressed = ft6336_getPressed();
    if( touch_isOK == FT_FALSE || !isPressed )
        return set;
    
    cnt++;
    if((cnt%10)==0 || cnt<10)
    {
        // read number of touch points 
        ft6336_RdReg(FT_REG_NUM_FINGER,&pointNub,1);
         
        pointNub= pointNub&0x0f;
        if( pointNub && (pointNub < 3) )
        {
            cnt=0;
            // read the point value 
            pPos->status_bit.tpDown = 1;
            pPos->status_bit.tpPress = 1;
            pPos->status_bit.ptNum = pointNub;
            
            for( i=0; i < CTP_MAX_TOUCH; i++)
            {

                ft6336_RdReg( touch_press_reg[i], buf, 4 );
                if( pPos->status_bit.ptNum )
                {
                    switch(lcddev.dir)
                    {
                        case 0:
                            pPos->xpox[i]=((uint16_t)(buf[0]&0X0F)<<8)+buf[1];
                            pPos->ypox[i]=((uint16_t)(buf[2]&0X0F)<<8)+buf[3];
                            break;
                        case 1:
                            pPos->ypox[i]=lcddev.height-(((uint16_t)(buf[0]&0X0F)<<8)+buf[1]);
                            pPos->xpox[i]=((uint16_t)(buf[2]&0X0F)<<8)+buf[3];
                            break;
                        case 2:
                            pPos->xpox[i]=lcddev.width-(((uint16_t)(buf[0]&0X0F)<<8)+buf[1]);
                            pPos->ypox[i]=lcddev.height-(((uint16_t)(buf[2]&0X0F)<<8)+buf[3]);
                            break;
                        case 3:
                            pPos->ypox[i] = ((uint16_t)(buf[0]&0X0F)<<8)+buf[1];
                            pPos->xpox[i] = lcddev.width-(((uint16_t)(buf[2]&0X0F)<<8)+buf[3]);
                            break;
                    } 
                    printf("x[%d]:%d,y[%d]:%d\r\n",i,pPos->xpox[i],i,pPos->ypox[i]);
                }
            } 
            
            set = FT_TRUE;
            if( pPos->xpox[0]==0 && pPos->ypox[0]==0)
            {
                pPos->status = 0;
            }
        }
    }
    
    if( pPos->status_bit.ptNum == 0)
    { 
        if( pPos->status_bit.tpDown )
        {   
            pPos->status_bit.tpDown = 0;
        }
        else
        { 
            pPos->xpox[0] = 0xffff;
            pPos->ypox[0] = 0xffff;
            pPos->status = 0;
        }
    }
    
    // clear pressed status
    ft6336_clearPressed();
    
    if( cnt>240 )
       cnt=10;
    
    return set;
}


/* End of this file */ 

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: FT6336U是一款触摸芯片,而STM32是一种系列的微控制器。FT6336U用于触摸屏的控制,而STM32则是一种强大的微控制器,可用于各种应用领域。在某些场景中,FT6336U可以与STM32微控制器配对使用,以实现触摸屏的功能。 FT6336U提供了多种触摸功能,如单点触摸、多点触摸以及手势识别等。它可以通过I2C或SPI总线与外部主控器(如STM32)进行通信,并将触摸数据传输给主控器进行处理。通过与STM32的配合,可以实现在触摸屏上进行单点或多点触摸操作,并将触摸信息用于控制应用程序的运行。 STM32系列微控制器是一种功能强大且灵活的微控制器。它提供了丰富的外设和接口,包括通用输入输出引脚(GPIO)、通用同步/异步串行接口(USART)、通用定时器(TIM)、通用直接存储器访问(DMA)等,以满足不同应用领域的需求。STM32的处理能力强大,能够处理复杂的任务和算法。 通过将FT6336U与STM32相连接,可以实现触摸屏上的交互操作。STM32可以接收来自FT6336U的触摸数据,并根据用户的操作进行相应的响应。例如,当用户在触摸屏上滑动时,STM32可以通过接收FT6336U传输的滑动操作数据,从而实现滑动功能。通过与FT6336U的配对使用,STM32可以进一步丰富应用程序的交互性,并提供更好的用户体验。 综上所述,FT6336U和STM32是两款不同的芯片,但在某些应用场景下可以协同工作。FT6336U用于触摸屏的控制,而STM32则是一种功能强大的微控制器,可用于实现各种应用。通过将它们相连接,可以实现触摸屏的交互功能,并提供更好的用户体验。 ### 回答2: FT6336U是一款电容式触摸屏控制器芯片,而STM32是一系列由意法半导体(STMicroelectronics)开发的32位ARM Cortex-M基于微控制器。这两者通常一同使用,以实现触摸屏的控制和数据处理。 FT6336U芯片具有高精度、低功耗和可靠性的特点,适用于各种电容触摸屏应用。它能够检测触摸点的位置坐标、触摸事件(如单击、滑动和双击)等,并将这些数据传输给外部主控器,如STM32STM32是一系列以高性能、低功耗和丰富外设特性著称的32位微控制器。它包含了许多不同型号的芯片,可满足各种应用需求。STM32具有强大的计算能力和丰富的外设功能,如通信接口(如UART、SPI和I2C)、定时器、模数转换器(ADC)等。这些功能使STM32能够有效地接收来自FT6336U的触摸屏数据,并进行处理、分析和应用。 在使用FT6336U和STM32的组合中,FT6336U负责探测和捕捉触摸屏上的触摸事件,并将这些数据通过I2C或SPI接口发送给STM32STM32接收到数据后,可根据具体的应用需求进行相应的处理,如实时响应、手势识别、滑动功能等。同时,STM32也可以通过向FT6336U发送控制指令,实现对触摸屏的校准、配置和指示灯的控制等功能。 总之,FT6336U和STM32是一对常用的组合,用于实现电容式触摸屏的控制和数据处理。通过这样的组合,可以实现触摸屏应用的各种功能,并提供灵活的定制化解决方案。 ### 回答3: FT6336U是一款触摸芯片,而STM32是一种Cortex-M系列的微控制器。FT6336U与STM32可以一起使用,以实现触摸屏STM32的控制下的应用。 FT6336U是一款先进的电容式触摸芯片,具有多点触控、低功耗、高灵敏度等特点。它能够检测到用户手指的位置和动作,识别手指的点击、滑动、缩放等操作,并通过I2C接口与主控芯片进行通信。 STM32是意法半导体(STMicroelectronics)推出的一系列强大的32位微控制器。它具有较高的性能和灵活性,能够满足各种应用的需求。STM32系列采用ARM Cortex-M内核,具有较大的存储空间和丰富的外设接口。 使用FT6336U与STM32可以实现触摸屏的功能。首先,FT6336U通过I2C接口连接到STM32,与之进行通信。然后,STM32通过读取FT6336U的输出数据,可以获取到用户的触摸操作信息。根据这些信息,STM32可以进行相应的处理,如控制显示屏的刷新、执行相应的操作等。 因为STM32的性能优异,所以它能够快速、准确地响应FT6336U传来的触摸信息,实现流畅的触摸操作。同时,由于FT6336U具有低功耗特性,能够与STM32实现低功耗的触摸屏应用。 综上所述,FT6336U与STM32可以配合使用,以实现高性能、低功耗的触摸屏应用。这样的应用广泛应用于智能手机、平板电脑、工业控制等领域,为用户提供便利与舒适的触控体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值