微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STM32F415外部中断触发过后,主函数不再运行,但触发功能正常

STM32F415外部中断触发过后,主函数不再运行,但触发功能正常

时间:10-02 整理:3721RD 点击:
程序没有卡在中断里面,触发函数运行没问题,但触发过后,main中的函数就是不运行了
主函数如下:

  1. int main(void)
  2. {
  3.         /* LED 端口初始化 */
  4.         LED_GPIO_Config();
  5.         delay_init(168);       
  6. //        key_config();
  7.         EXTIX_Init();


  8.         /* 控制LED灯 */
  9.         while (1)
  10.         {
  11. //                if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 1)
  12.                         LED1( OFF );                         // 亮
  13.                 delay_ms(200);
  14. //                if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0)
  15.                         LED1( ON );                  // 灭
  16.                 delay_ms(200);

  17. //                LED3( ON );                         // 亮
  18. //                Delay(0xFFFF);
  19. //                LED3( OFF );                  // 灭       
  20. //               
  21. //                LED4( ON );                         // 亮
  22. //                Delay(0xFFFFFF);
  23. //                LED4( OFF );                  // 灭       
  24.         }
  25. }

复制代码

中断函数:

  1. void EXTI0_IRQHandler(void)
  2. {
  3.         static u8 a = 0;
  4.         u32 b = 0;
  5.                 //消抖
  6.         while(b < 0xffff)//注释掉循环问题后正常
  7.         {
  8.                 b = 0;
  9.                 while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0) == 0)         
  10.                 {
  11.                         b++;
  12. //                        delay_ms(1);
  13.                 }
  14.         }
  15.         a = !a;
  16.         GPIO_WriteBit(GPIOA, GPIO_Pin_10, a); //蜂鸣器翻转        
  17.         EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位
  18. }

复制代码

但是这句:while(b < 0xffff)//注释掉循环问题后正常
有大神能解答么,多谢

你还有一句B = 0呢?反复清零,什么时候能达到退出?既然主函数不运行,说明有人霸占了CPU的使用权,你想想

变量b是个U32的变量,他满足这个条件while(b < 0xffff),会一直执行,一直霸占,只要小于65535,这是个死循环,你为什么这么用呢?中断我从没用过死循环,中断的机制你可能没搞懂,不能这么用

一直按住按键b会自增啊,超过后就推出while了,处理防抖的一种方式,这个中断本身是没问题的,控制引脚A10上的LED开关都正常

就不能用普通的延时函数吗?非要要这样的方式去延时消抖?

呵呵,自己的程序要好好检查

我只看到功能是正常的,你说的有道理,我再试试

非常感谢你的指点,多谢

不过:
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0) == 0)        //消抖
        {
                delay_ms(20);
                if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0) == 0)a = !a;
        }
这种消抖经常错误触发啊,有什么更好的消抖方法么

if(...)
{
delay();
if(...)
{
//you code
}
}

额,这跟我发的貌似没什么区别……

加一下延时看看,试一试吧。

好的,谢谢你的回答

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top