你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32外中断多次触发

[复制链接]
ajleo 提问时间:2018-10-13 17:24 /
请问各位大佬一个外中断异常多次触发的问题
void EXTI4_IRQHandler()
{
static int x = 0;
delay_ms(10);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)==0)//判断按键是否按下
{                                                                                                      
  EXTI_ClearITPendingBit(EXTI_Line4);
  x++;
  GPIO_SetBits(GPIOF,GPIO_Pin_8);//设置蜂鸣器发声
  delay_ms(200);
  GPIO_ResetBits(GPIOF,GPIO_Pin_8);
  if(x > 1)
  {
   x = 0;
   GPIO_ResetBits(GPIOF,GPIO_Pin_9);//控制灯闪烁
   delay_ms(200);
  }
  GPIO_SetBits(GPIOF,GPIO_Pin_9);
}
}
可是把if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)==0)//判断按键是否按下
换成
if(EXTI_GetITStatus(EXTI_Line4)!=RESET)//判断某个线上的中断是否发生
就会判断出不定时触发了两次,当按键设置成下降沿触发时
EXTI_InitStruct.EXTI_Line = EXTI_Line4;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;

EXTI_Init(&EXTI_InitStruct);

收藏 评论9 发布时间:2018-10-13 17:24

举报

9个回答
小耳朵1500922649 回答时间:2018-10-13 17:46:59
中断耗时太久啦,不要再中断里delay

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

ajleo 回答时间:2018-10-13 18:50:33
小耳朵1500922649 发表于 2018-10-13 17:46
中断耗时太久啦,不要再中断里delay

改了,不是延时的问题
wenyangzeng 回答时间:2018-10-13 19:31:14
1、中断函数里放入延时尤其是SysTick延时很容易出现预料不到的冲突的。
2、楼主在进入中断函数后并未立即清中断标志位,而是先来给10ms延时,你可知道在这延时期间按键的抖动已经又触发了多少次外部中断了?

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

ajleo 回答时间:2018-10-13 19:38:46
wenyangzeng 发表于 2018-10-13 19:31
1、中断函数里放入延时尤其是SysTick延时很容易出现预料不到的冲突的。
2、楼主在进入中断函数后并未立即清 ...

那按键检测的最佳写法应是怎样?还请大佬们明示
wenyangzeng 回答时间:2018-10-13 22:05:55
ajleo 发表于 2018-10-13 19:38
那按键检测的最佳写法应是怎样?还请大佬们明示

1、清中断标志位
2、禁止EXTI中断
3、点亮LED
4、使能EXTI中断

熄灭LED放在定时中断里执行。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

花落成尘眼泪 回答时间:2018-10-14 16:00:20
我也是有点懵逼了
ajleo 回答时间:2018-10-14 17:18:16
wenyangzeng 发表于 2018-10-13 22:05
1、清中断标志位
2、禁止EXTI中断
3、点亮LED

谢谢大佬,也就是说中断里只放标志位了
七哥 回答时间:2018-10-14 21:21:55
本帖最后由 toofree 于 2018-10-14 21:37 编辑

检测按键,可以用定时扫描的方法。
给你个鼠标按键按下、弹起,上下双沿检测程序,单次响应,逻辑稍微复杂一点。一般用的都比这简单。
  1. typedef struct
  2. {
  3.     unsigned LDOWN  :6;
  4.     unsigned LDEN   :1;
  5.     unsigned LDOWN7 :1;
  6.     unsigned LUP    :6;
  7.     unsigned LUEN   :1;
  8.     unsigned LUP7   :1;
  9.     unsigned RDOWN  :6;
  10.     unsigned RDEN   :1;
  11.     unsigned RDOWN7 :1;
  12.     unsigned RUP    :6;
  13.     unsigned RUEN   :1;
  14.     unsigned RUP7   :1;
  15. }Mouse_Key;

  16. extern Mouse_Key MsKey;
复制代码
  1. void Button_Process(void)
  2. {
  3.     if(BUTTON_IsPressed(PS2_BUTTON_LEFT) == true)
  4.     {
  5.         LED_On(LED_D3);
  6.         if (MsKey.LDEN == 1)
  7.         {
  8.             if (MsKey.LDOWN >= 5)
  9.             {
  10.                 MsKey.LDOWN7 = 1;
  11.                 MsKey.LDEN = 0;
  12.                 MsKey.LUEN = 1;
  13.             }
  14.             else
  15.             {
  16.                 MsKey.LDOWN++;
  17.             }
  18.         }

  19.         MsKey.LUP = 0;
  20.     }
  21.     else
  22.     {
  23.         LED_Off(LED_D3);
  24.         MsKey.LDOWN = 0;

  25.         if (MsKey.LUEN == 1)
  26.         {
  27.             if (MsKey.LUP >= 5)
  28.             {
  29.                 MsKey.LUP7 = 1;
  30.                 MsKey.LUEN = 0;
  31.                 MsKey.LDEN = 1;
  32.             }
  33.             else
  34.             {
  35.                 MsKey.LUP++;
  36.             }
  37.         }
  38.     }
  39.     if(BUTTON_IsPressed(PS2_BUTTON_RIGHT) == true)
  40.     {
  41.         LED_On(LED_D4);
  42.         if (MsKey.RDEN == 1)
  43.         {
  44.             if (MsKey.RDOWN >= 5)
  45.             {
  46.                 MsKey.RDOWN7 = 1;
  47.                 MsKey.RDEN = 0;
  48.                 MsKey.RUEN = 1;
  49.             }
  50.             else
  51.             {
  52.                 MsKey.RDOWN++;
  53.             }
  54.         }

  55.         MsKey.RUP = 0;
  56.     }
  57.     else
  58.     {
  59.         LED_Off(LED_D4);
  60.         MsKey.RDOWN = 0;

  61.         if (MsKey.RUEN == 1)
  62.         {
  63.             if (MsKey.RUP >= 5)
  64.             {
  65.                 MsKey.RUP7 = 1;
  66.                 MsKey.RUEN = 0;
  67.                 MsKey.RDEN = 1;
  68.             }
  69.             else
  70.             {
  71.                 MsKey.RUP++;
  72.             }
  73.         }
  74.     }
  75. }
复制代码

MsKey.LDOWN7,MsKey.LUP7,MsKey.RDOWN7, MsKey.RUP7,4个标志位在主程序中处理完才清除。


评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

feixiang20 回答时间:2018-10-14 22:48:52
中断里放标志位只能暂时看看作用,有时硬件冲突和浮空模式IO灵敏过头也会引起无常中断的

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版