STM8L两个IO口共用一个中断处理函数时出现混乱

2019-07-14 15:23发布

这个是按键初始化的函数:
#include "KEY.h"
/*按键初始化*/
void KEY_Init(void)
{
    GPIO_Init(KEY1_PORT, KEY1|KEY2|KEY3|KEY4|KEY5, GPIO_Mode_In_PU_IT);  //中断方式
   GPIO_Init(KEY5_PORT, KEY5, GPIO_Mode_In_PU_IT);  //中断方式
   EXti_SetPinSensitivity(EXTI_Pin_2|EXTI_Pin_3|EXTI_Pin_4|EXTI_Pin_5, EXTI_Trigger_Falling_Low );   //配置外部中断触发方式
}
bool KEY_Down(GPIO_TypeDef* GPIOx,GPIO_Pin_TypeDef  GPIO_Pin)
{                        
     /*检测是否有按键按下 */
     if( GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == 0 )
     {           
         delay_ms(5);   // 延时消抖        
         if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==0)  
         {         
             while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==0);   //等待按键释放
            return true; //如果有键盘按下,就返回真值,否则返回假值
        }
     }
     return false;
}
下面是中断2线的处理函数:
INTERRUPT_HANDLER(EXTI2_IRQHandler,10)
{
     /* In order to detect unexpected events during development,
        it is recommended to set a breakpoint on the following instruction.
     */
   if(KEY_Down(GPIOA,KEY1) == 0 )
     {
       GPIO_ToggleBits(GPIOC, GPIO_Pin_5);//LED1
       printf ("01. ");

       EXTI_ClearITPendingBit(EXTI_IT_Pin2); //清除中断。
    }

   if(KEY_Down(GPIOD,KEY5) == 0 )
     {
       GPIO_ToggleBits(GPIOD, GPIO_Pin_4);//LED5
       printf ("05. ");

       EXTI_ClearITPendingBit(EXTI_IT_Pin2); //清除中断。
    }
}
现在发现的现象是:当KEY1键按下时,LED1状态有时翻转,有时不翻转。当KEY5按键按下时,LED1状态翻转。还是没有找到问题所在,求好心人解答下,感谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
76r456546
1楼-- · 2019-07-14 22:58
进入中断后可以判断io口的标志位就知道是哪个了
hongqiaolian
2楼-- · 2019-07-15 01:57
 精彩回答 2  元偷偷看……
hucc
3楼-- · 2019-07-15 05:35
通过中断标志判断是哪个GPIO产生中断
hongqiaolian
4楼-- · 2019-07-15 08:30
STM8没有中断标志位
hucc
5楼-- · 2019-07-15 14:05
怎么可能呢,我还没有发现没有的
hongqiaolian
6楼-- · 2019-07-15 18:57
据我了解到的,我是共用中断2线函数的,有Externalinterruptstatusregister1(EXTI_SR1)这个寄存器。但是这只能判断是哪个中断线发生中断,没有具体到哪个IO口。如果有些东西是我没了解到的,请指教,感谢!

一周热门 更多>