[STM32F4] 关于stm32的中断

[复制链接]
1105|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上,上拉,下拉,不拉都试过了,一直不停的进中断,哪位指点下?
初始化:
  1. void Exit_Init()
  2. {
  3.         GPIO_InitTypeDef  GPIO_InitStructure;
  4.         NVIC_InitTypeDef   NVIC_InitStructure;
  5.         EXTI_InitTypeDef   EXTI_InitStructure;

  6.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟
  8.         
  9.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
  11.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  12.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
  13.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  14.          
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15;
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  18.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  19.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  20.         
  21.         
  22.         
  23.         SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource13);
  24.         SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource14);
  25.         SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource15);
  26.         
  27.         
  28.         
  29.         EXTI_InitStructure.EXTI_Line = EXTI_Line13;
  30.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
  31.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
  32.     EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能
  33.     EXTI_Init(&EXTI_InitStructure);//配置
  34.         
  35.         EXTI_InitStructure.EXTI_Line = EXTI_Line14;
  36.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
  37.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //上升沿触发
  38.     EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能
  39.     EXTI_Init(&EXTI_InitStructure);//配置
  40.         
  41.         EXTI_InitStructure.EXTI_Line = EXTI_Line15;
  42.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
  43.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //上升沿触发
  44.     EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能
  45.     EXTI_Init(&EXTI_InitStructure);//配置
  46.         
  47.         
  48.         NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
  49.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2
  50.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;//子优先级2
  51.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  52.     NVIC_Init(&NVIC_InitStructure);//配置
  53.         
  54. }
中断处理:
  1. void EXTI15_10_IRQHandler(void)
  2. {
  3.         rt_interrupt_enter();
  4.         if(EXTI_GetITStatus(EXTI_Line13) != RESET)//轴电机物理零点
  5.         {
  6.                 TimerRadialStop();               
  7.                 TimerRadialSetAngle(ShiftToZeroR);
  8.                 TimerRadialStart();
  9.                 //rt_event_send(&Intevent,(1 << 3));
  10.                 EXTI_ClearITPendingBit(EXTI_Line13);
  11.                 EXTI_ClearFlag(EXTI_Line13);
  12.                                 
  13.         }
  14.         if(EXTI_GetITStatus(EXTI_Line14) != RESET)//径电机门限点
  15.         {
  16.                 rt_event_send(&Intevent,(1 << 1));
  17.                 EXTI_ClearITPendingBit(EXTI_Line14);
  18.                 EXTI_ClearFlag(EXTI_Line14);
  19.                                 
  20.         }
  21.         if(EXTI_GetITStatus(EXTI_Line15) != RESET)//径电机零点
  22.         {         
  23.                 rt_event_send(&Intevent,(1 << 2));
  24.                 EXTI_ClearITPendingBit(EXTI_Line15);
  25.                 EXTI_ClearFlag(EXTI_Line15);
  26.         }

  27.         
  28.         rt_interrupt_leave();
  29. }



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检测,多谢各位
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

216

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部