STM32407用汇顶的GT911触摸芯片调试实盘

2024-01-16 14:44

本文主要是介绍STM32407用汇顶的GT911触摸芯片调试实盘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这个配置很关键

代码

#include "stm32f4xx.h"                 
#include "GT9147.h"
#include "Touch.h"
#include "C_Touch_I2C.h"
#include "usart.h"
#include "delay.h"
#include "LCD.h"
#include "string.h"//GT9147配置参数表
//第一个字节为版本号(0X60),必须保证新的版本号大于等于GT9147内部
//flash原有版本号,才会更新配置.
const u8 GT9147_CFG_TBL[]=
{ 0X60,0XE0,0X01,0X20,0X03,0X05,0X35,0X00,0X02,0X08,0X1E,0X08,0X50,0X3C,0X0F,0X05,0X00,0X00,0XFF,0X67,0X50,0X00,0X00,0X18,0X1A,0X1E,0X14,0X89,0X28,0X0A,0X30,0X2E,0XBB,0X0A,0X03,0X00,0X00,0X02,0X33,0X1D,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X32,0X00,0X00,0X2A,0X1C,0X5A,0X94,0XC5,0X02,0X07,0X00,0X00,0X00,0XB5,0X1F,0X00,0X90,0X28,0X00,0X77,0X32,0X00,0X62,0X3F,0X00,0X52,0X50,0X00,0X52,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0X0F,0X03,0X06,0X10,0X42,0XF8,0X0F,0X14,0X00,0X00,0X00,0X00,0X1A,0X18,0X16,0X14,0X12,0X10,0X0E,0X0C,0X0A,0X08,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X29,0X28,0X24,0X22,0X20,0X1F,0X1E,0X1D,0X0E,0X0C,0X0A,0X08,0X06,0X05,0X04,0X02,0X00,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
};  
//发送GT9147配置参数
//mode:0,参数不保存到flash
//     1,参数保存到flash
u8 GT9147_Send_Cfg(u8 mode)
{u8 buf[2];u8 i=0;buf[0]=0;buf[1]=mode;	//是否写入到GT9147 FLASH?  即是否掉电保存for(i=0;i<sizeof(GT9147_CFG_TBL);i++)buf[0]+=GT9147_CFG_TBL[i];//计算校验和buf[0]=(~buf[0])+1;GT9147_WR_Reg(GT_CFGS_REG,(u8*)GT9147_CFG_TBL,sizeof(GT9147_CFG_TBL));//发送寄存器配置GT9147_WR_Reg(GT_CHECK_REG,buf,2);//写入校验和,和配置更新标记return 0;
} 
//向GT9147写入一次数据
//reg:起始寄存器地址
//buf:数据缓缓存区
//len:写数据长度
//返回值:0,成功;1,失败.
u8 GT9147_WR_Reg(u16 reg,u8 *buf,u8 len)
{u8 i;u8 ret=0;Touch_IIC_Start();	Touch_IIC_Send_Byte(GT_CMD_WR);   	//发送写命令 	 Touch_IIC_Wait_Ack();Touch_IIC_Send_Byte(reg>>8);   	//发送高8位地址Touch_IIC_Wait_Ack(); 	 										  		   Touch_IIC_Send_Byte(reg&0XFF);   	//发送低8位地址Touch_IIC_Wait_Ack();  for(i=0;i<len;i++){	   Touch_IIC_Send_Byte(buf[i]);  	//发数据ret=Touch_IIC_Wait_Ack();if(ret)break;  }Touch_IIC_Stop();					//产生一个停止条件	    return ret; 
}
//从GT9147读出一次数据
//reg:起始寄存器地址
//buf:数据缓缓存区
//len:读数据长度			  
void GT9147_RD_Reg(u16 reg,u8 *buf,u8 len)
{u8 i; Touch_IIC_Start();	Touch_IIC_Send_Byte(GT_CMD_WR);   //发送写命令 	 Touch_IIC_Wait_Ack();Touch_IIC_Send_Byte(reg>>8);   	//发送高8位地址Touch_IIC_Wait_Ack(); 	 										  		   Touch_IIC_Send_Byte(reg&0XFF);   	//发送低8位地址Touch_IIC_Wait_Ack();  Touch_IIC_Start();  	 	   Touch_IIC_Send_Byte(GT_CMD_RD);   //发送读命令		   Touch_IIC_Wait_Ack();	   for(i=0;i<len;i++){	   buf[i]=Touch_IIC_Read_Byte(i==(len-1)?0:1); //发数据	  } Touch_IIC_Stop();//产生一个停止条件    
} 
//初始化GT9147触摸屏
//返回值:0,初始化成功;1,初始化失败 
u8 GT9147_Init(void)
{u8 temp[5]; GPIO_InitTypeDef  GPIO_InitStructure;	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC, ENABLE);//使能GPIOB,C时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 ;//PB1设置为上拉输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;//PC13设置为推挽输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出模式GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化	Touch_IIC_Init();      	//初始化电容屏的I2C总线  GT_RST=0;				//复位delay_ms(10);GT_RST=1;				//释放复位		    delay_ms(10); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//PB1设置为浮空输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出模式GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化	delay_ms(100);  GT9147_RD_Reg(GT_PID_REG,temp,4);//读取产品IDtemp[4]=0;printf("CTP ID:%s\r\n",temp);	//打印IDif(strcmp((char*)temp,"9147")==0)//ID==9147{temp[0]=0X02;			GT9147_WR_Reg(GT_CTRL_REG,temp,1);//软复位GT9147GT9147_RD_Reg(GT_CFGS_REG,temp,1);//读取GT_CFGS_REG寄存器if(temp[0]<0X60)//默认版本比较低,需要更新flash配置{printf("Default Ver:%d\r\n",temp[0]);GT9147_Send_Cfg(1);//更新并保存配置}delay_ms(10);temp[0]=0X00;	 GT9147_WR_Reg(GT_CTRL_REG,temp,1);//结束复位   return 0;} return 0;
}
const u16 GT9147_TPX_TBL[5]={GT_TP1_REG,GT_TP2_REG,GT_TP3_REG,GT_TP4_REG,GT_TP5_REG};
//扫描触摸屏(采用查询方式)
//mode:0,正常扫描.
//返回值:当前触屏状态.
//0,触屏无触摸;1,触屏有触摸
u8 GT9147_Scan(u8 mode)
{u8 buf[4];u8 i=0;u8 res=0;u8 temp;u8 tempsta;static u8 t=0;//控制查询间隔,从而降低CPU占用率   t++;if((t%10)==0||t<10)//空闲时,每进入10次CTP_Scan函数才检测1次,从而节省CPU使用率{GT9147_RD_Reg(GT_GSTID_REG,&mode,1);	//读取触摸点的状态  temp=0;GT9147_WR_Reg(GT_GSTID_REG,&temp,1);//清标志 			if((mode&0XF)&&((mode&0XF)<6)){temp=0XFF<<(mode&0XF);		//将点的个数转换为1的位数,匹配tp_dev.sta定义 tempsta=tp_dev.sta;			//保存当前的tp_dev.sta值tp_dev.sta=(~temp)|TP_PRES_DOWN|TP_CATH_PRES; tp_dev.x[4]=tp_dev.x[0];	//保存触点0的数据tp_dev.y[4]=tp_dev.y[0];for(i=0;i<5;i++){if(tp_dev.sta&(1<<i))	//触摸有效?{GT9147_RD_Reg(GT9147_TPX_TBL[i],buf,4);	//读取XY坐标值if(tp_dev.touchtype&0X01)//横屏{tp_dev.y[i]=((u16)buf[1]<<8)+buf[0];tp_dev.x[i]=800-(((u16)buf[3]<<8)+buf[2]);}else{tp_dev.x[i]=((u16)buf[1]<<8)+buf[0];tp_dev.y[i]=((u16)buf[3]<<8)+buf[2];}  //printf("x[%d]:%d,y[%d]:%d\r\n",i,tp_dev.x[i],i,tp_dev.y[i]);}			} res=1;if(tp_dev.x[0]>lcddev.width||tp_dev.y[0]>lcddev.height)//非法数据(坐标超出了){ if((mode&0XF)>1)		//有其他点有数据,则复第二个触点的数据到第一个触点.{tp_dev.x[0]=tp_dev.x[1];tp_dev.y[0]=tp_dev.y[1];t=0;				//触发一次,则会最少连续监测10次,从而提高命中率}else					//非法数据,则忽略此次数据(还原原来的)  {tp_dev.x[0]=tp_dev.x[4];tp_dev.y[0]=tp_dev.y[4];mode=0X80;		tp_dev.sta=tempsta;	//恢复tp_dev.sta}}else t=0;					//触发一次,则会最少连续监测10次,从而提高命中率}}if((mode&0X8F)==0X80)//无触摸点按下{ if(tp_dev.sta&TP_PRES_DOWN)	//之前是被按下的{tp_dev.sta&=~(1<<7);	//标记按键松开}tp_dev.x[0]=0xffff;tp_dev.y[0]=0xffff;tp_dev.sta&=0XE0;	//清除点有效标记	} 	if(t>240)t=10;//重新从10开始计数return res;
}

代码参考她的就行

STM32F4_触摸屏_触摸屏驱动-CSDN博客

这篇关于STM32407用汇顶的GT911触摸芯片调试实盘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/612925

相关文章

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

vscode中文乱码问题,注释,终端,调试乱码一劳永逸版

忘记咋回事突然出现了乱码问题,很多方法都试了,注释乱码解决了,终端又乱码,调试窗口也乱码,最后经过本人不懈努力,终于全部解决了,现在分享给大家我的方法。 乱码的原因是各个地方用的编码格式不统一,所以把他们设成统一的utf8. 1.电脑的编码格式 开始-设置-时间和语言-语言和区域 管理语言设置-更改系统区域设置-勾选Bata版:使用utf8-确定-然后按指示重启 2.vscode

起点中文网防止网页调试的代码展示

起点中文网对爬虫非常敏感。如图,想在页面启用调试后会显示“已在调试程序中暂停”。 选择停用断点并继续运行后会造成cpu占用率升高电脑卡顿。 经简单分析网站使用了js代码用于防止调试并在强制继续运行后造成电脑卡顿,代码如下: function A(A, B) {if (null != B && "undefined" != typeof Symbol && B[Symbol.hasInstan

php 7之PhpStorm + Nginx + Xdebug运行调试

操作环境: windows PHP 7.1.10 PhpStorm-2017.2.4 Xdebug 2.5.4 Xdebug helper 1.6.1 nginx-1.12.2 注意查看端口占用情况 netstat -ano //查看所以端口netstat -aon|findstr "80" //查看指定端口占用情况 比如80端口查询情况 TCP 0.0.0.0:8

【2025】基于Python的空气质量综合分析系统的设计与实现(源码+文档+调试+答疑)

博主介绍:     ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W+粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台的优质作者。通过长期分享和实战指导,我致力于帮助更多学生完成毕业项目和技术提升。 技术范围:     我熟悉的技术领域涵盖SpringBoot、Vue、SSM、HLMT

VS Code 调试go程序的相关配置说明

用 VS code 调试Go程序需要在.vscode/launch.json文件中增加如下配置:  // launch.json{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information,