打印
[STM8]

STM8L两个IO口共用一个中断处理函数,出现混乱,求教!

[复制链接]
2307|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ZZBZZBZZBZZB|  楼主 | 2018-12-5 08:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个是按键初始化的函数:
#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.\r\n");

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

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

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

}


现在发现的现象是:当KEY1键按下时,LED1状态有时翻转,有时不翻转。当KEY5按键按下时,LED1状态翻转。还是没有找到问题所在,求好心人解答下,感谢!
沙发
晓伍| | 2018-12-6 12:56 | 只看该作者
应该可以的 判断是哪个io口就可以啊

使用特权

评论回复
板凳
八层楼| | 2018-12-6 12:59 | 只看该作者
进入中断后可以判断io口的标志位就知道是哪个了

使用特权

评论回复
地板
观海| | 2018-12-6 13:03 | 只看该作者
楼上的正解

使用特权

评论回复
5
ZZBZZBZZBZZB|  楼主 | 2018-12-6 14:54 | 只看该作者
晓伍 发表于 2018-12-6 12:56
应该可以的 判断是哪个io口就可以啊

请问根据什么可以判断是那个IO口?

使用特权

评论回复
6
ZZBZZBZZBZZB|  楼主 | 2018-12-6 14:54 | 只看该作者
晓伍 发表于 2018-12-6 12:56
应该可以的 判断是哪个io口就可以啊

请问根据什么可以判断是那个IO口?

使用特权

评论回复
7
ayb_ice| | 2018-12-6 15:20 | 只看该作者
通过中断标志判断是哪个GPIO产生中断

使用特权

评论回复
8
ZZBZZBZZBZZB|  楼主 | 2018-12-6 17:19 | 只看该作者
ayb_ice 发表于 2018-12-6 15:20
通过中断标志判断是哪个GPIO产生中断

STM8没有中断标志位

使用特权

评论回复
9
ZZBZZBZZBZZB|  楼主 | 2018-12-6 17:19 | 只看该作者
八层楼 发表于 2018-12-6 12:59
进入中断后可以判断io口的标志位就知道是哪个了

STM8没有中断标志位

使用特权

评论回复
10
ayb_ice| | 2018-12-6 17:34 | 只看该作者
ZZBZZBZZBZZB 发表于 2018-12-6 17:19
STM8没有中断标志位

怎么可能呢,我还没有发现没有的

使用特权

评论回复
11
ZZBZZBZZBZZB|  楼主 | 2018-12-6 17:51 | 只看该作者
ayb_ice 发表于 2018-12-6 17:34
怎么可能呢,我还没有发现没有的

据我了解到的,我是共用中断2线函数的,有Externalinterruptstatusregister1(EXTI_SR1)这个寄存器。但是这只能判断是哪个中断线发生中断,没有具体到哪个IO口。如果有些东西是我没了解到的,请指教,感谢!

使用特权

评论回复
12
ayb_ice| | 2018-12-7 08:28 | 只看该作者
ZZBZZBZZBZZB 发表于 2018-12-6 17:51
据我了解到的,我是共用中断2线函数的,有Externalinterruptstatusregister1(EXTI_SR1)这个寄存器。但是 ...

去看相关的寄存器就明白了

使用特权

评论回复
13
晓伍| | 2018-12-7 13:57 | 只看该作者
ZZBZZBZZBZZB 发表于 2018-12-6 17:19
STM8没有中断标志位

那我就不知道了 我记得stm32是有的

使用特权

评论回复
14
caijie001| | 2018-12-8 08:44 | 只看该作者
判断一下io的按下电平

使用特权

评论回复
15
denike| | 2018-12-8 15:12 | 只看该作者
ZZBZZBZZBZZB 发表于 2018-12-6 17:51
据我了解到的,我是共用中断2线函数的,有Externalinterruptstatusregister1(EXTI_SR1)这个寄存器。但是 ...

判断2个IO引脚电平来处理

使用特权

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

本版积分规则

2

主题

12

帖子

0

粉丝