使用STM32CubeMX移植TouchGFX一文中介紹了如何用TouchGFX點(diǎn)亮屏幕,但是此時(shí)屏幕還沒(méi)有觸摸的功能。下面將介紹如何添加觸摸屏驅(qū)動(dòng)到TouchGFX中
1. STM32CubeMX配置
	在使用STM32CubeMX移植TouchGFX文中的STM32CubeMX配置基礎(chǔ)上,再激活一個(gè)定時(shí)器,用來(lái)給IIC通信提供微秒(us)延時(shí)。本文通過(guò)軟件來(lái)模擬IIC通信,因此不使用STM32CubeMX來(lái)進(jìn)行IIC配置
2.KEIL中添加觸摸芯片驅(qū)動(dòng)
本文中的RGB (800 * 480)屏觸摸驅(qū)動(dòng)IC為FT5206芯片,該驅(qū)動(dòng)芯片通過(guò) 4 根線與外部連接:CT_RST(PI8), CT_INT(PH7), CT_SDA(PI3), CT_SCL(PH6)。由于通過(guò)軟件來(lái)模擬IIC通信,因此不使用STM32CubeMX來(lái)進(jìn)行配置
2.1添加微秒延時(shí)函數(shù)
在自動(dòng)生成的tim.c文件中添加微秒延時(shí)函數(shù),并在tim.h中聲明
voiddelay_us(uint16_tus)
{
uint16_tdiffer=0xffff-us-5;
__HAL_TIM_SET_COUNTER(&htim6,differ);
HAL_TIM_Base_Start(&htim6);
while(differ0xffff?-?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芯片驅(qū)動(dòng)
在工程中添加FT5206芯片驅(qū)動(dòng)頭文件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芯片驅(qū)動(dòng)文件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將觸摸驅(qū)動(dòng)添加到TouchGFX中
將觸摸驅(qū)動(dòng)添加到觸摸控制文件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中添加點(diǎn)擊事件
在TouchGFX Designer中,創(chuàng)建一個(gè)按鈕,實(shí)現(xiàn)點(diǎn)擊后背景變色的功能 添加一個(gè)圖標(biāo)按鈕,同時(shí)添加一個(gè)box作為背景
	
添加交互動(dòng)作:實(shí)現(xiàn)點(diǎn)擊圖標(biāo)按鈕,背景顏色由黑色變?yōu)榘咨?/p>
	
點(diǎn)擊Generate Code生成TouchGFX代碼
4.下載測(cè)試
回到Keil工程中,編譯無(wú)誤后,下載到開(kāi)發(fā)板中。點(diǎn)擊屏幕上的按鈕,若屏幕背景色由黑色變?yōu)榘咨?,說(shuō)明點(diǎn)擊成功,觸摸驅(qū)動(dòng)添加成功
	
 ? ?
	
	審核編輯:劉清
- 
                                觸摸屏
                                +關(guān)注
關(guān)注
42文章
2422瀏覽量
120493 - 
                                定時(shí)器
                                +關(guān)注
關(guān)注
23文章
3350瀏覽量
121390 - 
                                TouchGFX
                                +關(guān)注
關(guān)注
1文章
42瀏覽量
14058 - 
                                stm32cubemx
                                +關(guān)注
關(guān)注
5文章
287瀏覽量
17013 - 
                                IIC通信
                                +關(guān)注
關(guān)注
0文章
19瀏覽量
3254 
原文標(biāo)題:TouchGFX界面開(kāi)發(fā) | 添加觸摸屏驅(qū)動(dòng)
文章出處:【微信號(hào):嵌入式攻城獅,微信公眾號(hào):嵌入式攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
TouchGFX開(kāi)發(fā)(2)----觸摸屏幕組件點(diǎn)亮LED
    
C8051F020觸摸屏驅(qū)動(dòng)控制
    
電阻式觸摸屏,什么是電阻式觸摸屏
組態(tài)王和觸摸屏哪個(gè)好_組態(tài)王和觸摸屏區(qū)別
Linux下的觸摸屏驅(qū)動(dòng)
Android4.2觸摸屏驅(qū)動(dòng)與4.0有哪些不同
    
觸摸屏電容屏原理_觸摸屏有哪些應(yīng)用領(lǐng)域
如何在TouchGFX框架下實(shí)現(xiàn)校準(zhǔn)電阻觸摸屏?
    
          
        
        
如何添加觸摸屏驅(qū)動(dòng)到TouchGFX中?
                
 
    
           
            
            
                
            
評(píng)論