OpenEdv-开源电子网

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

外部中断问题

[复制链接]

6

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2020-7-14
在线时间
19 小时
发表于 2020-7-20 21:14:31 | 显示全部楼层 |阅读模式
关于外部中断的问题,请大佬指教一下。
void EXTIX_Init(void)
{
        EXTI_InitTypeDef EXTI_InitSturcture;
        NVIC_InitTypeDef NVIC_InitSturcture;
        KEY_Init();//°´¼ü³õʼ»¯
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//¿ªÆôAFIOʱÖÓ
        //GPIOE.2ÖжÏÏßÒÔ¼°Öжϳõʼ»¯ÅäÖã¬Ï½µÑØ´¥·¢
//ÉèÖÃÖжÏÏß2       
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);//3
        EXTI_InitSturcture.EXTI_Line=EXTI_Line2;//ÉèÖÃÖжÏÏßΪÏß2
        EXTI_InitSturcture.EXTI_Mode=EXTI_Mode_Interrupt;//ÉèÖô¥·¢Ä£Ê½ÎªÖжÏ
        EXTI_InitSturcture.EXTI_Trigger=EXTI_Trigger_Falling;//ϽµÑØ´¥·¢
        EXTI_InitSturcture.EXTI_LineCmd=ENABLE;//ʹÄÜÖжÏÏß
        EXTI_Init(&EXTI_InitSturcture);//³õʼ»¯ÖжÏÏß²ÎÊý
       
        NVIC_InitSturcture.NVIC_IRQChannel=EXTI2_IRQn;//ʹÄܰ´¼üÍⲿÖжÏͨµÀ
        NVIC_InitSturcture.NVIC_IRQChannelCmd=0;//ÇÀÕ¼ÓÅÏȼ¶Îª0
        NVIC_InitSturcture.NVIC_IRQChannelPreemptionPriority=1;//ÇÀÕ¼×ÓÓÅÏȼ¶Îª2
        NVIC_InitSturcture.NVIC_IRQChannelSubPriority=ENABLE;//ʹÄÜÍⲿÖжÏͨµÀ
        NVIC_Init(&NVIC_InitSturcture);//³õʼ»¯NVIC
//ÉèÖÃÖжÏÏß3
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);//3
        EXTI_InitSturcture.EXTI_Line=EXTI_Line3;//ÉèÖÃÖжÏÏßΪÏß2
        EXTI_InitSturcture.EXTI_Mode=EXTI_Mode_Interrupt;//ÉèÖô¥·¢Ä£Ê½ÎªÖжÏ
        EXTI_InitSturcture.EXTI_Trigger=EXTI_Trigger_Falling;//ϽµÑØ´¥·¢
        EXTI_InitSturcture.EXTI_LineCmd=ENABLE;//ʹÄÜÖжÏÏß
        EXTI_Init(&EXTI_InitSturcture);//³õʼ»¯ÖжÏÏß²ÎÊý
       
        NVIC_InitSturcture.NVIC_IRQChannel=EXTI3_IRQn;//ʹÄܰ´¼üÍⲿÖжÏͨµÀ
        NVIC_InitSturcture.NVIC_IRQChannelCmd=1;//ÇÀÕ¼ÓÅÏȼ¶Îª1
        NVIC_InitSturcture.NVIC_IRQChannelPreemptionPriority=0;//ÇÀÕ¼×ÓÓÅÏȼ¶Îª2
        NVIC_InitSturcture.NVIC_IRQChannelSubPriority=ENABLE;//ʹÄÜÍⲿÖжÏͨµÀ
        NVIC_Init(&NVIC_InitSturcture);//³õʼ»¯NVIC
//ÉèÖÃÖжÏÏß4
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);//3
        EXTI_InitSturcture.EXTI_Line=EXTI_Line4;//ÉèÖÃÖжÏÏßΪÏß2
        EXTI_InitSturcture.EXTI_Mode=EXTI_Mode_Interrupt;//ÉèÖô¥·¢Ä£Ê½ÎªÖжÏ
        EXTI_InitSturcture.EXTI_Trigger=EXTI_Trigger_Falling;//ϽµÑØ´¥·¢
        EXTI_InitSturcture.EXTI_LineCmd=ENABLE;//ʹÄÜÖжÏÏß
        EXTI_Init(&EXTI_InitSturcture);//³õʼ»¯ÖжÏÏß²ÎÊý
       
        NVIC_InitSturcture.NVIC_IRQChannel=EXTI4_IRQn;//ʹÄܰ´¼üÍⲿÖжÏͨµÀ
        NVIC_InitSturcture.NVIC_IRQChannelCmd=2;//ÇÀÕ¼ÓÅÏȼ¶Îª2
        NVIC_InitSturcture.NVIC_IRQChannelPreemptionPriority=0;//ÇÀÕ¼×ÓÓÅÏȼ¶Îª2
        NVIC_InitSturcture.NVIC_IRQChannelSubPriority=ENABLE;//ʹÄÜÍⲿÖжÏͨµÀ
        NVIC_Init(&NVIC_InitSturcture);//³õʼ»¯NVIC
//ÉèÖÃÖжÏÏß0
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//3
        EXTI_InitSturcture.EXTI_Line=EXTI_Line0;//ÉèÖÃÖжÏÏßΪÏß0
        EXTI_InitSturcture.EXTI_Mode=EXTI_Mode_Interrupt;//ÉèÖô¥·¢Ä£Ê½ÎªÖжÏ
        EXTI_InitSturcture.EXTI_Trigger=EXTI_Trigger_Rising;//ÉÏÉýÑØ´¥·¢
        EXTI_InitSturcture.EXTI_LineCmd=ENABLE;//ʹÄÜÖжÏÏß
        EXTI_Init(&EXTI_InitSturcture);//³õʼ»¯ÖжÏÏß²ÎÊý
       
        NVIC_InitSturcture.NVIC_IRQChannel=EXTI0_IRQn;//ʹÄܰ´¼üÍⲿÖжÏͨµÀ
        NVIC_InitSturcture.NVIC_IRQChannelCmd=3;//ÇÀÕ¼ÓÅÏȼ¶Îª3
        NVIC_InitSturcture.NVIC_IRQChannelPreemptionPriority=0;//ÇÀÕ¼×ÓÓÅÏȼ¶Îª2
        NVIC_InitSturcture.NVIC_IRQChannelSubPriority=ENABLE;//ʹÄÜÍⲿÖжÏͨµÀ
        NVIC_Init(&NVIC_InitSturcture);//³õʼ»¯NVIC
}

void EXTI2_IRQHandler(void)
{
        delay_ms(20);
        if (KEY2==0)
        {
                LED0 = !LED0;
        }
        EXTI_ClearITPendingBit(EXTI_Line2);//Çå³ýLINE2ÉϵÄÖжϱê־λ
       
}

void EXTI3_IRQHandler(void)
{
        delay_ms(20);
        if(KEY1 == 0)
        {
                LED1 = !LED1;
        }
        EXTI_ClearITPendingBit(EXTI_Line3);
}

void EXTI4_IRQHandler(void)
{
        delay_ms(20);
        if(KEY0 == 0)
        {
                LED0 = !LED0;
                LED1 = !LED1;
        }
        EXTI_ClearITPendingBit(EXTI_Line4);
}

void EXTI0_IRQHandler(void)
{
        delay_ms(20);
        if(WK_UP == 1)
        {
                 BEEP = !BEEP;
        }
        EXTI_ClearITPendingBit(EXTI_Line0);
}
这里我设置了抢占优先级分别为0,1,2,3.按视频讲解的优先级顺序应该是KEY2>KEY1>KEY0>WK_UP。但是为什么实验的时候,KEY2的按键没有作用呢?
更改优先级后还是总有一个按键无法作用其相应功能。求分析。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 13:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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