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

发布者:SparklingMelody最新更新时间:2024-06-18 来源: elecfans关键字:触摸屏驱动  TouchGFX 手机看文章 扫描二维码
随时随地手机看文章

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


1. STM32CubeMX配置

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

b91216f6-666c-11ee-939d-92fbcf53809c.png?imageView2/2/w/1000

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?imageView2/2/w/1000

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

b94791b4-666c-11ee-939d-92fbcf53809c.png?imageView2/2/w/1000

点击Generate Code生成TouchGFX代码

4.下载测试

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

b95e6510-666c-11ee-939d-92fbcf53809c.png?imageView2/2/w/1000


关键字:触摸屏驱动  TouchGFX 引用地址:如何添加触摸屏驱动到TouchGFX中?

上一篇:什么是模拟看门狗?模拟看门狗有什么用处?
下一篇:用面向对象思想封装IIC、AT24C64驱动

推荐阅读最新更新时间:2026-03-25 10:37

了解S3C2440触摸屏驱动的原理及其应用
一、开发环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2 二、前提知识 1、Linux输入子系统(Input Subsystem): 在Linux中,输入子系统是由输入子系统设备驱动层、输入子系统核心层(Input Core)和输入子系统事件处理层(Event Handler)组成。其中设备驱动层提供对硬件各寄存器的读写访问和将底层硬件对用户输入访问的响应转换为标准的输入事件,再通过核心层提交给事件处理层;而核心层对下提供了设备驱动层的编程接口,对上又提供了事件处理层的编程接口;而事件处理层就为我们用
[单片机]
了解S3C2440<font color='red'>触摸屏</font><font color='red'>驱动</font>的原理及其应用
mini2440触摸屏驱动----非input子系统实现方法
触摸屏的驱动程序在不是使用input子系统的实现过程中,其实和普通的字符设备驱动没有太大的差别,只要按照触摸屏那几个步骤正常进行就可以。 ①s3c2410_ts_init函数,这是整个程序的入口处。实现了各类初始化的作用。 /*设备初始化函数*/ static int __init s3c2410_ts_init(void) { int ret; tsEvent = tsEvent_dummy; /* 注册字符设备 第一个参数为0表示自动分配 */ ret = register_chrdev(0, DEVICE_NAME, &s3c2410_fops); //普通的注册失败判
[单片机]
关于mini2440触摸屏驱动设计
一.触摸屏的分类: 1、触摸屏种类、分别应用在哪里、屏和OS怎么配合使用?. 电容屏---静电感应;电阻屏---压力感应; 红外线式和感应电容式触摸屏能够支持多点触控。多点触控带来了更多的选择,抓取、拖曳、缩放、旋转。 屏要和系统搭配才能体现优势。IPHONE和android系统支持多点触控。Windows mobiles不支持多点触控。 2,触摸屏实现原理,功能实现出来(点一下触摸屏得到对应点的像素值)。总结实现原理。 触摸屏的坐标值和LCD的像素不是一比一的关系。且原点可能不是同一个角。 触摸屏校验2种方式:第一是4点式(2点式)。第二种三点式。 二.下面是SONY(320*240)的屏.
[单片机]
关于mini2440<font color='red'>触摸屏</font><font color='red'>驱动</font>设计
12.触摸屏驱动
触摸屏子系统是通过input子系统来实现,对应设备节点 /dev/input/eventn,熟悉套路后重点放在硬件程序的编写 一、内核自带触摸屏驱动S3c2410_ts的简单分析 S3c2410_ts.c (driversinputtouchscreen) 内核自带三星的触摸屏驱动 (1)入口函数: /*注册一个平台driver*/static int __init s3c2410ts_init(void){// init_MUTEX(&gADClock); returnplatform_driver_register(&s3c2410ts_driver);} (2)platform_driver结构体 stat
[单片机]
嵌入式在触摸屏驱动程序中的应用
简介:CE系统与其它操作系统一样,也提供了设备驱动程序。以驱动内部或者外围硬件设备。驱动程序将操作系统和设备链接起来,使得操作系统能够识别设备,并为应用程序提供相应的服务。要想真正了解驱动程序必须结合一些驱动程序的实际开发。本文以基于ARM9核心硬件平台的触摸屏驱动程序为例,讲解如何在不同的硬件设备上实现Windows CE的驱动开发。 引言 Windows CE.NET是一个抢先式多任务并具有强大通信能力的Windows 32位嵌入式操作系统,是微软专门为信息设备、移动应用、消费类电子产品、嵌入式应用等非PC领域而从头设计的战略性操作系统产品。可以看出Windows CE并不是Windows桌面操作系统的一部分或缩减版本
[单片机]
嵌入式在<font color='red'>触摸屏</font><font color='red'>驱动</font>程序中的应用
FSMC驱动TFT显示屏(和驱动触摸屏
我所使用的是3.5寸电容触摸显示屏 所谓电容触摸显示屏其实是两个屏幕的叠加: 显示屏,其驱动芯片为ILI9488。 触摸屏,其驱动芯片为FT6336 一、显示屏 首先驱动显示屏,买到屏幕之后问卖家拿到驱动程序、原理图和技术文档。 这个屏幕有七种驱动方式: 表一 TFT驱动方式 TFT几种接口: MCU接口所用引脚:/RES , /CS , RS(寄存器选择) , /WR , /RD , DB0 ~ DB17 (18bit) RGB接口所用引脚:DE , VSYNC , HSYNC , PCLK , R0~R5 , G0~G5 , B0~B5 (18bit) (RGB接口和MPU接口区别) SPI接口所用引脚:/RST、
[单片机]
FSMC<font color='red'>驱动</font>TFT显示屏(和<font color='red'>驱动</font><font color='red'>触摸屏</font>)
Linux操作系统中触摸屏控制器驱动程序设计的编程方法
在便携式的电子类产品中,触摸屏由于其便、灵活、占用空间少等优点,已经逐渐取代键盘成为嵌入式计算机系统常选用的人机交互输入设备。触摸屏输入系统由触摸屏、触摸屏控制器、微控制器及其相应的驱动程序构成。本文从触摸屏控制器的驱动程序设计着手,介绍触摸屏控制器ADS7843的内部结构及工作原理和在嵌入式Linux操作系统中基于PXA255微处理器的ADS7843驱动程序设计 1、触摸屏控制器ADS7843的介绍 1.1 ADS7843的内部结构 ADS7843 内驻一个多路低导通电阻模拟开关组成的供电-测量电路网络、12bit逐次逼近A/D转换器和异步串行数据输入输出,ADS7843根据微控制器发来的不同测量命令导通相应
[单片机]
Linux操作系统中<font color='red'>触摸屏</font>控制器<font color='red'>驱动</font>程序设计的编程方法
S3C2440上触摸屏驱动
建立触摸屏驱动程序my2440_ts.c,首先实现加载和卸载部分,在驱动加载部分,我们主要做的事情是:启用ADC所需要的时钟、映射IO口、初始化寄存器、申请中断、初始化输入设备、将输入设备注册到输入子系统。代码如下: #include linux/module.h #include linux/kernel.h #include linux/clk.h #include linux/init.h #include linux/input.h #include linux/serio.h #include plat/regs-adc.h #include asm/irq.h #include asm/io.h /*用于保存从平台时
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved