硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1142|回复: 2
收起左侧

[STM32CubeF4] f407中断问题

[复制链接]

9

主题

36

回帖

63

积分

初级会员

积分
63
发表于 2024-8-30 18:06:05 | 显示全部楼层 |阅读模式
如题,请各位大佬看一下我的代码,我的外部中断触发接了四个信号,给低电平就让灯亮,此时要是同时触发外部中断的任意两个就会导致有时候只亮一个,有时候又会同时都亮,求各位大佬给个解决办法


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;
        }
    }
}


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-8-31 10:17:29 | 显示全部楼层
可能你的触发信号有抖动。
回复

使用道具 举报

9

主题

36

回帖

63

积分

初级会员

积分
63
 楼主| 发表于 2024-8-31 13:30:51 | 显示全部楼层
eric2013 发表于 2024-8-31 10:17
可能你的触发信号有抖动。

嗯嗯,现在在PLC端加了1ms延时就不会了
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 02:48 , Processed in 0.039122 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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