|
如题,请各位大佬看一下我的代码,我的外部中断触发接了四个信号,给低电平就让灯亮,此时要是同时触发外部中断的任意两个就会导致有时候只亮一个,有时候又会同时都亮,求各位大佬给个解决办法
void vEXTIX_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
// IO 及 外部中断 时钟配置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //使能SYSCFG时钟,外部中断时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE); //使能GPIOE时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 ; //GPIOE0-6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //普通输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100M
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化GPIOE0-6
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2); //PD9 连接到中断线3
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3); //PD10 连接到中断线4
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4); //PD11 连接到中断线4
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource5); //PD12 连接到中断线4
/* 配置EXTI_Line0,1,2,3,4,5,6 */
EXTI_InitStructure.EXTI_Line = EXTI_Line2 | EXTI_Line3 | EXTI_Line4 | EXTI_Line5;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断事件
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //中断线使能
EXTI_Init(&EXTI_InitStructure); //配置
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //外部中断0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03; //抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure); //配置
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //外部中断1
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03; //抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure); //配置
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03; //抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; //外部中断2
NVIC_Init(&NVIC_InitStructure); //配置
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03; //抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //外部中断3
NVIC_Init(&NVIC_InitStructure); //配置
}
//外部中断0 通道1触发引脚
void EXTI4_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line4)!=RESET)
{
EXTI_ClearITPendingBit(EXTI_Line4); //清除LINE0上的中断标志位
pinState[0]= GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4);
if(pinState[0])
{
TRIG_flag=5;
}
else
{
TRIG_flag=2;
}
}
}
//外部中断1 通道1触发引脚
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line5)!=RESET)//判断LINE5的中断是否发生
{
EXTI_ClearITPendingBit(EXTI_Line5);//清除LINE5上的中断标志位
pinState[1]= GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_5);
if(pinState[1])
{
TRIG_flag=6;
}
else
{
TRIG_flag=1;
}
}
}
//外部中断2 通道1触发引脚
void EXTI2_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line2)!=RESET)//判断LINE5的中断是否发生
{
EXTI_ClearITPendingBit(EXTI_Line2);//清除LINE5上的中断标志位
pinState[2]= GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2);
if(pinState[2])
{
TRIG_flag=7;
}
else
{
TRIG_flag=4;
}
}
}
//外部中断3 通道1触发引脚
void EXTI3_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line3)!=RESET)//判断LINE5的中断是否发生
{
EXTI_ClearITPendingBit(EXTI_Line3);//清除LINE5上的中断标志位
pinState[3]= GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3);
if(pinState[3])
{
TRIG_flag=8;
}
else
{
TRIG_flag=3;
}
}
}
|
|