[STM32F4]

关于stm32的中断

[复制链接]
774|11
手机看帖
扫描二维码
随时随地手机跟帖
aaa2742|  楼主 | 2016-10-29 16:25 | 显示全部楼层 |阅读模式
STM32, TI, pi, ni, IO
本帖最后由 aaa2742 于 2016-10-29 16:28 编辑

问题是这样的:有一个光电开关,不挡光输出为5v,挡光后为0v,连接到中断引脚,测试用的PB14.光电开关是NPN型的,为了输出高电平加了一个几k的上拉。
外部中断IO的配置,我配置为下降沿触发,一般情况下外界传输到引脚为5v,某一时刻挡光后会进入中断,在中断处理函数中已经清了标记,但是我如果一直挡遮光,它会一直的进中断,不应该这样啊,挡住光后一直为低电平,没触发下降沿啊,这样岂不是成了电平触发了?
在配置上中断IO上,上拉,下拉,不拉都试过了,一直不停的进中断,哪位指点下?
初始化:
void Exit_Init()
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        NVIC_InitTypeDef   NVIC_InitStructure;
        EXTI_InitTypeDef   EXTI_InitStructure;

        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
         
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        
        
        
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource13);
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource14);
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource15);
        
        
        
        EXTI_InitStructure.EXTI_Line = EXTI_Line13;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能
    EXTI_Init(&EXTI_InitStructure);//配置
        
        EXTI_InitStructure.EXTI_Line = EXTI_Line14;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //上升沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能
    EXTI_Init(&EXTI_InitStructure);//配置
        
        EXTI_InitStructure.EXTI_Line = EXTI_Line15;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //上升沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能
    EXTI_Init(&EXTI_InitStructure);//配置
        
        
        NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;//子优先级2
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
    NVIC_Init(&NVIC_InitStructure);//配置
        
}
中断处理:
void EXTI15_10_IRQHandler(void)
{
        rt_interrupt_enter();
        if(EXTI_GetITStatus(EXTI_Line13) != RESET)//轴电机物理零点
        {
                TimerRadialStop();               
                TimerRadialSetAngle(ShiftToZeroR);
                TimerRadialStart();
                //rt_event_send(&Intevent,(1 << 3));
                EXTI_ClearITPendingBit(EXTI_Line13);
                EXTI_ClearFlag(EXTI_Line13);
                                
        }
        if(EXTI_GetITStatus(EXTI_Line14) != RESET)//径电机门限点
        {
                rt_event_send(&Intevent,(1 << 1));
                EXTI_ClearITPendingBit(EXTI_Line14);
                EXTI_ClearFlag(EXTI_Line14);
                                
        }
        if(EXTI_GetITStatus(EXTI_Line15) != RESET)//径电机零点
        {         
                rt_event_send(&Intevent,(1 << 2));
                EXTI_ClearITPendingBit(EXTI_Line15);
                EXTI_ClearFlag(EXTI_Line15);
        }

        
        rt_interrupt_leave();
}



airwill| | 2016-10-29 17:02 | 显示全部楼层
怎么感觉是低电平中断的现象呢

使用特权

评论回复
aaa2742|  楼主 | 2016-10-29 20:40 | 显示全部楼层
airwill 发表于 2016-10-29 17:02
怎么感觉是低电平中断的现象呢

是啊,但是stm32都是沿触发的,所以一直找不到哪里出问题了

使用特权

评论回复
拉普拉思| | 2016-10-30 08:20 | 显示全部楼层
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式?

使用特权

评论回复
皈依| | 2016-10-30 09:41 | 显示全部楼层
楼上可能真相了 改成复用

使用特权

评论回复
aaa2742|  楼主 | 2016-11-13 12:16 | 显示全部楼层
试了一下,改成GPIO_Mode_AF,无法进入中断。我觉的还是GPIO_Mode_IN,下面的SYSCFG_EXTILineConfig会开启复用,
还有别的肯能吗

使用特权

评论回复
aaa2742|  楼主 | 2016-11-13 14:32 | 显示全部楼层
经过查找,觉得应该是中断引脚上有毛刺,那个光开关默认是5V高电平,当被挡住时为低电平,所以程序中设置的为下降沿,如果一直挡住光,引脚上为低电平,但是低电平上又有毛刺信号,会不会导致该现象?毕竟在挡住光时不停的进中断,而不挡光时不进中断。

使用特权

评论回复
aaa2742|  楼主 | 2016-11-13 14:34 | 显示全部楼层
拉普拉思 发表于 2016-10-30 08:20
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式?

还有别的程序上的配置可能的问题么,配置也是从网上找到修改的,基本上所有的配置几乎相同。

使用特权

评论回复
heisexingqisi| | 2016-11-13 17:09 | 显示全部楼层
是不是电路有问题。一直处于中断触发的状态。

使用特权

评论回复
aaa2742|  楼主 | 2016-11-13 22:56 | 显示全部楼层
heisexingqisi 发表于 2016-11-13 17:09
是不是电路有问题。一直处于中断触发的状态。

感觉是中断引脚上有毛刺

使用特权

评论回复
zchong| | 2016-11-14 20:52 | 显示全部楼层
aaa2742 发表于 2016-11-13 22:56
感觉是中断引脚上有毛刺

别感觉,要实测

使用特权

评论回复
aaa2742|  楼主 | 2017-5-2 21:44 | 显示全部楼层
是有毛刺的,最后不用中断了,采用的是AD检测,多谢各位

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

211

帖子

1

粉丝