使用STM32CubeMX移植TouchGFX一文中介绍了如何用TouchGFX点亮屏幕,但是此时屏幕还没有触摸的功能。下面将介绍如何添加触摸屏驱动到TouchGFX中
1. STM32CubeMX配置
在使用STM32CubeMX移植TouchGFX文中的STM32CubeMX配置基础上,再激活一个定时器,用来给IIC通信提供微秒(us)延时。本文通过软件来模拟IIC通信,因此不使用STM32CubeMX来进行IIC配置
本文中的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;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将触摸驱动添加到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文章
2285浏览量
115841 -
定时器
+关注
关注
23文章
3234浏览量
114360 -
TouchGFX
+关注
关注
1文章
42浏览量
13196 -
stm32cubemx
+关注
关注
5文章
280浏览量
14733 -
IIC通信
+关注
关注
0文章
19浏览量
3001
原文标题:TouchGFX界面开发 | 添加触摸屏驱动
文章出处:【微信号:嵌入式攻城狮,微信公众号:嵌入式攻城狮】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论