OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3961|回复: 3

stm32 f429 核心板+gt911 触摸屏 触摸时而不灵

[复制链接]

12

主题

22

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2018-7-9
在线时间
23 小时
发表于 2022-2-28 15:26:32 | 显示全部楼层 |阅读模式
stm32 f429 核心板+gt911 触摸屏
jlink 更新程序启动之后(没有动触摸屏那块代码),偶尔会遇到触摸不灵,表现为:红色代码部分不打印。
短时间的断电重启,无法恢复正常。
有两种方法可以恢复:
1.把核心板拔下来,让他凉会儿,再插上,可以恢复正常。
2.断电等好久,才能恢复。

请教大佬,这是个什么情况??

u8 GT911_Scan(u8 mode)
{
        u8 buf[4];
        u8 i = 0;
        u8 res = 0;
        u8 temp;
        static u8 t = 0;                                                                //控制查询间隔,从而降低CPU占用率   
       
        t++;
        if((t%10)==0||t<10)                                                                //空闲时,每进入10次CTP_Scan函数才检测1次,从而节省CPU使用率
        {
                GT911_RD_Reg(GT911_GSTID_REG, &mode, 1);        //读取触摸点的状态  
               
                if((mode&0X80)&&((mode&0XF)<6))
                {
                        temp=0;
                        GT911_WR_Reg(GT_GSTID_REG,&temp,1);                //清标志
                }               

                if((mode&0X80)&&(mode&0XF)&&((mode&0XF)<6))
                {
                        temp=0XFF<<(mode&0XF);                                        //将点的个数转换为1的位数,匹配tp_dev.sta定义
                        tp_dev.sta=(~temp)|TP_PRES_DOWN|TP_CATH_PRES;
                        for(i=0;i<5;i++)
                        {
                                if(tp_dev.sta&(1<<i))                                //触摸有效?
                                {
                                        PowdownAndLogoutStart();//重新开启自动关机和注销功能
                                       
                                        GT911_RD_Reg(GT911_TPX_TBL,buf,4);                                //读取XY坐标值

                                        if(tp_dev.touchtype&0X01)//横屏                                                       
                                        {
                                                tp_dev.x=(((u16)(buf[1]&0X0F)<<8)+buf[0]);        //lcddev.width-
                                                tp_dev.y=((u16)(buf[3]&0X0F)<<8)+buf[2];
                                        }
                                        else
                                        {
                                                tp_dev.y=((u16)(buf[1]&0X0F)<<8)+buf[0];
                                                tp_dev.x=((u16)(buf[3]&0X0F)<<8)+buf[2];
                                        }
                                        printf("touch [%d,%d]\n",tp_dev.x,tp_dev.y);
                                }                       
                        }
                        res=1;

//                        if(tp_dev.x[0]>lcddev.width||tp_dev.y[0]>lcddev.height)                        //非法数据(坐标超出了)
                        if(tp_dev.x[0]>600||tp_dev.y[0]>1024)         //非法数据(坐标超出了)
                        {
                                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 = temp;                                //恢复tp_dev.sta
                                }
                        }
                        else
                        {
                                t=0;                                                                //触发一次,则会最少连续监测10次,从而提高命中率
                        }
                }
        }
       
        if((mode&0X8F)==0X80)                                                        //无触摸点按下
        {
                if(tp_dev.sta&TP_PRES_DOWN)                                        //之前是被按下的
                {
                        tp_dev.sta&=~(1<<7);                                        //标记按键松开
                }
                else                                                                                //之前就没有被按下
                {
                        tp_dev.x[0]=0xffff;
                        tp_dev.y[0]=0xffff;
                        tp_dev.sta&=0XE0;                                                //清除点有效标记       
                }         
        }        
        if(t>240)
        {
                t=10;                                                                                 //重新从10开始计数
        }
        return res;
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

22

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2018-7-9
在线时间
23 小时
 楼主| 发表于 2022-2-28 15:37:50 | 显示全部楼层
给我的直觉是断电之后电容放完电,才能恢复正常。
回复 支持 反对

使用道具 举报

12

主题

22

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2018-7-9
在线时间
23 小时
 楼主| 发表于 2022-2-28 19:57:56 | 显示全部楼层
我发现即使是不断电,过了15分钟左右,他也能恢复
回复 支持 反对

使用道具 举报

12

主题

22

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2018-7-9
在线时间
23 小时
 楼主| 发表于 2022-3-2 13:43:33 | 显示全部楼层
解决了,记录一下:在软件复位之后,将触摸屏的配置数据全部打印出来就OK了。可能等效为延时。具体原因不详,先这么样吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 03:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表