STM32的外部按键中断问题
各位大虾好,在我的工程里需要串口通信和按键中断。具体是这样,有两个按键,每个按键被按下时进入中断服务子程序,再按一下退出,相当于模式切换。但是最近几天遇到了问题:当按键第一次被按下时,此时可以进入中断服务子程序;当按键再次被按下时,有时却不能回到主程序,主程序里只有一个主函数。望各位大虾能够指点指点,不胜感激。
优先级设置是:
抢占 响应
串口 2 0
定时器 1 0
按键1 0 0
按键2 0 1
代码如下:
主函数中是:
main()
{
。。。。。初始化
while(1)
{
function1();
}
}
以下是两个中断服务子程序。
void EXTI9_5_IRQHandler(void) //function1和function2模式切换
{
// int flag1=1;
int flag1=0;
if(EXTI_GetITStatus(EXTI_Line5) != RESET) //确保是否产生了EXTI Line中断
{
delayms(200); //延时消抖
if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5) == 0)
{
while(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5) == 0); //等待按键释放
//GPIO_WriteBit(GPIOB, GPIO_Pin_0, 0);
GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);
flag1=1;
}
}
while(flag1)
{
//if(!GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_0)) function2();
function2();
if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5) == 0 ) //检测一下按键是否按下
{
delayms(200);// 防止是脉冲干扰的影响
if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5) == 0 )
{
while(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5) == 0); //等待按键释放
flag1=0;
}
}
}
// }
GPIO_WriteBit(GPIOB, GPIO_Pin_0,Bit_SET);
EXTI_ClearITPendingBit(EXTI_Line5); //清除中断标志位
}
void EXTI15_10_IRQHandler(void) //function1和function3模式切换
{
int flag2=1;
angle=After_filter[0];//记录当前要保持的角度
if(EXTI_GetITStatus(EXTI_Line11) != RESET) //确保是否产生了EXTI Line中断
{
delayms(200); //延时消抖
if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_11) == 0)
{
// GPIO_WriteBit(GPIOB, GPIO_Pin_1, (BitAction)((1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_1))));//LED1反转
while(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_11) == 0); //等待按键释放
GPIO_WriteBit(GPIOB, GPIO_Pin_1, Bit_RESET);
}
while(flag2)
{
if(!GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_1)) function3();
if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_11) == 0 ) //检测一下按键是否按下
{
delayms(200);// 防止是脉冲干扰的影响
if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_11) == 0 )
{
while(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_11) == 0); //等待按键释放
flag2=0;
}
}
}
}
GPIO_WriteBit(GPIOB, GPIO_Pin_1,Bit_SET);
EXTI_ClearITPendingBit(EXTI_Line11); //清除中断标志位
}