使用STM32CubeMX移植TouchGFX一文中介紹了如何用TouchGFX點(diǎn)亮屏幕,但是此時(shí)屏幕還沒有觸摸的功能。下面將介紹如何添加觸摸屏驅(qū)動(dòng)到TouchGFX中
1. STM32CubeMX配置
在使用STM32CubeMX移植TouchGFX文中的STM32CubeMX配置基礎(chǔ)上,再激活一個(gè)定時(shí)器,用來給IIC通信提供微秒(us)延時(shí)。本文通過軟件來模擬IIC通信,因此不使用STM32CubeMX來進(jìn)行IIC配置
本文中的RGB (800 * 480)屏觸摸驅(qū)動(dòng)IC為FT5206芯片,該驅(qū)動(dòng)芯片通過 4 根線與外部連接:CT_RST(PI8), CT_INT(PH7), CT_SDA(PI3), CT_SCL(PH6)。由于通過軟件來模擬IIC通信,因此不使用STM32CubeMX來進(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;i dir){ 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工程中,編譯無誤后,下載到開發(fā)板中。點(diǎn)擊屏幕上的按鈕,若屏幕背景色由黑色變?yōu)榘咨f明點(diǎn)擊成功,觸摸驅(qū)動(dòng)添加成功
? ?
審核編輯:劉清
-
觸摸屏
+關(guān)注
關(guān)注
42文章
2316瀏覽量
116765 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3255瀏覽量
115369 -
TouchGFX
+關(guān)注
關(guān)注
1文章
42瀏覽量
13283 -
stm32cubemx
+關(guān)注
關(guān)注
5文章
284瀏覽量
15002 -
IIC通信
+關(guān)注
關(guān)注
0文章
19瀏覽量
3056
原文標(biāo)題:TouchGFX界面開發(fā) | 添加觸摸屏驅(qū)動(dòng)
文章出處:【微信號(hào):嵌入式攻城獅,微信公眾號(hào):嵌入式攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論