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

    文章

    2285

    浏览量

    115841
  • 定时器
    +关注

    关注

    23

    文章

    3234

    浏览量

    114360
  • TouchGFX
    +关注

    关注

    1

    文章

    42

    浏览量

    13196
  • stm32cubemx
    +关注

    关注

    5

    文章

    280

    浏览量

    14733
  • IIC通信
    +关注

    关注

    0

    文章

    19

    浏览量

    3001

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    C8051F020触摸屏驱动控制

    C8051F020触摸屏驱动控制 目前触摸屏和液晶已成为嵌入式计算机系统常用的输入输出设备。触摸屏分为电阻、电容、表面声波、红外线扫描和
    发表于 11-11 09:22 1688次阅读
    C8051F020<b class='flag-5'>触摸屏</b><b class='flag-5'>驱动</b>控制

    电阻式触摸屏,什么是电阻式触摸屏

    电阻式触摸屏,什么是电阻式触摸屏   这种触摸屏利用压力感应进行控制。电阻触摸屏的主要部分是一块与显示器表面非常配合的电
    发表于 03-24 11:02 5446次阅读

    触摸屏的性能有哪些?

    触摸屏的性能有哪些? 触摸屏的性能比较     电阻式触摸屏工作在与外界完全隔离的环境
    发表于 03-24 11:12 1507次阅读

    什么是电容触摸屏

    什么是电容触摸屏 电容触摸屏图片 电容触摸屏的英文名称the introduction of Capa
    发表于 04-30 08:54 2082次阅读

    LPC4353 TouchGFX

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

    组态王和触摸屏哪个好_组态王和触摸屏区别

    现在组态软件和触摸屏都是市场上边较成熟的产品,组态软件的出现并没有取代触摸屏触摸屏触摸屏的优势,组态软件有组态软件的特点。组态软件和触摸屏
    发表于 11-29 17:11 3.5w次阅读

    Linux下的触摸屏驱动

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

    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有哪些不同

    触摸屏电容原理_触摸屏有哪些应用领域

    触摸屏是目前最友好的计算机用户接口界面,在消费电子产品的应用越来越广泛,触摸检测好装置和触摸屏控制器,触摸屏装置过程对检测装置的机械结构造
    发表于 06-26 16:59 2544次阅读

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

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

    触摸屏电容的原理,触摸屏有哪些应用领域

    瑞翔数码触摸屏电容原理 触摸屏是目前最友好的计算机用户接口界面,在消费电子产品的应用越来越广泛,触摸检测好装置和触摸屏控制器,
    发表于 03-18 17:24 2983次阅读

    触摸屏软件如何添加图片

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

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

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

    电容触摸屏原理 电容触摸屏和电阻触摸屏有什么区别

    电容触摸屏和电阻触摸屏是两种常见的触摸屏技术,它们在原理、结构和应用方面都有很大的区别。下面将详细介绍电容触摸屏的原理、结构和特点,并与电阻触摸屏
    的头像 发表于 01-22 16:13 3869次阅读