新手上路
- 积分
- 25
- 金钱
- 25
- 注册时间
- 2022-8-10
- 在线时间
- 5 小时
|
#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 上的中断标志位
}
|
|