使用STM32CubeMX移植TouchGFX一文中介绍了如何用TouchGFX点亮屏幕,但是此时屏幕还没有触摸的功能。下面将介绍如何添加触摸屏驱动到TouchGFX中
1. STM32CubeMX配置
在使用STM32CubeMX移植TouchGFX文中的STM32CubeMX配置基础上,再激活一个定时器,用来给IIC通信提供微秒(us)延时。本文通过软件来模拟IIC通信,因此不使用STM32CubeMX来进行IIC配置
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); #endifIIC通信源文件:在工程中添加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中
#includeextern"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作为背景

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

点击Generate Code生成TouchGFX代码
4.下载测试
回到Keil工程中,编译无误后,下载到开发板中。点击屏幕上的按钮,若屏幕背景色由黑色变为白色,说明点击成功,触摸驱动添加成功
审核编辑:刘清
-
触摸屏
+关注
关注
42文章
2439浏览量
120936 -
定时器
+关注
关注
23文章
3360浏览量
121740 -
TouchGFX
+关注
关注
1文章
42浏览量
14134 -
stm32cubemx
+关注
关注
5文章
287浏览量
17147 -
IIC通信
+关注
关注
0文章
19浏览量
3270
原文标题:TouchGFX界面开发 | 添加触摸屏驱动
文章出处:【微信号:嵌入式攻城狮,微信公众号:嵌入式攻城狮】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
C8051F020触摸屏驱动控制

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