如何添加触摸屏驱动到TouchGFX中?

发布时间:2024-06-18  

使用STM32CubeMX移植TouchGFX一文中介绍了如何用TouchGFX点亮屏幕,但是此时屏幕还没有触摸的功能。下面将介绍如何添加触摸屏驱动到TouchGFX中


1. STM32CubeMX配置

在使用STM32CubeMX移植TouchGFX文中的STM32CubeMX配置基础上,再激活一个定时器,用来给IIC通信提供微秒(us)延时。本文通过软件来模拟IIC通信,因此不使用STM32CubeMX来进行IIC配置

b91216f6-666c-11ee-939d-92fbcf53809c.png

2.KEIL中添加触摸芯片驱动


本文中的RGB (800 * 480)屏触摸驱动IC为FT5206芯片,该驱动芯片通过 4 根线与外部连接:CT_RST(PI8), CT_INT(PH7), CT_SDA(PI3), CT_SCL(PH6)。由于通过软件来模拟IIC通信,因此不使用STM32CubeMX来进行配置


2.1添加微秒延时函数


在自动生成的tim.c文件中添加微秒延时函数,并在tim.h中声明


voiddelay_us(uint16_tus)

{

uint16_tdiffer=0xffff-us-5;

__HAL_TIM_SET_COUNTER(&htim6,differ);

HAL_TIM_Base_Start(&htim6);


while(differ< 0xffff - 5){

  differ = __HAL_TIM_GET_COUNTER(&htim6);

 }

 

 HAL_TIM_Base_Stop(&htim6);

}

2.2软件模拟IIC通信


IIC通信头文件:在工程中添加IIC通信头文件ctiic.h


#ifndef__CT_IIC_H

#define__CT_IIC_H


#include"main.h"


#defineIIC_SDA_PORTGPIOI

#defineIIC_SDA_PINGPIO_PIN_3


#defineIIC_SCL_PORTGPIOH

#defineIIC_SCL_PINGPIO_PIN_6


#defineSET_SDA_PIN_HHAL_GPIO_WritePin(IIC_SDA_PORT,IIC_SDA_PIN,GPIO_PIN_SET)

#defineSET_SDA_PIN_LHAL_GPIO_WritePin(IIC_SDA_PORT,IIC_SDA_PIN,GPIO_PIN_RESET)


#defineSET_SCL_PIN_HHAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_SET)

#defineSET_SCL_PIN_LHAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_RESET)



voidSET_SDA_DIR_OUT(void);

voidSET_SDA_DIR_IN(void);

uint8_tREAD_IIC_SDA(void);

voidWRITE_IIC_SDA(uint8_tstate);


voidIIC_Init(void);

voidIIC_Start(void);

voidIIC_Stop(void);

uint8_tIIC_Wait_Ack(void);

voidIIC_Ack(void);

voidIIC_NAck(void);

voidIIC_Send_Byte(uint8_ttxd);

uint8_tIIC_Read_Byte(unsignedcharack);


#endif

IIC通信源文件:在工程中添加IIC通信源文件ctiic.c

#include"ctiic.h"

#include"tim.h"


voidSET_SDA_DIR_OUT(void)

{

 GPIO_InitTypeDefGPIO_Initure;


GPIO_Initure.Pin=IIC_SDA_PIN;

GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;

GPIO_Initure.Pull=GPIO_PULLUP;

GPIO_Initure.Speed=GPIO_SPEED_HIGH;


HAL_GPIO_Init(IIC_SDA_PORT,&GPIO_Initure);

}


voidSET_SDA_DIR_IN(void)

{

 GPIO_InitTypeDefGPIO_Initure;


GPIO_Initure.Pin=IIC_SDA_PIN;

GPIO_Initure.Mode=GPIO_MODE_INPUT;

GPIO_Initure.Pull=GPIO_PULLUP;

GPIO_Initure.Speed=GPIO_SPEED_HIGH;


HAL_GPIO_Init(IIC_SDA_PORT,&GPIO_Initure);

}


uint8_tREAD_IIC_SDA(void)

{

 returnHAL_GPIO_ReadPin(IIC_SDA_PORT,IIC_SDA_PIN);

}


voidWRITE_IIC_SDA(uint8_tstate)

{

 HAL_GPIO_WritePin(IIC_SDA_PORT,IIC_SDA_PIN,state);

}


voidIIC_Init()

{

 GPIO_InitTypeDefGPIO_Initure;

 __HAL_RCC_GPIOI_CLK_ENABLE();

 __HAL_RCC_GPIOH_CLK_ENABLE();


GPIO_Initure.Pin=IIC_SCL_PIN;

GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;

GPIO_Initure.Pull=GPIO_PULLUP;

GPIO_Initure.Speed=GPIO_SPEED_HIGH;

HAL_GPIO_Init(IIC_SCL_PORT,&GPIO_Initure);


 GPIO_Initure.Pin=IIC_SDA_PIN;

HAL_GPIO_Init(IIC_SDA_PORT,&GPIO_Initure);


 SET_SDA_PIN_H;

 SET_SCL_PIN_H;

}


voidIIC_Start()

{

 SET_SDA_DIR_OUT();

 SET_SDA_PIN_H;

 SET_SCL_PIN_H;

 delay_us(30);

 SET_SDA_PIN_L;

 delay_us(2);

 SET_SCL_PIN_L;

}


voidIIC_Stop(void)

{

 SET_SDA_DIR_OUT();

 SET_SCL_PIN_L;

 SET_SDA_PIN_L;

 delay_us(30);

 SET_SCL_PIN_H;

 delay_us(2);

 SET_SDA_PIN_H;

}


uint8_tIIC_Wait_Ack(void)

{

 uint8_tucErrTime=0;

 SET_SDA_DIR_IN();

 SET_SDA_PIN_H;

 SET_SCL_PIN_H;

 delay_us(2);

 while(READ_IIC_SDA()){

 ucErrTime++;

 if(ucErrTime>250){

 IIC_Stop();

 return1;

 }

 delay_us(2);

 }

 SET_SCL_PIN_L;

 return0;

}


voidIIC_Ack(void)

{

 SET_SCL_PIN_L;

 SET_SDA_DIR_OUT();

 SET_SDA_PIN_L;

 delay_us(2);

 SET_SCL_PIN_H;

 delay_us(2);

 SET_SCL_PIN_L;

}


voidIIC_NAck(void)

{

 SET_SCL_PIN_L;

 SET_SDA_DIR_OUT();

 SET_SDA_PIN_H;

 delay_us(2);

 SET_SCL_PIN_H;

 delay_us(2);

 SET_SCL_PIN_L;

}


voidIIC_Send_Byte(uint8_ttxd)

{

uint8_tt;

 SET_SDA_DIR_OUT();

 SET_SCL_PIN_L;

 for(t=0;t<8;t++){              

    WRITE_IIC_SDA((txd&0x80)>>7);

txd<<= 1; 

    delay_us(2);       

    SET_SCL_PIN_H;

    delay_us(2);

    SET_SCL_PIN_L;

    delay_us(2); 

  }  


uint8_t IIC_Read_Byte(unsigned char ack)

{

  uint8_t i,receive = 0;

  SET_SDA_DIR_IN();

  delay_us(30);

  for(i=0;i<8;i++ )

  { 

    SET_SCL_PIN_L;

    delay_us(2);

    SET_SCL_PIN_H;  

    receive <<= 1;

    if(READ_IIC_SDA())

      receive++; 

    delay_us(2); 

 }        

 if (!ack)

   IIC_NAck();

 else 

   IIC_Ack();   

 return receive;

2.3 FT5206芯片驱动


在工程中添加FT5206芯片驱动头文件ft5206.h


#ifndef__FT5206_H

#define__FT5206_H


#include"ctiic.h"


#defineFT_CMD_WR0X70

#defineFT_CMD_RD0X71


#defineFT_DEVIDE_MODE0x00

#defineFT_REG_NUM_FINGER0x02


#defineFT_TP1_REG0X03

#defineFT_TP2_REG0X09

#defineFT_TP3_REG0X0F

#defineFT_TP4_REG0X15

#defineFT_TP5_REG0X1B


#defineFT_ID_G_LIB_VERSION0xA1

#defineFT_ID_G_MODE0xA4

#defineFT_ID_G_THGROUP0x80

#defineFT_ID_G_PERIODACTIVE0x88


#defineTOUCH_MAX_NUM5


typedefstruct

{

uint8_ttouch_type;

uint8_tdir;//0表示竖屏,1表示横屏

uint16_tpix_w;

uint16_tpix_h;

uint8_ttouch_num;

uint16_tx[TOUCH_MAX_NUM];

uint16_ty[TOUCH_MAX_NUM];

}TouchTypedef;


uint8_tFT5206_WR_Reg(uint16_treg,uint8_t*buf,uint8_tlen);

voidFT5206_RD_Reg(uint16_treg,uint8_t*buf,uint8_tlen);

voidFT5206_Init(void);

uint8_tFT5206_Scan(TouchTypedef*touch);


#endif

在工程中添加FT5206芯片驱动文件ft5206.c


#include"ft5206.h"

#include"stdio.h"


staticconstuint16_tFT5206_TPX_TBL[5]={FT_TP1_REG,FT_TP2_REG,FT_TP3_REG,FT_TP4_REG,FT_TP5_REG};


uint8_tFT5206_WR_Reg(uint16_treg,uint8_t*buf,uint8_tlen)

{

uint8_ti;

uint8_tret=0;

IIC_Start();

IIC_Send_Byte(FT_CMD_WR);

IIC_Wait_Ack();

IIC_Send_Byte(reg&0XFF);

IIC_Wait_Ack();

for(i=0;itouch_num=touch_num;

if((touch_num&0XF)&&((touch_num&0XF)<6))

 {

  for(i = 0;idir){

y=((uint16_t)(buf[0]&0X0F)<<8)+buf[1];

    x = ((uint16_t)(buf[2]&0X0F)<<8)+buf[3];

   }else{

   x = touch->pix_h-(((uint16_t)(buf[0]&0X0F)<<8)+buf[1]);

    y = ((uint16_t)(buf[2]&0X0F)<<8)+buf[3];

   }

   touch->x[i]=x;

touch->y[i]=y;

}

}else{

touch->touch_num=0;

return0;

}

returntouch_num;

}


2.4将触摸驱动添加到TouchGFX中


将触摸驱动添加到触摸控制文件STM32TouchController.cpp中


#include


extern"C"{

#include"ft5206.h"

}


TouchTypedefmtouch;


voidSTM32TouchController::init()

{

FT5206_Init();

mtouch.dir=1;

mtouch.pix_w=800;

mtouch.pix_h=480;

}


boolSTM32TouchController::sampleTouch(int32_t&x,int32_t&y)

{

if(FT5206_Scan(&mtouch)){

x=mtouch.x[0];

y=mtouch.y[0];

returntrue;

}

returnfalse;

}

3.TouchGFX Designer中添加点击事件

在TouchGFX Designer中,创建一个按钮,实现点击后背景变色的功能 添加一个图标按钮,同时添加一个box作为背景

b92acb42-666c-11ee-939d-92fbcf53809c.png

添加交互动作:实现点击图标按钮,背景颜色由黑色变为白色

b94791b4-666c-11ee-939d-92fbcf53809c.png

点击Generate Code生成TouchGFX代码

4.下载测试

回到Keil工程中,编译无误后,下载到开发板中。点击屏幕上的按钮,若屏幕背景色由黑色变为白色,说明点击成功,触摸驱动添加成功

b95e6510-666c-11ee-939d-92fbcf53809c.png


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>