OpenEdv-开源电子网

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

初学者 自己写的按键中断控制显示,按键后没反应,求看看

[复制链接]

2

主题

4

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2022-8-10
在线时间
5 小时
发表于 2022-10-16 14:58:31 | 显示全部楼层 |阅读模式
#include"exti.h"
#include"key.h"
#include"delay.h"
#include"directory.h"

Menu *Dir_index=&menu0;

void EXTIX_Init(void){
        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //②开启 AFIO 时钟
        //GPIOE.2 中断线以及中断初始化配置,下降沿触发 key2
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);//③
        EXTI_InitStructure.EXTI_Line=EXTI_Line2;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure); //④初始化中断线参数
       
        //GPIOE.3 中断线以及中断初始化配置,下降沿触发 key1
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
        EXTI_InitStructure.EXTI_Line=EXTI_Line3;
        EXTI_Init(&EXTI_InitStructure);
       
        //GPIOE.4 中断线以及中断初始化配置,下降沿触发 key0
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
        EXTI_InitStructure.EXTI_Line=EXTI_Line4;
        EXTI_Init(&EXTI_InitStructure);
       
        //GPIOA.0 中断线以及中断初始化配置,上升沿触发 key_up
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
        EXTI_InitStructure.EXTI_Line=EXTI_Line0;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
        EXTI_Init(&EXTI_InitStructure);
       
        //中断线2 抢占优先级2 子优先级2
        NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能按键外部中断通道
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 2,
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级 2
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
        NVIC_Init(&NVIC_InitStructure);//⑤初始化 NVIC
       
                //中断线3 抢占优先级2 子优先级1
        NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //使能按键外部中断通道
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 2,
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级 1
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
        NVIC_Init(&NVIC_InitStructure);//⑤初始化 NVIC
       
       
                //中断线4 抢占优先级2 子优先级0
        NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能按键外部中断通道
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 2,
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级 0
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
        NVIC_Init(&NVIC_InitStructure);//⑤初始化 NVIC
       
       
                //中断线0 抢占优先级2 子优先级3
        NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按键外部中断通道
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 2,
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //子优先级 4
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
        NVIC_Init(&NVIC_InitStructure);//⑤初始化 NVIC
       
}


//key_up
void EXTI0_IRQHandler(void){
        delay_ms(100); //消抖
        if(WKUP_PRES==1) //按键 KEY2
                {
                        if((Dir_index->up)!=NULL){
                                Dir_index=Dir_index->up;
                        }
                        display(Dir_index);
                }
        EXTI_ClearITPendingBit(EXTI_Line2); //清除 LINE2 上的中断标志位
}

//key2
void EXTI2_IRQHandler(void){
        delay_ms(100); //消抖
        if(KEY2==0) //按键 KEY2
                {
                        if((Dir_index->pre)!=NULL){
                                Dir_index=Dir_index->pre;
                        }
                        display(Dir_index);
                }
        EXTI_ClearITPendingBit(EXTI_Line2); //清除 LINE2 上的中断标志位
}

//key1
void EXTI3_IRQHandler(void){
        delay_ms(100); //消抖
        if(KEY1==0) //按键 KEY1
                {
                        if((Dir_index->down)!=NULL){
                                Dir_index=Dir_index->down;
                        }
                        display(Dir_index);
                }
        EXTI_ClearITPendingBit(EXTI_Line2); //清除 LINE2 上的中断标志位
}
//key0
void EXTI4_IRQHandler(void){
        delay_ms(100); //消抖
        if(KEY0==0) //按键 KEY0
                {
                        if((Dir_index->next)!=NULL){
                                Dir_index=Dir_index->next;
                        }
                        display(Dir_index);
                }
        EXTI_ClearITPendingBit(EXTI_Line2); //清除 LINE2 上的中断标志位
}


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

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3369
金钱
3369
注册时间
2011-11-10
在线时间
207 小时
发表于 2022-10-17 11:06:17 | 显示全部楼层
打印跟踪一下啊,看看有没有进入中断才好判断问题出在哪里
回复 支持 反对

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2022-8-10
在线时间
5 小时
 楼主| 发表于 2022-10-19 11:34:23 | 显示全部楼层
c2007s 发表于 2022-10-17 11:06
打印跟踪一下啊,看看有没有进入中断才好判断问题出在哪里

谢谢 解决了没看论坛
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-16 11:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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