二.如何通过按键key打开外部中断2018-05-13
2018-05-13 本文已影响0人
想阳
二.如何通过按键key打开外部中断
注:自己的Key1对应PE3 LED1对应PB5,我需要按下key1就打开LED1,再按就关闭LED1,以此类推
自己的Key2对应PE4 LED2对应PE5,我需要按下key2就打开LED2,再按就关闭LED2,以此类推
第一步.使得E端口的时钟,并且打开io的功能复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//将E端口的时钟打开,方便打开小灯
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开io的功能复用时钟
第二步.对E端口3,4管脚(Key1,Key2)进行初始化,对B端口管脚5和E端口管脚5(LED1,LED2)进行初始化
//对小灯的B端口的5管脚进行使能 以及对E端口的5管脚进行使能
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//初始B端口的五号引脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置时钟是50MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//时钟的输入输出类型 推挽输出模式
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_Init(GPIOE,&GPIO_InitStructure);
//对两个按键E端口的3管脚和4管脚进行设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置时钟是50MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_Init(GPIOE,&GPIO_InitStructure);
第三步.将PE3的管脚3和4管脚映射到外部中断线3和4
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
第四步.对外部中断线进行配置,并清除中断线3和4的标志位
EXTI_InitTypeDef EXIT_InitStructure;//定义变量
EXTI_ClearITPendingBit(EXTI_Line3);//清除中断线3的标志位
EXTI_ClearITPendingBit(EXTI_Line4);//清除中断线4的标志位
EXIT_InitStructure.EXTI_Line = EXTI_Line3 | EXTI_Line4;//将外部中断线第五个初始化
EXIT_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断
EXIT_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿中断
EXIT_InitStructure.EXTI_LineCmd=ENABLE;//使能
EXTI_Init(&EXIT_InitStructure);
第五步.对外部中断3和4的优先级进行设置
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
NVIC_InitTypeDef NVIC_InitStructure;
//2个KEY
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
第六步.外部中断函数的书写
void EXTI3_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line3) == SET)
{
//Delay_ms(5);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == Bit_RESET)//此时E3是低电位
{
if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5) == Bit_RESET)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);
}
else
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}
}
}
EXTI_ClearITPendingBit(EXTI_Line3);
}
void EXTI4_IRQHandler(void)
{
//Delay_ms(5);
if(EXTI_GetITStatus(EXTI_Line4) == SET)
{
if(GPIO_ReadOutputDataBit(GPIOE,GPIO_Pin_5) == Bit_RESET)
{
GPIO_SetBits(GPIOE,GPIO_Pin_5);
}
else
{
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
}
EXTI_ClearITPendingBit(EXTI_Line4);
}
}