OpenEdv-开源电子网

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

战舰进行外部中断实验,设置了4个按键的外部中断,KEY2按键按一次有时会出现多次中断

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2023-6-2
在线时间
0 小时
发表于 2023-6-2 16:16:04 | 显示全部楼层 |阅读模式
战舰进行外部中断实验,设置了4个按键的外部中断,KEY2按键按一次有时会出现多次中断,做了10ms的防抖,其余按键无此情况。

#include <exit.h>
#include <sys.h>
#include "usart.h"
#include "led.h"
#include "key.h"
#include <delay.h>
#include <usart.h>

void Exit_Init(void)
{
        EXTI_InitTypeDef EXTI_InitStructEXIT;
        NVIC_InitTypeDef NVIC_InitType;
       
        KEY_Init();
               
        //&#202;&#185;&#196;&#220;&#184;&#180;&#211;&#195;&#185;&#166;&#196;&#220;&#202;±&#214;&#211;       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
       
        //GPIOE.3          &#214;&#208;&#182;&#207;&#207;&#223;&#210;&#212;&#188;°&#214;&#208;&#182;&#207;&#179;&#245;&#202;&#188;&#187;&#175;&#197;&#228;&#214;&#195; &#207;&#194;&#189;&#181;&#209;&#216;&#180;&#165;·&#162; //KEY1
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
        EXTI_InitStructEXIT.EXTI_Line=EXTI_Line3;
        EXTI_InitStructEXIT.EXTI_LineCmd=ENABLE;
        EXTI_InitStructEXIT.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStructEXIT.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_Init(&EXTI_InitStructEXIT);
       
        //GPIOE.2          &#214;&#208;&#182;&#207;&#207;&#223;&#210;&#212;&#188;°&#214;&#208;&#182;&#207;&#179;&#245;&#202;&#188;&#187;&#175;&#197;&#228;&#214;&#195; &#207;&#194;&#189;&#181;&#209;&#216;&#180;&#165;·&#162; //KEY2
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
        EXTI_InitStructEXIT.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStructEXIT.EXTI_LineCmd=ENABLE;
        EXTI_InitStructEXIT.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructEXIT.EXTI_Line=EXTI_Line2;
        EXTI_Init(&EXTI_InitStructEXIT);
       
        //GPIOE.4          &#214;&#208;&#182;&#207;&#207;&#223;&#210;&#212;&#188;°&#214;&#208;&#182;&#207;&#179;&#245;&#202;&#188;&#187;&#175;&#197;&#228;&#214;&#195; &#207;&#194;&#189;&#181;&#209;&#216;&#180;&#165;·&#162; //KEY0
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
        EXTI_InitStructEXIT.EXTI_Line=EXTI_Line4;
        EXTI_Init(&EXTI_InitStructEXIT);
       
        //GPIOA.0  &#214;&#208;&#182;&#207;&#207;&#223;&#210;&#212;&#188;°&#214;&#208;&#182;&#207;&#179;&#245;&#202;&#188;&#187;&#175;&#197;&#228;&#214;&#195; &#207;&#194;&#189;&#181;&#209;&#216;&#180;&#165;·&#162; //WK_UP
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
        EXTI_InitStructEXIT.EXTI_Line=EXTI_Line0;
        EXTI_InitStructEXIT.EXTI_Trigger=EXTI_Trigger_Rising;
        EXTI_Init(&EXTI_InitStructEXIT);

        //key0 &#214;&#208;&#182;&#207; 2&#163;&#172;0
        NVIC_InitType.NVIC_IRQChannel=EXTI4_IRQn;
        NVIC_InitType.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitType.NVIC_IRQChannelPreemptionPriority=2;
        NVIC_InitType.NVIC_IRQChannelSubPriority=0;
        NVIC_Init(&NVIC_InitType);
       
        //key1 &#214;&#208;&#182;&#207; 2&#163;&#172;1
        NVIC_InitType.NVIC_IRQChannel=EXTI3_IRQn;
        NVIC_InitType.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitType.NVIC_IRQChannelPreemptionPriority=2;
        NVIC_InitType.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&NVIC_InitType);
               
        //key2 &#214;&#208;&#182;&#207; 2&#163;&#172;2
        NVIC_InitType.NVIC_IRQChannel=EXTI2_IRQn;
        NVIC_InitType.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitType.NVIC_IRQChannelPreemptionPriority=3;
        NVIC_InitType.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&NVIC_InitType);
       
        //wk_up &#214;&#208;&#182;&#207; 3&#163;&#172;0
        NVIC_InitType.NVIC_IRQChannel=EXTI0_IRQn;
        NVIC_InitType.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitType.NVIC_IRQChannelPreemptionPriority=3;
        NVIC_InitType.NVIC_IRQChannelSubPriority=0;
        NVIC_Init(&NVIC_InitType);
       
       
}

void EXTI3_IRQHandler(void)
{
        delay_ms(10);
        if(KEY1==0)
                {
                        LED1=!LED1;
                        printf("key1\r\n");
                }
        EXTI_ClearITPendingBit(EXTI_Line3);
}

void EXTI2_IRQHandler(void)
{
        delay_ms(10);
        if(KEY2==0)
                {
                        LED0=!LED0;
                        printf("key2\r\n");
                }
        EXTI_ClearITPendingBit(EXTI_Line2);
}

void EXTI4_IRQHandler(void)
{
        delay_ms(10);
        if(KEY0==0)
                {
                        LED0=!LED0;
                        LED1=!LED1;
                        printf("key0\r\n");
                }
        EXTI_ClearITPendingBit(EXTI_Line4);
}

void EXTI0_IRQHandler(void)
{
        delay_ms(10);
        if(WK_UP==1)
                {
                        LED0=!LED0;
                        LED1=!LED1;
                        printf("WK_UP\r\n");
                }
        EXTI_ClearITPendingBit(EXTI_Line0);
}



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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 06:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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