0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

嵌入式攻城狮 来源:嵌入式攻城狮 2023-10-09 14:41 次阅读

使用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    







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 触摸屏
    +关注

    关注

    42

    文章

    2131

    浏览量

    113662
  • 定时器
    +关注

    关注

    23

    文章

    3148

    浏览量

    112043
  • TouchGFX
    +关注

    关注

    1

    文章

    40

    浏览量

    13052
  • stm32cubemx
    +关注

    关注

    5

    文章

    260

    浏览量

    14448
  • IIC通信
    +关注

    关注

    0

    文章

    17

    浏览量

    2971

原文标题:TouchGFX界面开发 | 添加触摸屏驱动

文章出处:【微信号:嵌入式攻城狮,微信公众号:嵌入式攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    TouchGFX开发(2)----触摸屏幕组件点亮LED

    了解如何使用 TouchGFX 配置屏幕,添加触摸按钮,并通过按钮控制板载 LED 的状态。
    的头像 发表于 11-09 15:25 480次阅读
    <b class='flag-5'>TouchGFX</b>开发(2)----<b class='flag-5'>触摸屏</b>幕组件点亮LED

    101. 触摸屏按键常常点不到,客户说触摸屏反应迟钝,难道是坏了

    触摸屏
    电子学习
    发布于 :2022年12月24日 18:58:58

    Linux 系统移植(七)- 添加触摸屏驱动

    触摸屏驱动其实内核已经集成了,所以没有必要自己再去写了。这里只是介绍一下如何把驱动编入内核。内核配置如下:Device Drivers---> Input device
    发表于 01-14 17:31

    (三)STM32H7A3处理器上基于STM32CubeMX的TouchGFX应用开发-添加触摸屏

    (三)STM32H7A3处理器上基于STM32CubeMX的TouchGFX应用开发-添加触摸屏
    发表于 12-15 16:46

    STM32F429I-DISC1的触摸屏为什么无法使用TOUCHgfx生成的代码正常工作?

    简单的按钮按下项目,但是,在 STM32CUBEIDE 调试并加载此代码后,无法在此触摸屏上检测到按下。我做了很多尝试,包括将演示固件加载回我的电路板,以检查是否由于电路板损坏而出现问题,但是当我通过
    发表于 12-02 06:27

    电阻式触摸屏的基本结构和驱动原理

    电阻式触摸屏的基本结构和驱动原理:四线电阻式触摸屏的结构如上图,在玻璃或丙烯酸基板上覆盖有两层透平,均匀导电的ITO层,分别做为X电极和Y电极,它们之间由均匀排列的
    发表于 04-10 23:14 105次下载
    电阻式<b class='flag-5'>触摸屏</b>的基本结构和<b class='flag-5'>驱动</b>原理

    LM3S8962驱动触摸屏

    LM3S8962驱动触摸屏
    发表于 11-18 09:41 17次下载

    手机触摸屏驱动的研究与设计张欣

    手机触摸屏驱动的研究与设计_张欣
    发表于 03-14 08:00 6次下载

    LPC4353 TouchGFX

    LPC4353 TouchGFX触摸屏代码。
    发表于 03-17 08:18 15次下载

    Linux下的触摸屏驱动

    对于触摸屏驱动,我们主要需要掌握触摸屏驱动代码和应用层测试代码。下面讲的是基于Mini2440的触摸屏
    发表于 04-26 14:45 2242次阅读

    Android4.2触摸屏驱动与4.0有哪些不同

    本文档的主要内容详细介绍的是Android4.2触摸屏驱动与Android4.0触摸屏驱动的差别。
    发表于 07-29 17:36 1次下载
    Android4.2<b class='flag-5'>触摸屏</b><b class='flag-5'>驱动</b>与4.0有哪些不同

    如何在TouchGFX框架下实现校准电阻触摸屏?

    电阻触摸屏 3. 校准添加 电阻式触摸屏在实际应用中必须进行校准,而校准有多种方法,一种是使用TouchGFX自带的触摸屏校准,内置三点式
    的头像 发表于 01-21 10:14 3959次阅读
    如何在<b class='flag-5'>TouchGFX</b>框架下实现校准电阻<b class='flag-5'>触摸屏</b>?

    触摸屏软件如何添加图片

    触摸屏软件添加图片方法扩展标准库的应用方法。电脑上找到触摸屏编程软件 CoolMayHMI 的安装路径,默认安装在 C 盘;
    发表于 05-07 14:47 0次下载

    基于 TouchGFX 生成的代码中添加触摸功能的方法

    基于 TouchGFX 生成的代码中添加触摸功能的方法
    的头像 发表于 10-27 09:21 571次阅读
    基于 <b class='flag-5'>TouchGFX</b> 生成的代码中<b class='flag-5'>添加</b><b class='flag-5'>触摸</b>功能的方法