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;//计算校验和
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);
}
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=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);//结束软复位
} |