GT9147用中断方式读取坐标

2019-07-20 08:33发布

GT9147用中断方式读取坐标,据数据手册说,当有坐标更新时,INT引脚会输出边沿信号,我想用这个边沿信号触发stm32的外部中断,在中断当中读取坐标,从而给CPU减负。但是我配好GT9147后,当没有按触摸屏的时候就会进入3次中断服务函数(我用串口的pritntf测试的),实在搞不懂为什么,求大侠帮帮忙。





中断服务函数:
void EXTI1_IRQHandler(void)
{
                u8 A[1];

                if(EXTI_GetITStatus(EXTI_Line1)==SET)
                {
                               
                                GT9147_RD_Reg(GT_GSTID_REG,A,1);
                                if((A[0]&0x80)==0x80)
                                {
                                printf("%d ",A[0]);
                       
                                GT9147_RD_Reg(GT_TP2_REG,A,1);
                                printf("%d ",A[0]);
                       
                                A[0]=0;
                                GT9147_WR_Reg(GT_GSTID_REG,A,1);
                               
                                }

                }
                EXTI_ClearITPendingBit(EXTI_Line1);//EXTI_Line1
}



GT9147的源文件:

#include "stm32f4xx.h"
#include "delay.h"
#include "CAPTSCREEN.h"
#include "IIC_Soft.h"

//GT9147配置参数表
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配置参数
//flash:0,参数不保存到FLASH;1,参数保存到FLASH
void GT9147_Send_Cfg(u8 flash)
{
                u8 buf[2],i=0;

                buf[0]=0;
                buf[1]=flash;//是否写入到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);//写入校验和,和配置更新标记
}
//向GT9147写入一次数据
void GT9147_WR_Reg(u16 reg,u8 *buf,u8 len)
{
                u8 i;

                IIC_Send_Start();
                IIC_Send_Byte(GT_CMD_WR);//发送写命令
                IIC_Send_Byte(reg>>8);//发送高8位地址
                IIC_Send_Byte(reg&0XFF);//发送低8位地址
                for(i=0;i<len;i++)//发数据
                {
                                IIC_Send_Byte(buf[i]);
                }
                IIC_Send_Stop();//IIC总线停止
}
//从GT9147读出一次数据
void GT9147_RD_Reg(u16 reg,u8 *buf,u8 len)
{
                u8 i;

                IIC_Send_Start();
                IIC_Send_Byte(GT_CMD_WR);//发送写命令
                IIC_Send_Byte(reg>>8);//发送高8位地址
                IIC_Send_Byte(reg&0XFF);//发送低8位地址
                IIC_Send_Start();
                IIC_Send_Byte(GT_CMD_RD);//发送读命令
                for(i=0;i<len;i++)//读数据
                {
                                buf[i]=IIC_Read_Byte(i==(len-1)?0:1);
                }
                IIC_Send_Stop();//IIC总线停止
}
//初始化GT9147(设置GT9147的I2C地址)
void GT9147_Init(void)
{
                u8 temp[1];
                GPIO_InitTypeDef  GPIO_Config_Struct;
          EXTI_InitTypeDef EXTI_Config_Struct;
          NVIC_InitTypeDef NVIC_Config_Struct;

                //使能相关时钟
                RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC,ENABLE);//使能GPIOB,C时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);//使能SYSCFG时钟

                //初始化GT_INT中断引脚(PB1,先设置为输出,以便设置GT9147的I2C地址)
                GPIO_Config_Struct.GPIO_Mode=GPIO_Mode_OUT;//通用输出模式
                GPIO_Config_Struct.GPIO_OType=GPIO_OType_PP;//推挽
                GPIO_Config_Struct.GPIO_Speed=GPIO_Speed_100MHz;//100MHz
                GPIO_Config_Struct.GPIO_PuPd=GPIO_PuPd_DOWN;//下拉
                GPIO_Config_Struct.GPIO_Pin=GPIO_Pin_1;//PB1
                GPIO_Init(GPIOB,&GPIO_Config_Struct);
                GT_INT_OUT=0;
                //初始化GT_RST复位引脚(PC13)
                GPIO_Config_Struct.GPIO_Mode=GPIO_Mode_OUT;//通用输出模式
                GPIO_Config_Struct.GPIO_OType=GPIO_OType_PP;//推挽输出
                GPIO_Config_Struct.GPIO_PuPd=GPIO_PuPd_UP;//上拉
                GPIO_Config_Struct.GPIO_Speed=GPIO_Speed_100MHz;//100MHz
                GPIO_Config_Struct.GPIO_Pin=GPIO_Pin_13;//PC13
                GPIO_Init(GPIOC,&GPIO_Config_Struct);
                GT_RST=0;
                //初始化电容屏控制器GT9147的I2C总线
                IIC_Init();
                delay_ms(15);

                GT_RST=0;//硬件复位
                delay_ms(10);
                GT_RST=1;//结束硬件复位
                delay_ms(10);
       
//恢复GT_INT中断引脚(PB1)为输入浮空,同时配置外部中断线1
                delay_ms(60);
                GPIO_Config_Struct.GPIO_Mode=GPIO_Mode_IN;//输入模式
                GPIO_Config_Struct.GPIO_OType=GPIO_OType_PP;//推挽
                GPIO_Config_Struct.GPIO_Speed=GPIO_Speed_100MHz;//100MHz
                GPIO_Config_Struct.GPIO_PuPd=GPIO_PuPd_NOPULL;//浮空
                GPIO_Config_Struct.GPIO_Pin=GPIO_Pin_1;//PB1
                GPIO_Init(GPIOB,&GPIO_Config_Struct);

          //设置中断线映射,映射到中断线1
          SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,EXTI_PinSource1);
                //初始化NVIC
                NVIC_Config_Struct.NVIC_IRQChannel=EXTI1_IRQn;//选择外部中断线1的中断通道
                NVIC_Config_Struct.NVIC_IRQChannelCmd=ENABLE;//使能外部中断线1的中断通道
                NVIC_Config_Struct.NVIC_IRQChannelPreemptionPriority=2;//抢占=2
                NVIC_Config_Struct.NVIC_IRQChannelSubPriority=2;//响应=2
                NVIC_Init(&NVIC_Config_Struct);
                //使能中断前先清除一次中断标志位,防止错误进入中断服务函数
                EXTI_ClearITPendingBit(EXTI_Line1);//EXTI_Line1
                //初始化外部中断线1
          EXTI_Config_Struct.EXTI_Line=EXTI_Line1;//中断线1
          EXTI_Config_Struct.EXTI_LineCmd=ENABLE;//中断线1使能
                EXTI_Config_Struct.EXTI_Mode=EXTI_Mode_Interrupt;//中断,不是事件
          EXTI_Config_Struct.EXTI_Trigger=EXTI_Trigger_Rising;//上升沿触发
          EXTI_Init(&EXTI_Config_Struct);

                delay_ms(50);
                temp[0]=0X02;
                GT9147_WR_Reg(GT_CTRL_REG,temp,1);//软复位GT9147
                GT9147_RD_Reg(GT_CFGS_REG,temp,1);//读取GT_CFGS_REG寄存器
                if(temp[0]<0X60)//默认版本比较低,需要更新flash配置
                {
                                GT9147_Send_Cfg(1);//更新并保存配置
                }
                delay_ms(10);
                temp[0]=0X00;
                GT9147_WR_Reg(GT_CTRL_REG,temp,1);//结束软复位
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。