OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5854|回复: 3

急急!!按一次按键KEY0, 为什么会多次进入中断

[复制链接]

2

主题

3

帖子

0

精华

新手入门

积分
31
金钱
31
注册时间
2013-6-29
在线时间
0 小时
发表于 2013-7-6 01:03:42 | 显示全部楼层 |阅读模式

// 初始化外部中断
void InitExti()
{
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    // RCC使能端口时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 复用IO 时钟
    // 中断线设置(GPIO 寄存器)
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4); // KEY0 中断线4

    // 初始化
    EXTI_InitStructure.EXTI_Line = EXTI_Line4;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
    
    // 中断向量控制器
    NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
 
}

/*按一次按键KEY0,为什么会多次进入中断*/
void EXTI4_IRQHandler(void)
{
    u8 ReadValue=2; 
    DelayMs(3000);
    ReadValue = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4);
    LedLight(!ReadValue);
    USART_SendData(USART1, ReadValue);
    EXTI_ClearITPendingBit(EXTI_Line4);
}

Test.rar

249.08 KB, 下载次数: 261

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

119

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-4-6
在线时间
3 小时
发表于 2013-7-6 09:40:52 | 显示全部楼层
void EXTI4_IRQHandler(void)
{
    u8 ReadValue=2; 
    DelayMs(3000);
    ReadValue = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4);
    LedLight(!ReadValue);
    USART_SendData(USART1, ReadValue);
    EXTI_ClearITPendingBit(EXTI_Line4);
}


你在中断里头延迟了这么久... 3000ms  .    中断最后你才清除中断旗标允许再次中断.     照理中间不会因为
按键在压下及放开瞬间产生的弹跳杂讯问题.   但你却发生了...     一般按键弹跳周期应该在10ms以内.

但你已经延迟了3000ms,  却又碰到类似弹跳引起多次进入中断...     合理怀疑你那 DelayMs(3000)

没有真正延迟3秒钟.     再查看看吧 .
回复 支持 反对

使用道具 举报

2

主题

3

帖子

0

精华

新手入门

积分
31
金钱
31
注册时间
2013-6-29
在线时间
0 小时
 楼主| 发表于 2013-7-6 13:52:44 | 显示全部楼层
延时现在已经改为直接使用板子自带的延时函数了 delay_ms(10);
情况还是一样.

void EXTI4_IRQHandler(void)
{
    u8 ReadValue=2; 
    delay_ms(10);
    ReadValue = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4);
    if(ReadValue==0)
    {
       USART_SendData(USART1, ReadValue);  // ???一直发送 0x00
    }
    LedLight(ReadValue);

    EXTI_ClearITPendingBit(EXTI_Line4);  
}

Test.rar

244.62 KB, 下载次数: 263

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-6 14:33:59 | 显示全部楼层
用的我们的战舰板么?
我们战舰板不是有参考例程么?
你的PE4作为按键输入,设置了浮空输入,你知道浮空输入的意思吧?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-18 06:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表